Amazon ECSでのFarGate設定について簡単にまとめておく

Amazon ECS(以下ECS)は、AWS上で展開されているコンテナオーケストレーションサービス。
コンテナを動作させる為の選択肢としてEC2とFarGateが用意されているが今回はFarGateの話。

ただ、基本的にECS上の設定を変更すればEC2とFarGateで同じコンテナを使って動作させることもできる。

Amazon ECR

ECSでは、コンテナレジストリからコンテナイメージのPullを行って動作させる。
その為、コンテナレジストリが必要なるがAWSではAmazon ECR(以下ECR)というレジストリを用意している。
ECRはECSに統合されている為、ECRにイメージをPushしておけば簡単にECSからイメージを利用できる。

手元のマシンからECRへイメージをPushする方法については下記ドキュメント
https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html

AWS CLIを使った方法で前半はAWS CLIのセットアップ。あとはDockerイメージをビルドして、タグをつけて、Pushするだけ。

Amazon ECS

ECSでは大きく3つのリソースをセットアップすることになる。

  1. クラスター
  2. タスク定義
  3. サービス
クラスター

クラスターはFarGate用とEC2用で作成する際に必要なパラメータがとても異なる。
EC2クラスターはEC2を使用するのでEC2の設定が必要になる。例えばインスタンスタイプとかだ。
それに対してFarGateは配置するVPCを選択or作成するだけで完了する。

タスク定義

ECSでコンテナを実行するにはタスクを実行する必要がある。そのタスクの定義を行うのがタスク定義。

  • タスク名
  • 実行ロール
  • ネットワークモード
  • タスクメモリ
  • タスクCPU
  • コンテナ定義
  • ボリューム

などの設定を行う。
注意すべき点としてはFarGateではネットワークモードがawsvpc固定となる。
EC2の場合はbridgeなどいくつか選択肢が与えられ選択することができる。

awsvpcはタスクごとにENI(Elastic Network Interface)を割り当てて通信を行うもの。
各タスクごとに独立したネットワークインターフェースを持つということ。

その為、ネットワークモードがawsvpcのタスク定義を実行する場合には実行するVPCとサブネット、セキュリティグループの指定が必要になる。

もう1つパブリックIPを付与するかどうかの設定がある。
自分はよく忘れがちでCannotPullContainerErrorを出しがちなのだが、ECRからコンテナイメージをPullするにはパブリックIPが必要なる為それを意識して設定すること。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-pull-container-api-error-ecr/

コンテナの定義では主に下記を設定する。

  • イメージURI
  • ポートマッピング
  • 環境変数
  • ストレージ

docker-composeを触っていれば何を指しているかはすぐイメージできると思う。
環境変数については直接値を記述することもできるしAWS Systems Manager パラメータストアから値を参照することもできる。

ボリュームを設定する場合は
タスク定義でボリュームの設定をしてから、コンテナ定義でマウントを設定する必要があることは注意したい。

サービス

タスク定義を作ったらタスク実行することができるようになる。
タスクをただ実行することももちろんできるが、主に永続的に動作させることが目的のタスクの場合はサービスを併用する。

大雑把に言えばタスクとロードバランサーを関連づけるのがサービスという理解でいいのではないだろうか。

有効なサービスでタスクの数が1に設定されているならば、常に1つタスクが実行される状態になる。
例えばタスクを故意に終了してもサービスがタスク数が1に保たれるよう働く為新しいタスクが立ち上げられやがて1つのタスクが動作する状態に戻る。

まとめ

用語がたくさんでてくるがECSにおいてはクラスター、タスク定義、サービスがそれぞれ何を担っているかを理解できれば容易に扱うことができるようになると思う。