Amazon Elastic Container Service(Amazon ECS)のタスク定義で複数コンテナを追加して依存関係を設定したときにハマったのでメモ。
コンテナの依存関係については下記が参考になります。
タスク定義パラメータ – Amazon ECS
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/task_definition_parameters.html
ECSとFargateでコンテナの起動順が制御できるようになりました – Carpe Diem
https://christina04.hatenablog.com/entry/ecs-fargate-dependson-parameter
なにが起こったのか
タスク定義
以下のようなコンテナをタスク定義に登録しました。
- コンテナA
- Essential(基本):
false
- Essential(基本):
- コンテナB
- Essential(基本):
false
- DependsOn(コンテナの依存関係):
- Condition:
SUCCESS
、ContainerName: コンテナA
- Condition:
- Essential(基本):
- コンテナC
- Essential(基本):
true
- DependsOn(コンテナの依存関係):
- Condition:
SUCCESS
、ContainerName: コンテナB
- Condition:
正常動作時はコンテナA、コンテナB、コンテナCの順に起動してコマンドを実行して終了します。
- Essential(基本):
エラー時に期待した挙動にならなかった
上記設定でコンテナAでエラーとなった場合、以下のような挙動を期待しました。連なってくれるでしょうと。
- コンテナA:
STOP(ERROR)
- コンテナB:
STOP
- コンテナAが
SUCCESS
を返さなかったから
- コンテナAが
- コンテナC:
STOP
- コンテナBが
SUCCESS
を返さなかったから
- コンテナBが
ところが、期待した挙動とはならずにコンテナBはPENDING
のまま沈黙しました。
コンテナのタイムアウトを設定しなきゃダメなのかと試してみても変わらず沈黙。
- コンテナA:
STOP(ERROR)
- コンテナB:
PENDING
- コンテナC:
PENDING
コンテナBでエラーとなった際にはコンテナCはSTOP
となりました。
こちらは期待したどおりです。
- コンテナA:
STOP(SUCCESS)
- コンテナB:
STOP(ERROR)
- コンテナC:
STOP
- コンテナBが
SUCCESS
を返さなかったから
- コンテナBが
期待する動作をさせるには
以下のようにコンテナCの依存関係にコンテナAを追加してやると期待する動作となりました。
- コンテナA
- Essential(基本):
false
- Essential(基本):
- コンテナB
- Essential(基本):
false
- DependsOn(コンテナの依存関係):
- Condition:
SUCCESS
、ContainerName: コンテナA
- Condition:
- Essential(基本):
- コンテナC
- Essential(基本): true
- DependsOn(コンテナの依存関係):
- Condition:
SUCCESS
、ContainerName: コンテナA - Condition:
SUCCESS
、ContainerName: コンテナB
- Condition:
コンテナAでエラーになるとコンテナCもSTOP
してタスクが終了します。
- コンテナA:
STOP(ERROR)
- コンテナB:
STOP
- コンテナAが
SUCCESS
を返さなかったから
- コンテナAが
- コンテナC:
STOP
- コンテナAが
SUCCESS
を返さなかったから
- コンテナAが
まとめ
複数コンテナを追加して依存関係を設定したときの挙動がハマることでわかりましたが、コンテナ数が増えると大変そうなのもみえてきました・・・
参考
タスク定義パラメータ – Amazon ECS
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/task_definition_parameters.html
ECSとFargateでコンテナの起動順が制御できるようになりました – Carpe Diem
https://christina04.hatenablog.com/entry/ecs-fargate-dependson-parameter