Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.tfS3 ステートバックエンド + DynamoDB ロック
versions.tfTerraform / プロバイダーのバージョン制約
iam.tfIAM ロール / ポリシー(ECS、Step Functions、CodeBuild)
ecs.tfECS クラスター + Fargate タスク定義
step_functions.tfステートマシン定義(ASL)
sqs.tfワークキュー + デッドレターキュー
s3.tf証明バンドルバケット + ライフサイクル
ecr.tfECR リポジトリ + ライフサイクルポリシー
codebuild.tfビルドプロジェクト(プローバー + ツールチェーン)
lambda_check_image_signature.tfイメージ署名検証 Lambda
vpc.tfVPC + サブネット + インターネットゲートウェイ
security_groups.tfECS タスク用セキュリティグループ
cloudwatch.tfログ群 + 保持期間設定
cloudtrail.tf監査証跡(main 環境のみ)
outputs.tf他ツール連携用の出力値

環境分離

ワークスペース戦略

developmain の 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 で定義された設定マップにより解決されます。

設定developmain
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_arnAWS Signer プロファイルの ARN空文字不可
codestar_connection_arnCodeStar Connections ARN(IAM ポリシーで参照)空文字不可

注: 現行の CodeBuild sourceGITHUB タイプ(location 指定)で構成されています。

オプション変数

変数デフォルト説明
aws_regionap-northeast-1デプロイリージョン
project_namestark-ballot-simulatorリソース命名プレフィックス
ecs_cpu16384Fargate の CPU ユニット
ecs_memory32768Fargate のメモリ(MiB)
s3_proof_prefixsessions/S3 パスプレフィックス
s3_cors_allowed_origins[]CORS 許可オリジン

出力値

Terraform の出力値は、Amplify 環境変数や運用ツールから参照されます。

出力参照元用途
prover_state_machine_arnAmplify 環境変数dispatch-proxy が SFN を起動
prover_work_queue_urlAmplify 環境変数API が SQS にメッセージ送信
s3_bucket_nameAmplify 環境変数Lambda が S3 にアクセス
ecr_repository_urlCodeBuildイメージのプッシュ先

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_executionecs-tasksECR イメージ取得、CloudWatch Logs 書き込み
ecs_taskecs-tasksS3 sessions/* への読み書き
step_functionsstates.${aws_region}.amazonaws.comECS RunTask、Lambda Invoke、ログ
codebuildcodebuildECR 操作、AWS Signer、ログ
check_image_signaturelambdaECR 署名ステータス照会、ログ

スコープの制限

  • 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 → AmplifySFN ARN、SQS URL、S3 バケット名Terraform 出力値 → Amplify 環境変数
Amplify → Terraformcallback Lambda ARNTerraform 入力変数 finalize_callback_lambda_arn

この双方向の参照により、Amplify が管理する Lambda を Terraform が管理する Step Functions から呼び出すことが可能になります。

バージョン制約

ツールバージョン
Terraform>= 1.5.7
AWS プロバイダー~> 6.0
Archive プロバイダー2.x(terraform/.terraform.lock.hcl で解決)