Terraform
IaC(Infrastructure as Code)による AWS リソース管理の設計を解説します。
Terraform は、証明生成パイプラインに関わる AWS リソース(ECS、Step Functions、SQS、S3、ECR、CodeBuild、VPC、Lambda)を宣言的に管理します。Amplify Gen 2 が管理するリソース(Web ホスティング、AppSync、hono-api Lambda 等)とは明確に分離されています。
ディレクトリ構成
Terraform の構成ファイルは terraform/ ディレクトリに配置され、機能別に分割されています。
| ファイル | 管理対象 |
|---|---|
main.tf | ローカル変数、環境設定、データソース |
variables.tf | 入力変数の定義とバリデーション |
backend.tf | S3 ステートバックエンド + DynamoDB ロック |
versions.tf | Terraform / プロバイダーのバージョン制約 |
iam.tf | IAM ロール / ポリシー(ECS、Step Functions、CodeBuild) |
ecs.tf | ECS クラスター + Fargate タスク定義 |
step_functions.tf | ステートマシン定義(ASL) |
sqs.tf | ワークキュー + デッドレターキュー |
s3.tf | 証明バンドルバケット + ライフサイクル |
ecr.tf | ECR リポジトリ + ライフサイクルポリシー |
codebuild.tf | ビルドプロジェクト(プローバー + ツールチェーン) |
lambda_check_image_signature.tf | イメージ署名検証 Lambda |
vpc.tf | VPC + サブネット + インターネットゲートウェイ |
security_groups.tf | ECS タスク用セキュリティグループ |
cloudwatch.tf | ログ群 + 保持期間設定 |
cloudtrail.tf | 監査証跡(main 環境のみ) |
outputs.tf | 他ツール連携用の出力値 |
環境分離
ワークスペース戦略
develop と main の 2 環境を、Terraform ワークスペースと tfvars ファイルの組み合わせで管理します。
flowchart LR
subgraph "Terraform State"
S3["S3 バケット<br/>terraform-state"]
S3 --> DEV["develop<br/>workspace"]
S3 --> MAIN["main<br/>workspace"]
end
subgraph "tfvars"
DEVF["develop.tfvars"]
MAINF["main.tfvars"]
end
DEVF --> DEV
MAINF --> MAIN
environment 変数はバリデーションにより develop または main のみが許可されます。環境ごとの差分は locals で定義された設定マップにより解決されます。
| 設定 | develop | main |
|---|---|---|
| S3 ライフサイクル | 7 日 | 30 日 |
| ログ保持期間 | 7 日 | 14 日 |
| CloudTrail | 無効 | 有効(90 日) |
ワークスペースの確認
環境の取り違えを防ぐため、操作前にワークスペースの確認が推奨されます。
ステート管理
S3 バックエンド
Terraform ステートは S3 バケットに保存され、DynamoDB テーブルによるロック機構でステートの同時変更を防止します。
| 項目 | 設定 |
|---|---|
| ステートバケット | stark-ballot-simulator-terraform-state |
| ステートキー | terraform.tfstate |
| ロックテーブル | stark-ballot-simulator-terraform-lock |
| リージョン | ap-northeast-1 |
| 暗号化 | AES256 |
| バージョニング | 有効 |
認証方式
Terraform の実行は STS AssumeRole を前提としています。
具体的な認証ツール(AWS IAM Identity Center / aws-vault など)は運用環境に依存し、Terraform コードの責務外です。
flowchart LR EXEC["実行環境<br/>(ローカル/CI)"] --> STS["AWS STS<br/>AssumeRole"] STS --> ROLE["Terraform 実行ロール<br/>IAM ロール"] ROLE --> TF["Terraform 実行"]
| 項目 | 設定 |
|---|---|
| 認証方式 | STS AssumeRole |
| IAM ロール | Terraform 実行用ロール(名称は環境依存) |
| 資格情報の保護方式 | 組織の標準(SSO / aws-vault / Keychain / KMS など) |
| 権限 | 最小権限を原則とする |
主要な入力変数
Terraform の実行に必要な変数と、そのバリデーションルールの概要です。
必須変数
| 変数 | 説明 | バリデーション |
|---|---|---|
environment | デプロイ環境 | develop または main |
ecs_image_uri | プローバーイメージ URI | ダイジェスト固定形式(@sha256:<64-hex>) |
finalize_callback_lambda_arn | コールバック Lambda の ARN | — |
ecr_signing_profile_arn | AWS Signer プロファイルの ARN | 空文字不可 |
codestar_connection_arn | CodeStar Connections ARN(IAM ポリシーで参照) | 空文字不可 |
注: 現行の CodeBuild source は GITHUB タイプ(location 指定)で構成されています。
オプション変数
| 変数 | デフォルト | 説明 |
|---|---|---|
aws_region | ap-northeast-1 | デプロイリージョン |
project_name | stark-ballot-simulator | リソース命名プレフィックス |
ecs_cpu | 16384 | Fargate の CPU ユニット |
ecs_memory | 32768 | Fargate のメモリ(MiB) |
s3_proof_prefix | sessions/ | S3 パスプレフィックス |
s3_cors_allowed_origins | [] | CORS 許可オリジン |
出力値
Terraform の出力値は、Amplify 環境変数や運用ツールから参照されます。
| 出力 | 参照元 | 用途 |
|---|---|---|
prover_state_machine_arn | Amplify 環境変数 | dispatch-proxy が SFN を起動 |
prover_work_queue_url | Amplify 環境変数 | API が SQS にメッセージ送信 |
s3_bucket_name | Amplify 環境変数 | Lambda が S3 にアクセス |
ecr_repository_url | CodeBuild | イメージのプッシュ先 |
IAM 設計
最小権限の原則に基づき、各コンポーネントに専用の IAM ロールが割り当てられています。
flowchart TD
subgraph "信頼されるサービス (Service Principal)"
ECSSVC["ecs-tasks.amazonaws.com"]
STATESVC["states.${aws_region}.amazonaws.com"]
CBSVC["codebuild.amazonaws.com"]
LAMSVC["lambda.amazonaws.com"]
end
subgraph "IAM ロール"
ETE["ecs_task_execution"]
ET["ecs_task"]
SFN["step_functions"]
CB["codebuild"]
CIS["check_image_signature"]
end
ECSSVC --> ETE
ECSSVC --> ET
STATESVC --> SFN
CBSVC --> CB
LAMSVC --> CIS
| ロール | 信頼サービス | 主要権限 |
|---|---|---|
ecs_task_execution | ecs-tasks | ECR イメージ取得、CloudWatch Logs 書き込み |
ecs_task | ecs-tasks | S3 sessions/* への読み書き |
step_functions | states.${aws_region}.amazonaws.com | ECS RunTask、Lambda Invoke、ログ |
codebuild | codebuild | ECR 操作、AWS Signer、ログ |
check_image_signature | lambda | ECR 署名ステータス照会、ログ |
スコープの制限
- ECS タスクロールの S3 権限は
sessions/*プレフィックスに制限 - Step Functions ロールの ECS 権限は特定クラスター ARN に制限
- Step Functions ロールの
iam:PassRoleは ECS 関連ロールのみに制限
Amplify との連携ポイント
Terraform と Amplify は相互に独立して管理されますが、以下のポイントで連携します。
flowchart TB
subgraph TF["Terraform"]
SFN_ARN["Step Functions ARN"]
SQS_URL["SQS キュー URL"]
S3_NAME["S3 バケット名"]
CB_INPUT["入力変数<br/>finalize_callback_lambda_arn"]
end
subgraph AMP["Amplify"]
ENV["環境変数"]
CB_ARN["finalize-callback-runner<br/>Lambda ARN"]
end
SFN_ARN --> ENV
SQS_URL --> ENV
S3_NAME --> ENV
CB_ARN -. "IaC input" .-> CB_INPUT
| 方向 | 情報 | 設定方法 |
|---|---|---|
| Terraform → Amplify | SFN ARN、SQS URL、S3 バケット名 | Terraform 出力値 → Amplify 環境変数 |
| Amplify → Terraform | callback Lambda ARN | Terraform 入力変数 finalize_callback_lambda_arn |
この双方向の参照により、Amplify が管理する Lambda を Terraform が管理する Step Functions から呼び出すことが可能になります。
バージョン制約
| ツール | バージョン |
|---|---|
| Terraform | >= 1.5.7 |
| AWS プロバイダー | ~> 6.0 |
| Archive プロバイダー | 2.x(terraform/.terraform.lock.hcl で解決) |