ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

Terraform使ってECS/Fargateでコンテナを稼働する

やりたいこと

コンテナの勉強がてらみんなのアイドルTerraformを使ってECS/Fargateでコンテナが稼働するところまでを試してみる。今回はDockerHubのコンテナイメージをそのまま利用するためECRは使わない。

今回利用するAWSサービス

ECSとは

  • AWSのコンテナ管理サービス。管理サービスなのでECS自体でコンテナを起動しているわけではない。コンテナが起動するのはEC2インスタンス(ECS最適化済み)、もしくは今回利用するFargate。

Fargateとは

  • EC2インスタンスの管理が不要なコンテナ起動タイプ。タスク定義を書くだけでコンテナを動かすことができる。
  • CPU, MEMの割当上限有り、コンテナ内へのログイン不可、ログ出力方法の制限などがありEC2インスタンスに比べて自由度が低い。でも楽。

用語

  • タスク
    • 起動するコンテナの詳細。どのイメージを使うか、コンテナに割り当てるCPU/MEM、起動タイプ、どのポートを開けるかなど。1タスクに複数のコンテナを定義可能
    • タスクの定義はECS独自のJSON形式で定義する。まだECS CLIを利用すればdocker-compose形式でも定義可能
  • サービス
    • タスクをどれだけの数起動するか、どのようなデプロイ戦略などを指定
  • クラスタ
    • タスク、サービスを含むグループ。起動タイプはFargate, EC2の混在が可能
    • EC2の場合、 /etc/ecs/ecs.config に所属するクラスターが設定されている

Terraform設定

github.com

事前に準備しておくもの

  • 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