ECS
Memo
ecsTaskRoleとecsTaskExecutionRole
2つのロールがある。
- ecsExecutionRoleは、コンテナ起動時に利用するAWSサービスのロール。SSMパラメータや、ECRとの接続などを行う
- ecsTaskRoleは、コンテナ起動後も利用するAWSサービスのロール。タスクに付与することで利用する。
- ECS execを実行するとき:
- あらかじめTaskにecsTaskRoleを指定して起動する
- ServiceでenableExecuteCommandをオンにして再起動
- 新しくTaskを作る
- ECS execを実行する
概念図
独自用語がある。Amazon EC2 Container Service(ECS)の概念整理 - Qiitaが非常にわかりやすい。
Railsの構成の例。
- Production Cluster
- main Service … Webサーバ+アプリケーションサーバ
- Task
- App Container … Railsを動かす
- nginx Container
- Task
- worker Service … バッチ処理
- Task
- worker Container … sidekiqワーカーを動かす
- Task
- main Service … Webサーバ+アプリケーションサーバ
ServiceはTaskのデプロイ戦略、Task数を管理する。Taskはtask-definitionをもとに作成され、容易にスケールできる。
デプロイ方法
ECSにおけるdeployは、「task-definitionのimageタグを書き換えること」となる。これによって使用イメージを最新のものに切り替えてtask-definitionをpushすることで、新しいTaskは新しいイメージを使用してコンテナを立ち上げる。これによって変更を本番環境に反映できる。
このようにデプロイは本質的にシンプルなので、いくつかの方法がある。
- AWS公式のGitHub Actions シンプルな機能だけを提供し、使い方がとても簡単。だが、環境やServiceが複数になったときtask-definitionの重複が大きくなり、管理が難しくなる。
- ecs-cli 細かく設定でき高機能。オーバライドで重複をなくすこともできるが、コマンドが冗長。
- ecspresso(ecs-cliの管理に特化したラッパーライブラリ) おすすめ。カヤック社が提供するOSS。task-definitionにテンプレートを定義し、実行時に環境変数で埋め込める機能が便利。さらにenvfile指定によって環境変数の組み合わせを環境ごと、Serviceごとに定義でき、メンテナンスしやすくなる。
task-definitionは微妙に異なる内容で環境×Service分必要になるので、DRYにするためには柔軟にオーバーライドできる機能は必須。