Fargateでバッチ処理をしているが、それが異常終了したときどう検知するか検討しました。
バッチに使われているタスクはSTOPPEDになったとき終了コードで判断することにしました。
1. 概要
おおまかな作りは以下です
- CloudWatchEventでSTOPPEDになったECSタスクを検知
- Lambdaにわたす
- LambdaでメッセージからコンテナのExitCodeが"1"のときslackに通知する
2. CloudWatch Event
タスク状態変更イベントを参考に
以下のようなイベントパターンを作成します
{
"source": [
"aws.ecs"
],
"detail-type": [
"ECS Task State Change"
],
"detail": {
"clusterArn": [
"arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/${ClusterName}"
],
"lastStatus": [
"STOPPED"
]
}
}
本当は以下のようにexitCodeが1のときだけ検知したかったのですが
階層が深いためか、イベントパターンの構文エラーになってしまいうまく設定できませんでした
"detail": {
"clusterArn": [
"arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/${ClusterName}"
],
"containers":[
{
"exitCode": 1
}
],
"lastStatus": [
"STOPPED"
]
}
しょうがないので、STOPPEDのタスクはすべて検知して
Lambda側でif extCode == 1
することにしました
ノウハウお持ちの方教えてほしいです
(会社でAWSサポートプラン契約してるんだからサポートに聞け)
3. Lambda
ここからは適当にLambdaを書くだけです
Pythonでは以下のようにしました
def lambda_handler(event, context):
taskExitCode = event['detail']['containers'][0]['exitCode']
if taskExitCode == 1:
# 以下slackに通知するコード
4. 所管
異常終了の通知からもう少し踏み込んで、タスク再実行の自動化までやれば幸せになりそう。
あと関係ないですがFargate Spot良さそうですよね。
Appendix
AWS SAMにおけるテンプレートとLambdaのコードを参考に置いておきます
https://github.com/abe-ma/ecstask-error-notifier