この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。AWS事業本部のKyoです。
AWS Batchを利用していて、「このジョブいつ終わるんや・・・あ、失敗してた・・・。」みたいな切ない状況になったことはありませんか?
Event Bridge + SNSでジョブが失敗したら通知を飛ばすというシンプルな設定をCloudFormationでテンプレート化したのでご利用ください。
また、少し手を加えることで、ジョブの成功、失敗を問わず通知を飛ばすことも可能です。
テンプレート
AWSTemplateFormatVersion: 2010-09-09
Parameters:
MailAddress:
Description: Enter email address to send notification.
Type: String
AlertName:
Description: Enter alert name.
Type: String
Default: JobFailedAlert
Resources:
SnsTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: !Sub ${AlertName}-topic
SnsSubscription:
Type: AWS::SNS::Subscription
Properties:
Endpoint: !Ref MailAddress
Protocol: email
TopicArn: !Ref SnsTopic
SnsTopicPolicy:
Type: AWS::SNS::TopicPolicy
Properties:
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: __default_statement_ID
Effect: Allow
Principal:
AWS: "*"
Action:
- SNS:GetTopicAttributes
- SNS:SetTopicAttributes
- SNS:AddPermission
- SNS:RemovePermission
- SNS:DeleteTopic
- SNS:Subscribe
- SNS:ListSubscriptionsByTopic
- SNS:Publish
- SNS:Receive
Resource: !Ref SnsTopic
Condition:
StringEquals:
AWS:SourceOwner: ${AWS::AccountId}
- Sid: AWSEvents_Alert
Effect: Allow
Principal:
Service:
- events.amazonaws.com
Action: sns:Publish
Resource: !Ref SnsTopic
Topics:
- !Ref SnsTopic
CwEventRule:
Type: AWS::Events::Rule
Properties:
Name: !Sub ${AlertName}-rule
Description: !Ref AlertName
EventPattern: |
{
"detail-type": [
"Batch Job State Change"
],
"source": [
"aws.batch"
],
"detail": {
"status": [
"FAILED"
]
}
}
Targets:
- Arn: !Ref SnsTopic
Id: SnsAlertMail
宛先のメールアドレスを入力してCloudFormationを実行し、Subscription Confirmationメールのリンクをクリックすれば準備は完了です。
なお、今回のテンプレートは以下のブログで紹介されているものとほぼ同じ構成であることに気づいた方もいるかもしれません。SNSのメール通知をうっかりunsubscribeしないようにする設定も同じ方法が使えます。
結果が成功でも失敗でも通知したい場合
今回のテンプレートではEventBrigdeでBatchジョブのステータス変化を見ているので、成功でも失敗でも、ジョブが完了したことを通知したい場合はCwEventRule
中のstatus
にSUCCEEDED
orFAILED
の両方を設定してください。
##### 前略 #####
CwEventRule:
Type: AWS::Events::Rule
Properties:
Name: !Sub ${AlertName}-rule
Description: !Ref AlertName
EventPattern: |
{
"detail-type": [
"Batch Job State Change"
],
"source": [
"aws.batch"
],
"detail": {
"status": [
"SUCCEEDED",
"FAILED"
]
}
}
Targets:
- Arn: !Ref SnsTopic
Id: SnsAlertMail
やってみる
Batchの環境は構築できているものとし、設定が機能することを確認します。
新規ジョブで以下のコマンドを実行する設定にします。
/bin/sh, -c, 'exit 1'
試した限り、ほとんどタイムラグなくメールが届きました。
JSON中のstatus
にSUCCEEDED
orFAILED
の情報が含まれているので、成功でも失敗でも通知するようにしている場合は、それをもとにジョブの状態を判断することもできます(矢印)。
終わりに
本ブログではAWS Batchのジョブが失敗した時にEvent Bridgeで通知するCloudFormationテンプレートを紹介しました。
単純ではあるものの、長時間待たされた挙句、いつの間にかジョブも失敗しているみたいなモヤモヤする状態を回避できるので、コスパのいい設定だと思います。
なお、メールで届く巨大JSONはお世辞にも見やすいとはいえないので、必要に応じてAWS::Events::Rule
の中でInputTransformerを設定してみてもよいかもしれません。
AWS::Events::Rule InputTransformer
また今回はメール通知でしたが、SNSのエンドポイントをLambdaにするなどしてステータスの変更ごとにSlack通知しても便利かもしれません(より簡単に済ませたい場合はメールをSlack通知する、という方法もアリだと思います)。
以上、何かのお役に立てれば幸いです。