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 を指定することも可能です。 今まで気づかなかったのが悔やまれるくらい、すごく便利ですね!