re:Invent 2017にて、コンテナインスタンス要らずのコンテナマネジメントサービス(Fargate)がAWSから発表されたので、試してみます。
Terraformで、VPCから一気に作成していきます。
2018/2/15時点では東京リージョン未対応なので、バージニアリージョンで実行します。
## 作成後のイメージ(Fargate)
マネジメントコンソールでEC2が存在していないことを確認したいです。
## 以前のイメージ(ECS)
違いは、コンテナインスタンスの有無のみ
引き続きVPC/Subnet/ALB等のNetWork周りの設定は必須
ECSのプロビジョニングファイルとの変更点
-
インスタンス設定が不要になったことにより、Auto Scale関連のファイル削除
-
Task定義
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準拠の組み合わせのみ指定可能
[
{
"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"
}
}
}
]
- ALB Target Group
以下追加
target_type = "ip"
- ECS Service
IAM削除
NetWork設定をAuto Scaleから移管
- 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
## 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.0
でECS Service
のパブリックIPの自動割り当て機能がサポートされたため、内容修正しました。
## CannotPullContainerError
applyは成功しますが、サービス登録したタスクが上がってきません。
エラー原因は、Docker ImageがPullできないようです。
原因は、Auto-assign public IP
がDISABLED
となっているため、インターネット接続が不可となっている模様。
(provider.aws v1.6.0
ではAuto-assign public IP
は未対応 ※2018/1/10時点)
## AWS CLIでネットワーク設定を調整
+ ecs updatae-service
でAuto-assign public IP
をENABLED
へ
タスクが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}"
最後に
コンテナインスタンスがマネジメントコンソール上存在しない事も無事確認できました。
次回は、オートスケールを試してみたいと思います。