やりたいこと
コンテナの勉強がてらみんなのアイドルTerraformを使ってECS/Fargateでコンテナが稼働するところまでを試してみる。今回はDockerHubのコンテナイメージをそのまま利用するためECRは使わない。
今回利用するAWSサービス
ECSとは
Fargateとは
- EC2インスタンスの管理が不要なコンテナ起動タイプ。タスク定義を書くだけでコンテナを動かすことができる。
- CPU, MEMの割当上限有り、コンテナ内へのログイン不可、ログ出力方法の制限などがありEC2インスタンスに比べて自由度が低い。でも楽。
用語
- タスク
- サービス
- タスクをどれだけの数起動するか、どのようなデプロイ戦略などを指定
- クラスタ
- タスク、サービスを含むグループ。起動タイプはFargate, EC2の混在が可能
- EC2の場合、
/etc/ecs/ecs.config
に所属するクラスターが設定されている
Terraform設定
事前に準備しておくもの
- VPC
- Subnet
- SecurityGroup (コンテナに付与する)
aws_ecs_cluster
- クラスター名を定義するだけ
aws_ecs_service
- fargateの場合、ネットワークモードの設定が必須。この辺もう少しうまく書きたい。
network_configuration
でサブネット、セキュリティグループ、グローバルIPの有無を指定。ALB使うならグローバルIPは不要
aws_ecs_task_definition
- Fargateを利用する場合、ネットワークモードは
awsvpc
のみawsvpc
を選択するとタスク(コンテナ)毎にENIが割当られる
execution_role_arn
でタスクに付与するIAMロールを設定できる。今回はスルーFargate
は配置戦略不要。EC2のときはちゃんと考える必要がある- CPU/MEMの設定値がEC2とFargateでは異なるので注意
test-task.json
essential
はタスクに複数コンテナを定義した際、一つでもコンテナ失敗、停止すると他のコンテナもすべて停止する。
めも
- 起動タイプをEC2にしたい場合、TerraformでEC2インスタンス作成して
/etc/ecs/ecs.config
にユーザデータでクラスタ名を設定 - 同じタスク定義でもタスクが
RUNNING
になるまでの時間がまちまちだった。また、都度リポジトリからイメージをダウンロードしているはずなので、イメージは可能な限り小さくしないと起動までの時間が長くなる - グローバルIPの紐付けを有効にしてないとタスクがPENDINGから一向に変わらなかった。どこかにログが出てる?
かんそう
最初からTerraformで作ろうとしたので結構時間かかった。初めてやるときはポチポチしながら理解していくほうがいい
さんこう
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_clusters.html https://github.com/yukkyun/terraform-ecs-sample/blob/master/ecs_nginx.tf https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-cpu-memory-error.html https://blue21neo.blogspot.com/ https://inokara.hateblo.jp/entry/2015/07/24/075231 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_life_cycle.html