Sionの技術ブログ

SREとして日々の学習を書いて行きます。twitterは@sion_cojp

Fargate + cloudwatch eventでcronシステム モニタリング編

前回のお話

Fargate + cloudwatch eventでcronシステム構築 - Sionの技術ブログ

non exit0かどうか

こちらはlambdaで監視してます。

Fargate + cloudwatch eventでcronシステム構築 - Sionの技術ブログ

ロジックとしては、タスク終了時のイベントをトリガーに、exitCodeの値をとって、0じゃない場合slackに通知してます。

タスクが正常に動いてるかどうか

こちらはdatadog logsの量が0以上なのをチェックしてます。

例えば1分間毎のcronの場合、「1分間でログが0以上あるよね」というチェックをしてます。

クラスタのタスク数と、タスクが並列で動いてないかどうか

クラスタのタスク数

1Clusterにおける、Fargateのタスク上限数は50です

Amazon ECS サービス制限 - Amazon Elastic Container Service

datadogで監視出来るのはFargateのserviceのみ。今回はcloudwatch eventsを通してタスクを動かしてるので取得できませんでした。

これが監視できないと、上限値に達した場合タスクが起動できなくなってしまいます。

その前に検知して上限緩和をしたいですね。

タスクが並列で動いてないか

最初は「datadog logsで決めた量の2倍以上になったら2つ動いてる」というロジックで監視してましたが、

2倍以上にならない場合もあるので、悩みました。

双方の監視はGoで実装し、Fargate service上で動かして監視してます。

github.com

上記でやってることは

- stg, prodのcronクラスター内のタスクの数を監視し、slackに通知。 
- タスクがn個以上実行されてるかを監視します。15分ごとにまとめをslackに通知。(nは設定できます)

となってます。

大変だったところ

メトリクスが取れない?

datadogではfargate service + clusterの場合メトリクスが取れます。

が、今回はfargate + cloudwatch eventなのでクラスタからメトリクスが取れません。

なのでもし中々taskが終わらない...などの調査用に取りたい場合は、サイドカーでdatadog/agentをいつでも立ち上げれるよう、準備するだけでとどめてます。

datadog/agentが立ち上がる前にメインコンテナが起動終了する?

https://hub.docker.com/r/sioncojp/docker-slack

curlでslackにメッセージPOSTするイメージで検証してました。

あまりにも起動、終了が早いため、datadog/agentより先に立ち上がって終了します。

dependsOnでdatadogに向ければ、datadogが立ち上がった後にアプリケーションが起動するので、メトリクスが取れるようになります。

datadog/agentが永遠に立ち上がる?

dependsOnサイドカーのdatadogを向けた場合、永遠に立ち上がってしまいます。

https://github.com/sioncojp/fargate-sidecar-datadog-agent

のようにタスクが全部終了したら、検知してdatadogをshutdownするソリューションを考えましたが、

app = essential: true + dependsOn: datadog/agent
datadog/agent = essential: false

の設定を施せばこれは解決しました

タスクが永久にpending?

例えば、

app:latest = essential: true + dependsOn: datadog/agent
datadog/agent:hogeeee = essential: false

でdatadogをサイドカーで立ててる場合、datadog/agent:hogeeee のような存在しないイメージを指定すると永久にタスクがpendingになります。

細かい原因はよくわかりませんが、もしこのようなパターンを使う場合は、app側のwrapperでサイドカーの起動を失敗検知する設定が必要です

ref: https://docs.docker.com/compose/startup-order/