AWS Batch のジョブ結果を SNS で通知する

記事タイトルとURLをコピーする

CloudWatch Events で AWS Batch のステータス変更をキャッチできたんですね。

こんにちは、技術一課の山中です。 AWS Batch のジョブが成功したのか失敗したのかメールで受け取りたいときってありますよね?

Before

これまではジョブを実行したと同時に 1 分おきに list_jobs を呼び出す Lambda ファンクションを起動してステータスチェックを行っていました。 ステータスが成功(SUCCEEDED)または失敗(FAILED)に変わるとそれを SNS 経由でメールにて通知します。

After

今回、もっといい方法ないかなと考えていたところ、以下のページを発見しました。

チュートリアル: 失敗したジョブイベントに関する Amazon Simple Notification Service アラートを送信する

これでええやん!

ということで、以下構成にて作り直すことにしました。

実行結果確認用の Lambda を 1 分おきに起動する必要がなく、すっきりした構成ですね。

結果通知用の Lambda ファンクション作成

今回 Lambda ファンクションは Python で作成します。 CloudWatch Events から Lambda ファンクションの event パラメタには以下のような値が入ってきます。

{
    'version': '0',
    'id': '195122c5-bfae-b13b-9bca-7889ddbe73e7',
    'detail-type': 'Batch Job State Change',
    'source': 'aws.batch',
    'account': '000000000000',
    'time': '2018-09-06T09:54:17Z',
    'region': 'ap-northeast-1',
    'resources': [
        'arn:aws:batch:ap-northeast-1:000000000000:job/955c6177-3594-429c-b747-29be36936852'
    ],
    'detail': {
        'jobName': 'job_20180906185213',
        'jobId': 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx',
        'jobQueue': 'arn:aws:batch:ap-northeast-1:000000000000:job-queue/sample-queue',
        'status': 'SUCCEEDED',
        'attempts': [
            {
                'container': {
                    'containerInstanceArn': 'arn:aws:ecs:ap-northeast-1:000000000000:container-instance/ed94df41-6d11-4407-b41c-e5d1048b6e53',
                    'taskArn': 'arn:aws:ecs:ap-northeast-1:000000000000:task/e7a0be6d-31b6-4091-891c-119d8a7916c7',
                    'exitCode': 0,
                    'logStreamName': 'sample-job-definition/default/e7a0be6d-31b6-4091-891c-119d8a7916c7'
                },
                'startedAt': 1536227653907,
                'stoppedAt': 1536227655513,
                'statusReason': 'Essential container in task exited'
            }
        ],
        'statusReason': 'Essential container in task exited',
        'createdAt': 1536227533583,
        'retryStrategy': {
            'attempts': 1
        },
        'startedAt': 1536227653907,
        'stoppedAt': 1536227655513,
        'dependsOn': [],
        'jobDefinition': 'arn:aws:batch:ap-northeast-1:000000000000:job-definition/sample-job-definition:3',
        'parameters': {},
        'container': {
            'image': '000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sample',
            …

よって、 Lambda ファンクションで以下のように status を取得しこれを SNS に投げさえすればステータスのメール通知ができます。

def main(event, context):
    status = event['detail']['status']

イベントルールの登録

今回は FAILED だけでなく SUCCEEDED も通知したいので、以下のようにイベントパターンを登録し、チェック用の Lambda ファンクションをターゲットとして登録します。

{
  "detail-type": [
    "Batch Job State Change"
  ],
  "source": [
    "aws.batch"
  ],
  "detail": {
    "status": [
      "SUCCEEDED",
      "FAILED"
    ]
  }
}

以上で設定は完了です。 あとは、いつもどおり AWS Batch にてジョブを実行してみてください。 ステータスが SUCCEEDED または FAILED に変わった際にほぼリアルタイムで Lambda が起動するはずです!

おわり

今回はメール本文を編集するためにイベントルールのターゲットとして Lambda を指定しましたが、直接 SNS を指定することも可能です。 今まで気づかなかったのが悔やまれるくらい、すごく便利ですね!