AWS Step Functionsの実行完了をAWS Chatbotを使っていい感じにSlackに通知する

こんにちは。サービスグループの武田です。AWS ChatbotがAmazon EventBridgeイベントに対応したことで利用の幅が一気に広がりましたね。今回はその中からAWS Step Functionsの通知を試してみました。
2022.02.28

こんにちは。サービスグループの武田です。

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-typeresourcesを変えています。試行錯誤してみたところ、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に通知させてみました。デフォルトの内容では少々物足りないものでしたが、入力トランスフォーマーを使用すればカバーできそうです。

ちなみにタイトル部分をマネジメントコンソールのリンクにしようとしてみましたが、こちらは断念しました。成功した方はやり方を教えてください。