5
4

More than 3 years have passed since last update.

バッチ処理するECSタスクが異常終了したとき通知する

Posted at

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

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4