ECSをEC2からFargateに切り替える際の注意点

AWS, docker, ECS, Fargate

新しいサービスでECSを利用しようとしているのですが、
EC2からFargateに移行してみて少し違いが分かってきたので簡単ですが共有です。

  • AWS::ElasticLoadBalancingV2::TargetGroup
    • TargetTypeがinstanceかIPか
    • FargateにするとEC2インスタンスがないので接続先はIPになります
    • Fargateのタスク毎にユニークなIPが割り当てられる
  • AWS::ECS::Service
    • Fargateは配置戦略(PlacementStrategies)の指定がない(EC2がないので当然か)
    • Fargateはネットワーク設定(NetworkConfiguration)が必要
    • Subnet/SecurityGroupの指定はここで行う
    • AssignPublicIpをENABLEDにしないとPublicIPがなくDockerHubのリポジトリからイメージをPullできない
    • Fargateはサービスへ権限の設定が不要
  • AWS::ECS::TaskDefinition
    • CPU/Memoryの指定が必須
    • それぞれの値が要件を満たさない場合は起動に失敗する
    • CloudWatch Logsを使用する場合ExecutionRoleArnでタスクにログ出力の権限を与える必要がある
    • Linksが使用できないのでコンテナ同士のリンクが不可
    • Volumes/MountPointsが使用できないのでホストへのマウントができない
    • タイムゾーンなどはコンテナ側で指定する必要がある
    • これによりDatadogAPMが利用できない(インフラ監視は可能)

その他

  • ElasticIPが使用できないので固定IPの要件がある場合は不可
  • 同一クラスターにEC2とFargateが混在してもOK

まとめ

ECSはEC2とFargateでコンポーネントは共通なのですが設定する項目が結構違います。
また、CloudFormationのドキュメントでは何を指定するべきか何ができないのかが分かりづらいので注意が必要と思いました。

AWS, docker, ECS, Fargate