ECSサービスを作るとき、いくつかパターンがあることに気づいたのでメモ。
- コンテナのtagごとに作るパターン
- コマンドごとに作るパターン
- 環境変数の組み合わせごとに作るパターン
- スケールアウトの粒度ごとに作るパターン
コンテナのtag
Dockerコンテナには、コミットIDをtagにするのと同時に、master
とdevelop
ブランチではブランチ名をtagに加えている。productionのappサービスはmaster
のtagを使うようにタスク定義を作ってるし、stagingのappサービスはdevelop
のtagを使うようにタスク定義を作っている。それぞれタスク定義が分かれているのでサービスも分かれている。
コマンド
同じDockerコンテナを使っていた場合でも、例えばrailsサービスとsidekiqサービスのように別々のサービスを起動させることがある。こういう場合もそれぞれコマンドごとにタスク定義を作ってサービスを分けることになる。
環境変数の組み合わせ
同じDockerコンテナで同じコマンドを実行する場合でも、環境変数を使って例えばDBの接続先やDB名といった外部サービスを変えることがある。環境変数はタスク定義で指定するので、利用する環境変数の組み合わせごとにタスク定義を作り、サービスを作ることになる。
とはいえ、環境変数の指定方法はいくつか考えられるし、サービスディスカバリを使って外部サービスを参照することで環境変数を使わない方法も考えられるので、避けられるかもしれない。
スケールアウト
特定のパスの負荷が高い場合などに専用のサービスを作って、部分的にスケールアウトさせるということも考えられそう。場合によってはタスク定義も分けて割り当てるリソースを増やすなど最適化させることもありそう。