☁️くもをもくもくまなぶ

クラウドコンピューティングサービスの学んだことを中心につらつらと書いています

AmazonEventBridgeでSlack通知

Amazon EventBridge

AWS上で検知できるイベントを元に他処理を実行できるサービスです。

汎用性も高い上に、さらにサーバレスで動くということで運用面でも嬉しいサービスです。

製品ページでは「大規模なシステム」と謳っている中で、Slack通知という小さい活用でなんかすみません。

今回の目的

AWS Step Functions(以下、SFn)で実装している処理の失敗したときのエラーをSlackに通知させたいことが目的です。


イベントの検知設定

特定のSFnでエラーになりうるステータス(FAILED, TIMED_OUT, ABORTED)で検知する仕組みにしました。

{
	"source": ["aws.states" ], 
	"detail-type" : ["Step Functions Execution Status Change"], 
	"detail": {
		"status": ["FAILED", "TIMED_OUT", "ABORTED"], 
		"stateMachineArn": ["arn:aws:states: us-west-2:xxxxxx:stateMachine:gatherUserTime"]
	}
}
Image in a image block

通知

2つ実装方法を試しました。

ここでポイントになってくるのがSlackに通知させる際のメッセージとなります。

メッセージ内容をEventBridge内の Input Transformer にてカスタマイズすることで実現しています。

1. AWS ChatbotとAmazon SNS

Slackとの連携で一番手頃にできるのはAWS Chatbotと組み合わせた場合ではないでしょうか

Image in a image block

1-1. Input Transformer
Input path
{
	"account": "$.account", 
	"detail-executionArn": "$.detail.executionArn", 
	"detail-input": "$.detail.input", 
	"detail-name": "$.detail.name", 
	"detail-stateMachineArn": "$. detail.stateMachineArn", 
	"detail-status": "$.detail.status", 
	"detail-type": "$.detail-type", 
	"id": "$.id", 
	"region": "$.region", 
	"resources": "$.resources", 
	"source": "$. source", 
	"time": "$.time", 
	"version": "$.version"
}
Input template
{
	"version": <version>, 
	"id": <id>, 
	"detail-type": "[<detail-status>] <detail-type>", 
	"source": <sources, 
	"account": <account>, 
	"time": <time>, 
	"region": <region>, 
	"resources": [
	"https://<region>.console. aws.amazon.com/states/home?region=<region>#/execution/<detail-executionArn>"
	]
}
Image in a image block

実行した結果
Image in a image block

2. Slack API

SlackのREST APIで通知を簡単に実現することも可能です。

2-1. Input Transformer
Input path
{
	"account": "$.account", 
	"detail-executionArn": "$.detail.executionArn", 
	"detail-name": "$.detail.name", 
	"detail-stateMachineArn": "$.detail.stateMachineArn", 
	"detail-status": "$.detail.status", 
	"detail-type": "$.detail-type", 
	"id": "$.id", 
	"region": "$.region", 
	"source": "$. source", 
	"time": "$.time", 
	"version": "$.version"
}
Input template

{
	"channel": "$Chanel IDを設定$",
  "text": "[<detail-status >] <detail-type> \nStateMachine Arn: <detail-stateMachineArn>"
}

実行した結果
Image in a image block

まとめ

通知を実装する目的自体は達成できました。

私個人の主観でのそれぞれ実装した感想は次のとおりです。

通知で利用する仕組み実装の容易さ通知内容の柔軟性
AWS Chatbot + Amazon SNS△:複数のサービスに渡る○:柔軟に変更可能
Slack API○:API Endpointさえあればいい△:通知内容の修正が難しい

また、EventBridgeはCloudWatch Eventsが統合されて以降も特にEvents以外にサービスを使っていなかったので、今回利用する経験が得られてよかったです。

参考