🍙

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

に公開

はじめに

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

  • ゴール

    • TOPページ(<ALBのパブリックDNS>/にアクセス)にてHello Worldと表示されていればOK
  • この記事で扱うこと

    • Terraform で AWS ネットワークと ECS (Fargate 起動タイプ) を構築する手順
    • ECR へのイメージ Push と初回 terraform apply の流れ
  • この記事で扱わないこと

    • Route 53 やカスタムドメイン設定 (ALB のパブリック DNS でアクセス)
    • CI/CD パイプライン構築や自動承認フロー

手順の全体像

  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用にインバウンドを最小限に抑える
    • インターネット -> ALB (:80/TCP) -> ECS (:80/TCP from ALB SG)
  • ECSにタスク及びタスク実行ロールのAssume Role(一時的に権限を付与する)
    • タスクロール:タスク自体の権限。S3やDynamoDBなどに接続する場合はこちらが必要。今回は最小構成なので特になし。
    • タスク実行ロール: コンテナ起動時の共通操作 (ECR 認証/ログ出力) 用。

可用性

初回デプロイ手順

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 ロググループへ出力されているかチェック。

今後試したいこと

Discussion