この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
2022年10月15日頃からこの方法では正しく動作しません。
Incoming Webhookを使用してAWS Step Functionsの実行結果をSlackに通知するを参照してください。
こんにちは。サービスグループの武田です。
AWS ChatbotがAmazon EventBridgeイベントに対応したことで利用の幅が一気に広がりましたね。今回はその中からAWS Step Functionsの通知を試してみました。
ちなみに前回はAmazon ECRの通知を試しました。よければそちらもご覧ください。
まずは通知される内容を確認してみる
Chatbot、SNSトピックの設定は共通ですので、ちゃだいんのエントリを参考にしてください。
EventBridgeとSNSを連携されるイベントパターンは次のように定義しました。明示的に省いているのはRUNNING
です。実行スタート時にも通知したいのであれば、detail
を省略すればすべてのステータス変更が対象となります。
{
"source": ["aws.states"],
"detailType": ["Step Functions Execution Status Change"],
"detail": {
"status": ["SUCCEEDED", "FAILED", "TIMED_OUT", "ABORTED"]
}
}
EventBridgeに通知される内容を引用しておきます。これは成功時のものです。
{
"version": "0",
"id": "315c1398-40ff-a850-213b-158f73e60175",
"detail-type": "Step Functions Execution Status Change",
"source": "aws.states",
"account": "012345678912",
"time": "2019-02-26T19:42:21Z",
"region": "us-east-1",
"resources": [
"arn:aws:states:us-east-1:012345678912:execution:state-machine-name:execution-name"
],
"detail": {
"executionArn": "arn:aws:states:us-east-1:012345678912:execution:state-machine-name:execution-name",
"stateMachineArn": "arn:aws:states:us-east-1:012345678912:stateMachine:state-machine",
"name": "execution-name",
"status": "SUCCEEDED",
"startDate": 1547148840101,
"stopDate": 1547148840122,
"input": "{}",
"inputDetails": {
"included": true
},
"output": "\"Hello World!\"",
"outputDetails": {
"included": true
}
}
}
Step Functions 実行ステータス変更用 EventBridge (CloudWatch Events) - AWS Step Functions
あとは検証に使用する適当なステートマシンを用意します。今回はマネジメントコンソールからデフォルトで用意されているHello Worldのステートマシンを作成しました。
それではこのステートマシンを実行し、Slackへ通知された内容を確認してみます。
うーん、ちょっと情報量が少ないですね……。成功か失敗かもわかりませんし、詳細を確認するリンクも欲しいところです。
入力トランスフォーマーを使用して通知内容をカスタマイズする
デフォルトの通知内容では情報量が少ないため、EventBridgeの入力トランスフォーマーを使用して、通知内容をカスタマイズしてみましょう。
マネジメントコンソールのEventBridgeのページで、[ルールを編集]→[ターゲットを選択]→[入力の設定]と移動します。
入力トランスフォーマーは 入力パス と 入力テンプレート に分かれています。入力パスでは入力テンプレートで使用したい変数を定義します。実際に渡される内容は入力テンプレートに定義します。今回はそれぞれ次のように定義しました。
こちらは入力パス。EventBridgeに渡される値からJSONパスを使って変数を定義しています。
{
"account": "$.account",
"detail-executionArn": "$.detail.executionArn",
"detail-input": "$.detail.input",
"detail-name": "$.detail.name",
"detail-status": "$.detail.status",
"detail-type": "$.detail-type",
"id": "$.id",
"region": "$.region",
"source": "$.source",
"time": "$.time",
"version": "$.version"
}
続いて入力テンプレート。ほとんどが再定義しているだけですが、detail-type
とresources
を変えています。試行錯誤してみたところ、detail
以外のフィールドは削ってはダメなようです。
{
"version": <version>,
"id": <id>,
"detail-type": "[<detail-status>] <detail-type>",
"source": <source>,
"account": <account>,
"time": <time>,
"region": <region>,
"resources": [
"https://<region>.console.aws.amazon.com/states/home?region=<region>#/executions/details/<detail-executionArn>",<detail-input>
]
}
これらを定義したうえでもう一度ステートマシンを実行してみます。通知された内容は次のもの。
SUCCEEDED
とステータスがわかります。また詳細を確認するためのリンクもきちんと通知されていますね。どうやらdetail-type
が通知のタイトルに、resources
の内容がリストとして表示されるようです。これを元にすれば通知に出したい内容(今回はリンクと入力パラメーター)を好きにカスタマイズできそうですね。
まとめ
Step Functionsの実行完了をSlackに通知させてみました。デフォルトの内容では少々物足りないものでしたが、入力トランスフォーマーを使用すればカバーできそうです。
ちなみにタイトル部分をマネジメントコンソールのリンクにしようとしてみましたが、こちらは断念しました。成功した方はやり方を教えてください。