【備忘録】Terraformで構築する最小構成のECS Fargate環境

技術

はじめに

TerraformによるAWSリソースの作成、ECS Fargateによるwebサーバーのコンテナ化を実際に行ってみることを目的として、nginx を ECS Fargate 上でホスティングする最小構成を Terraform で組む際の備忘録です。なお、CI/CD や独自ドメインは範囲外とし、ALB のパブリックDNS で動作確認することとします。

  • ゴール
  • この記事で扱うこと
  • この記事で扱わないこと

手順の全体像

  1. Terraform モジュールを初期化し、VPC/ALB/ECR/ECS をコード化。
  2. ECR を先に作成してリポジトリを確保。
  3. Docker イメージをビルドして ECR に Push。
  4. Terraform で全リソースを適用し、ECS サービスを起動。
  5. ALB の DNS 名経由でブラウザから Hello World を確認。

アーキテクチャ全体像

構成要素

  • VPC:Public/Private の 2 種類のサブネットを各 AZ に 1 つずつ配置し、NAT ゲートウェイは Public 側に設置。
  • ALB:Public サブネットに配置し、外部からの HTTP トラフィックを受け付けて ECS タスクへルーティング。
  • ECS サービス (Fargate):Private サブネットでタスクを実行し、タスク定義で ECR 上の nginx イメージを参照。
  • ECR:nginx-fargate-terraform リポジトリをホストし、コンテナイメージを提供。
  • CloudWatch Logs:コンテナログを /ecs/nginx ロググループへ集約。

セキュリティ

  • セキュリティグループとしてALB, ECS用にインバウンドを最小限に抑える
  • ECSにタスク及びタスク実行ロールのAssume Role(一時的に権限を付与する)

可用性

  • Fargate は desired_count = 2 で 複数 AZ にタスクを分散

初回デプロイ手順

1. Terraform モジュールを初期化し、VPC/ALB/ECR/ECS をコード化

terraform init

2. ECR を先に作成してリポジトリを確保

アプリのイメージを Push できるよう、ECR だけ先に作成しておく。

terraform apply -target=aws_ecr_repository.app

3. Docker イメージをビルドして ECR に Push

aws ecr get-login-password --region ap-northeast-1 \\
  | docker login --username AWS --password-stdin <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com
docker build -t nginx-fargate-sample .
docker tag nginx-fargate-sample:latest <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-fargate-terraform:latest
docker push <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-fargate-terraform:latest

4. Terraform で全リソースを適用し、ECS サービスを起動

terraform apply

5. ALB の DNS 名経由でブラウザから Hello World を確認

  1. terraform output alb_dns_name で ALB の DNS 名を取得。
  2. ブラウザで http://<alb_dns_name> を開き、Hello, nginx! が表示されるか確認。
  3. aws ecs list-tasks --cluster nginx-fargate-terraform-cluster でタスク数を確認 (デフォルトは 2)。
  4. CloudWatch Logs コンソールで /ecs/nginx ロググループへ出力されているかチェック。

今後試したいこと

  • ECS ネイティブの Blue/Green デプロイ: 2025/7 にECSネイティブのBlue/Greenデプロイ機能がリリースされたが、「承認してから本番トラフィックの移行」を行う機能は組み込みでは用意されていないようなので、ここを整えたい。本番運用を想定した場合、テストトラフィックで動作確認してから進めたいというニーズが生まれそうなので。なお、公式では、S3にファイルを配置することで手動承認するサンプルが用意されている。
  • 参考