Amazon ECS のタスク定義には、タスク内のコンテナの起動と終了の順序を制御する依存関係が定義できます。
アプリケーションのコンテナと、アプリケーションが依存しているミドルウェアのコンテナがあった場合、依存を定義すると
というような制御が可能です。
graphviz による可視化
しかし依存関係が複雑になると、JSON で文字列で書いただけでは実際にどう依存しているのかがよく分からないし、間違ってループを作ってしまうと起動できないので事前に確認したい、ということで可視化してみました。
これはとあるアプリケーションタスクの依存関係を、task definition の JSON から graphviz 用の .dot ファイルを生成して画像にしたものです。
taskdef の JSON を引数にして実行すると .dot を吐き出すので、それを dot
コマンドで画像化します。
$ perl graph-depends-on.pl app.json > app.dot $ dot -Tpng app.dot -o app.png
グラフの各ノードがコンテナで、定義された dependsOn に従ってノードが接続されています。
- sardine: 自作のメトリック取得用監視コンテナ
- 他のコンテナを監視するため、一番最初に起動し最後に落としたい
- sardine - mackerel plugin のメトリクスを CloudWatch で集約する agent を書いた - 酒日記 はてな支店
- app
- アプリケーション
- fluentd, gunfish, katsubushi, xray
- nginx
- 外からの接続を受け付けるWebサーバ
- 他のが全部起動してからでないと正常に動作しないので最後に起動する
内部的にそれぞれ必要そうな依存を全て記述するとこうなったのですが、しかしこれだと ECS task が起動しないということが判明。具体的には xray コンテナが起動したあと、他のコンテナが PENDING のまま起動できない状態になりました。
各コンテナから依存先に到達する経路が一意でないのがよくないのかと思いついて、依存を整理したのが次の画像です。
これは無事に起動できました。