AWS プロダクション環境セットアップ手順書¶
概要¶
Terraform を使用して AWS 上に{プロジェクト名}のプロダクション環境を構築するための手順を説明します。
各ステップの設計意図・実装詳細・トラブルシューティングは ステージング環境セットアップ手順書 を参照してください。
| サービス | 略称 | コンテナイメージ | ポート | 説明 |
|---|---|---|---|---|
| {サービス名} | {略称} | {イメージ名} | {ポート} | {説明} |
アーキテクチャ¶
AWS サービス構成¶
| サービス | 用途 |
|---|---|
| Route 53 | DNS 管理・カスタムドメイン設定 |
| ECS (Fargate) | コンテナベースのアプリケーション実行(ALB 連携・パスベースルーティング) |
| ALB | ECS タスクへのトラフィック分散 |
| ECR | Docker イメージレジストリ |
| RDS ({DB エンジン}) | データベース |
| VPC | ネットワーク分離(パブリック / プライベートサブネット) |
| NAT Gateway | プライベートサブネットからのアウトバウンド通信 |
| Systems Manager | パラメータストア(DB 認証情報等) |
| CloudWatch Logs | ECS タスクのコンテナログ |
| S3 | Terraform 状態ファイル管理 |
| DynamoDB | Terraform 状態ロック |
| Resource Groups | Application Manager 用リソースグループ(タグベース) |
| AWS Backup | RDS スナップショットの自動取得 |
前提条件¶
- AWS アカウント(適切な IAM 権限)
- Terraform >= 1.0.0, < 2.0.0
- AWS CLI v2
- Docker Desktop(イメージビルド用)
- Git
補足: AWS CLI・Terraform のインストール、認証設定(aws-vault / IAM ユーザー)の詳細は ステージング環境セットアップ手順書 > インストール を参照してください。
ステージング環境との主な差異¶
| 項目 | ステージング | プロダクション |
|---|---|---|
| 環境名 | staging |
production |
| ディレクトリ | ops/terraform/live/stage/ |
ops/terraform/live/prod/ |
| ドメイン | stg.{ドメイン} |
{ドメイン} |
| DB 名 | {プロジェクト名}_staging |
{プロジェクト名}_production |
| DB インスタンス | {ステージング用インスタンス} |
要件に応じて選定 |
| 削除保護 | false |
true |
| 管理サーバー | 踏み台・その他 | 踏み台のみ |
Terraform ディレクトリ構成¶
ops/terraform/
├── live/
│ ├── global/
│ │ ├── variables/ # プロジェクト共通変数
│ │ ├── s3/ # Terraform 状態管理用 S3 バケット(共用)
│ │ └── iam/ # OIDC 認証用 IAM ロール
│ └── prod/
│ ├── ssm/
│ │ ├── paramstore/ # SSM パラメータストア
│ │ └── appmanager/ # Application Manager リソースグループ
│ ├── vpc/ # VPC・サブネット・NAT Gateway
│ ├── data-stores/
│ │ └── rds/ # RDS
│ ├── backup/ # AWS Backup (RDS)
│ ├── repository/
│ │ └── ecr/ # ECR リポジトリ(サービスごと)
│ ├── services/
│ │ └── ecs/ # ECS (Fargate + ALB)
│ └── variables/ # プロダクション変数
├── modules/ # ステージングと共有
│ ├── iam/
│ │ └── ecs/ # ECS タスクロール / タスク実行ロール
│ ├── networking/
│ │ └── vpc/ # VPC モジュール
│ ├── data-stores/
│ │ └── rds/ # RDS モジュール
│ ├── backup/ # AWS Backup モジュール
│ ├── repository/
│ │ └── ecr/ # ECR モジュール
│ └── services/
│ └── ecs/ # ECS モジュール(クラスター・ALB・サービス)
└── test/
補足:
modules/はステージング環境と共有します。環境固有の設定はlive/prod/variables/で管理します。
タスクランナーによる自動化¶
プロビジョニング・デプロイ・SSH 運用作業はタスクランナーで自動化されています。
| 変数 | 説明 | 例 |
|---|---|---|
PRD_AWS_PROFILE |
aws-vault で使用するプロファイル名 | {プロファイル名} |
# プロビジョニング
{全リソースプロビジョニングコマンド} # 全リソースを順番にプロビジョニング
{plan コマンド} # 全リソースの plan のみ実行
{ヘルプコマンド} # プロビジョニングヘルプ
# デプロイ
{ECS デプロイコマンド} # 全サービスの一括デプロイ(ビルド → プッシュ → ECS)
{ECS ステータスコマンド} # ECS サービス状態を確認
{デプロイヘルプコマンド} # デプロイヘルプ
# SSH・踏み台
{SSH トンネルコマンド} # RDS への SSH トンネル
{バックアップコマンド} # DB バックアップ
{SSH ヘルプコマンド} # SSH ヘルプ
1. プロビジョニング¶
プロビジョニングフロー¶
1.1 Terraform 状態管理用 S3 バケットの作成¶
ステージング環境で作成済みの S3 バケットを共用する場合はスキップしてください。
作業ディレクトリ: ops/terraform/live/global/s3
terraform init
terraform plan
terraform apply
1.2 GitHub Actions 用 IAM ロールの作成¶
作業ディレクトリ: ops/terraform/live/global/iam
詳細: ステージング環境セットアップ手順書 > IAM ロールの作成 を参照してください。
terraform init
terraform plan
terraform apply
1.3 SSM パラメータストアの設定¶
作業ディレクトリ: ops/terraform/live/prod/ssm/paramstore
secret.tfvarsファイルを作成します
db_username = "<DB ユーザー名>"
db_password = "<DB パスワード>"
重要:
secret.tfvarsは Git 管理外にしてください(.gitignoreに追加済み)。
- Terraform を実行します
terraform init --backend-config=backend.hcl
terraform plan --var-file=secret.tfvars
terraform apply --var-file=secret.tfvars
1.4 VPC の設定¶
作業ディレクトリ: ops/terraform/live/prod/vpc
terraform init --backend-config=backend.hcl
terraform plan
terraform apply
1.5 RDS の設定¶
作業ディレクトリ: ops/terraform/live/prod/data-stores/rds
terraform init --backend-config=backend.hcl
terraform plan
terraform apply
詳細: RDS 設定パラメータ、Blue/Green Deployment、パラメータグループの自動管理については ステージング環境セットアップ手順書 > RDS の設定 を参照してください。
1.6 AWS Backup (RDS)¶
作業ディレクトリ: ops/terraform/live/prod/backup
terraform init --backend-config=backend.hcl
terraform plan
terraform apply
詳細: バックアップポリシー(スケジュール・保持期間)、リストア手順については ステージング環境セットアップ手順書 > データバックアップ を参照してください。
1.7 ECR リポジトリの設定¶
各サービスの ECR リポジトリを作成します。
作業ディレクトリ: ops/terraform/live/prod/repository/ecr/{サービス名}
terraform init --backend-config=backend.hcl
terraform plan
terraform apply
各サービスのリポジトリごとに上記を繰り返します。
1.8 Docker イメージ ビルド & ECR プッシュ¶
ECR リポジトリ作成後、ECS でサービスを作成する前に、各サービスの Docker イメージをビルドして ECR にプッシュします。
# タスクランナー(推奨)
{ビルドコマンド} # 全サービスを一括でビルド
{プッシュコマンド} # 全サービスを一括で ECR にプッシュ
詳細: 手動でのビルド & プッシュ手順は ステージング環境セットアップ手順書 > Docker イメージ ビルド & ECR プッシュ を参照してください。
1.9 ECS の設定¶
作業ディレクトリ: ops/terraform/live/prod/services/ecs
terraform init --backend-config=backend.hcl
terraform plan
terraform apply
詳細: ECS の全体構成(ALB パスベースルーティング、セキュリティグループ、タスク定義、環境変数)については ステージング環境セットアップ手順書 > ECS の設定 を参照してください。
1.9.1 ECS デプロイ手順¶
ECS デプロイでは、ECR にプッシュ済みの最新イメージを使用してローリングデプロイを実行します。
# タスクランナー(推奨)
{ECS 全サービスデプロイコマンド} # 全サービス: ビルド → プッシュ → ECS デプロイ
{ECS デプロイのみコマンド} # デプロイのみ(イメージ更新後)
{ECS ステータスコマンド} # ECS サービス状態
1.10 Application Manager(リソースグループ)¶
タグベースのリソースグループを作成し、プロダクション環境の全リソースを一元管理します。
作業ディレクトリ: ops/terraform/live/prod/ssm/appmanager
terraform init --backend-config=backend.hcl
terraform plan
terraform apply
確認手順¶
- AWS コンソール → Systems Manager → Application Manager でリソースグループが表示されることを確認
- リソースグループ内に VPC、RDS、ECS、ECR 等のリソースが含まれていることを確認
補足: Application Manager はリソースのグルーピングのみを行います。全リソースの作成後(ECS セットアップ後)に実行してください。
1.11 EC2 キーペアの作成(踏み台サーバー用・任意)¶
踏み台サーバーを使用する場合のみ実行します。
aws ec2 create-key-pair \
--key-name {キーペア名} \
--key-type rsa \
--region {リージョン} \
--query "KeyMaterial" \
--output text > {キーペア名}.pem
重要: 秘密鍵ファイル(
.pem)は再ダウンロードできません。安全な場所に保管してください。
1.12 踏み台サーバーのセットアップ(任意)¶
RDS への直接接続・バックアップが必要な場合のみ実行します。
作業ディレクトリ: ops/terraform/live/mgmt/prod/bastion
secret.tfvarsファイルを作成します
vpc_id = "<プロダクション VPC の ID>"
subnet_ids = ["<パブリックサブネット 1>", "<パブリックサブネット 2>"]
postgres_config = {
address = "<RDS エンドポイント>"
port = "5432"
}
- Terraform を実行します
terraform init --backend-config=backend.hcl
terraform plan --var-file=secret.tfvars
terraform apply --var-file=secret.tfvars
詳細: 踏み台サーバーの接続方法・DB バックアップ / リストア手順は ステージング環境セットアップ手順書 > 踏み台サーバーのセットアップ を参照してください。
1.13 Route 53・カスタムドメインの設定¶
プロダクション環境のカスタムドメイン({ドメイン})の DNS 設定を行います。
ALB の DNS 名に対して Route 53 の CNAME レコードまたは Alias レコードを作成します。HTTPS を使用する場合は、ACM(AWS Certificate Manager)で証明書を発行し、ECS モジュールの certificate_arn 変数に設定します。
詳細: ステージング環境セットアップ手順書 > Route 53・カスタムドメインの設定 を参照してください。
2. デプロイ¶
2.1 デプロイフロー¶
2.2 デプロイタスク¶
# 典型的なデプロイフロー
{ビルドコマンド} # 1. ローカルでイメージビルド
{プッシュコマンド} # 2. ECR にプッシュ
{ECS デプロイコマンド} # 3. ECS をローリングデプロイ
# または一括実行
{ECS 全サービスデプロイコマンド}
詳細: デプロイの仕組みの詳細は ステージング環境セットアップ手順書 > デプロイ を参照してください。
アップグレード¶
RDS メジャーバージョンアップグレード¶
Blue/Green Deployment を利用して、ダウンタイムを最小限に抑えたメジャーバージョンアップグレードを実行します。
ops/terraform/live/prod/variables/main.tfのdb_engine_versionを変更- Terraform を実行
cd ops/terraform/live/prod/data-stores/rds
terraform init --backend-config=backend.hcl
terraform plan
terraform apply
詳細: Blue/Green Deployment の仕組み・前提条件・セッショントークン切れ時のリカバリ手順は ステージング環境セットアップ手順書 > アップグレード を参照してください。
環境廃棄¶
プロビジョニング済みのプロダクション環境を廃棄する場合は、構築時と逆の順序で実行します。
警告: プロダクション環境の廃棄は十分な確認と承認のもとで実行してください。
deletion_protection = trueの設定を事前にfalseに変更する必要があります。
廃棄フロー¶
Application Manager の削除¶
cd ops/terraform/live/prod/ssm/appmanager
terraform init --backend-config=backend.hcl
terraform destroy
ECS の削除¶
cd ops/terraform/live/prod/services/ecs
terraform init --backend-config=backend.hcl
terraform destroy
ECR リポジトリの削除¶
各サービスのリポジトリを個別に削除します。
cd ops/terraform/live/prod/repository/ecr/{サービス名}
terraform init --backend-config=backend.hcl
terraform destroy
AWS Backup の削除¶
cd ops/terraform/live/prod/backup
terraform init --backend-config=backend.hcl
terraform destroy
RDS の削除¶
重要:
deletion_protection = trueの場合、先にfalseに変更してterraform applyを実行してからterraform destroyを実行してください。
cd ops/terraform/live/prod/data-stores/rds
terraform init --backend-config=backend.hcl
terraform destroy
VPC の削除¶
踏み台サーバーが存在する場合は先に削除してください。
# 踏み台サーバーの削除(存在する場合)
cd ops/terraform/live/mgmt/prod/bastion
terraform init --backend-config=backend.hcl
terraform destroy --var-file=secret.tfvars
# VPC の削除
cd ops/terraform/live/prod/vpc
terraform init --backend-config=backend.hcl
terraform destroy
SSM パラメータストアの削除¶
cd ops/terraform/live/prod/ssm/paramstore
terraform init --backend-config=backend.hcl
terraform destroy --var-file=secret.tfvars
セキュリティチェックリスト¶
-
secret.tfvarsが.gitignoreに追加されている - DB 認証情報が SSM パラメータストアで管理されている
- RDS がプライベートサブネットに配置されている
- RDS の
deletion_protectionがtrueに設定されている - 踏み台サーバーの SSH アクセスが IP 制限されている
- OIDC 認証で GitHub Actions と AWS が連携している
- S3 バケットの暗号化が有効になっている
- DynamoDB の状態ロックが設定されている
- ALB で HTTPS(TLS 1.3)が有効になっている
- ACM 証明書が設定されている
関連ドキュメント¶
- ステージング環境セットアップ手順書 — 設計意図・実装詳細・トラブルシューティング
- {関連ドキュメント 1}
- {関連ドキュメント 2}