AWS FargateをTerraformで構築する


re:Invent 2017にて、コンテナインスタンス要らずのコンテナマネジメントサービス(Fargate)がAWSから発表されたので、試してみます。
Terraformで、VPCから一気に作成していきます。
2018/2/15時点では東京リージョン未対応なので、バージニアリージョンで実行します。

 作成後のイメージ(Fargate)

マネジメントコンソールでEC2が存在していないことを確認したいです。

 以前のイメージ(ECS)

違いは、コンテナインスタンスの有無のみ
引き続きVPC/Subnet/ALB等のNetWork周りの設定は必須

ECSのプロビジョニングファイルとの変更点

  • インスタンス設定が不要になったことにより、Auto Scale関連のファイル削除

  • Task定義

terrafrom
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  execution_role_arn       = "arn:aws:iam::${var.aws_id}:role/ecsAdminRole" #AWS標準ECS関連のポリシーAmazonECSTaskExecutionRolePolicy/AmazonECS_FullAccessを含む
  cpu                      = 256 #Fargate準拠の組み合わせのみ指定可能
  memory                   = 512 #Fargate準拠の組み合わせのみ指定可能
task_definition.json
[
  {
    "name": "nginx",
    "image": "nginx:alpine",
    "cpu": 256, //必要に応じ変更
    "memory": 512, //必要に応じ変更
    "essential": true,
    "network_mode": "awsvpc", //追加 
    "portMappings": [
      {
        "containerPort": 80
      }
    ],
    "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
            "awslogs-group": "awslogs-${app_name}-nginx-log",
            "awslogs-region": "${aws_region}",
            "awslogs-stream-prefix": "awslogs-${app_name}-nginx"
        }
    }
  }
]

CPU/Memoryの組み合わせはコチラ

  • ALB Target Group

以下追加

   target_type = "ip"
  • ECS Service

IAM削除
NetWork設定をAuto Scaleから移管

diff
-  iam_role                           = "ecsServiceRole"
+  launch_type                        = "FARGATE"

+  launch_type = "FARGATE"
+
+  network_configuration {
+    subnets = [
+      "${aws_subnet.public-subnet1.id}",
+      "${aws_subnet.public-subnet2.id}"
+    ]
+
+    security_groups = [
+      "${aws_security_group.public_firewall.id}"
+    ]
+    assign_public_ip = "true"
+  }

Terrafrom 実行

  • Terraformのバージョン
$ terraform --version
Terraform v0.11.3
+ provider.aws v1.9.0
+ provider.template v1.0.0
  • GitHub

bush
## Dry Run
terraform plan -var 'aws_id=[AWS Account Idを記載]'

## apply
terraform apply -var 'aws_id=[AWS Account Idを記載]'

## 削除
terraform destroy -var 'aws_id=[AWS Account Idを記載]'

※追記(2018/02/15):

provider.aws v1.9.0ECS ServiceのパブリックIPの自動割り当て機能がサポートされたため、内容修正しました。


## CannotPullContainerError

applyは成功しますが、サービス登録したタスクが上がってきません。
エラー原因は、Docker ImageがPullできないようです。

原因は、Auto-assign public IPDISABLEDとなっているため、インターネット接続が不可となっている模様。
(provider.aws v1.6.0ではAuto-assign public IPは未対応 ※2018/1/10時点)

## AWS CLIでネットワーク設定を調整

+ ecs updatae-serviceAuto-assign public IPENABLED

タスクがRUNNINGになりました。

# network-configurationでassignPublicIp=ENABLEDにupdate
$ aws ecs update-service \
  --cluster fargate-auth \
  --service fargate-auth-service \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxxxx,subnet-xxxxxx],securityGroups=[sg-xxxxxxx],assignPublicIp=ENABLED}"

最後に

コンテナインスタンスがマネジメントコンソール上存在しない事も無事確認できました。
次回は、オートスケールを試してみたいと思います。