AWS Step FunctionsでWorkflowsを利用しTeams通知してみた(JSONata)
はじめに
以前、JSONPathを利用したAWS Step Functionsで、Incoming Webhookを利用してTeams通知したブログを執筆しました。
今回は、JSONataを利用したAWS Step Functionsで、Incoming Webhookではなく、Workflowsを使ってTeamsに通知します。
Incoming Webhookは廃止予定であり、公式の情報によると、2025年12月ごろまでに移行が推奨されています。
Microsoft TeamsのOfficeコネクタが廃止される予定で、その中にIncoming Webhookが含まれています。廃止に伴い、移行先としてWorkflowsを使うことが推奨されています。
また、AWS Step FunctionsではJSONataを利用できるようになっています。JSONataは、JSONデータのクエリや変換、加工を行うための言語で、AWSでもステートマシンでのJSONataの利用を推奨しています。
全体の構成は以下の通りです。HTTPタスクを利用してTeamsに通知します。
HTTPタスクは、Step Functionsの機能の1つで、Microsoft TeamsやSalesforceなどのサードパーティのAPIを直接呼び出すことができます。
HTTPタスクでは、API呼び出しの認証情報をEventBridge接続で管理できるため、シークレットをステートマシン定義にハードコーディングすることを避けられます。
WorkflowsでTeamsのWebhook URLを発行
Workflowを作成し、発行されたWebhook URLを取得します。
Workflowの作成方法については、以下の記事をご参照ください。
EventBridge接続を作成
EventBridge接続では、APIキー名をContent-Type
、キーの値をapplication/json
と指定して作成します。
作成すると、EventBridge接続の情報を保存するSecrets Managerのシークレットが自動作成されます。
Step Functionsステートマシンを作成
フローには、Call third-party API
のみを挿入します。
コード全体(クリックで展開)
{
"Comment": "A description of my state machine",
"StartAt": "Call HTTPS APIs",
"States": {
"Call HTTPS APIs": {
"Type": "Task",
"Resource": "arn:aws:states:::http:invoke",
"Arguments": {
"ApiEndpoint": "https://xxxjapaneast.logic.azure.com/workflows/xxxxxxxxxx/triggers/manual/paths/invoke",
"Method": "POST",
"InvocationConfig": {
"ConnectionArn": "arn:aws:events:ap-northeast-1:アカウントID:connection/teams/95886171-4978-49f4-93b7-b89b427ed190"
},
"RequestBody": {
"type": "message",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"type": "AdaptiveCard",
"body": [
{
"type": "TextBlock",
"text": "<at>平井 裕二</at>",
"weight": "bolder",
"size": "medium"
},
{
"type": "TextBlock",
"text": "アラート通知です",
"size": "Large",
"wrap": true,
"weight": "Bolder"
},
{
"type": "Table",
"columns": [
{
"width": 1
},
{
"width": 2
}
],
"rows": [
{
"type": "TableRow",
"cells": [
{
"type": "TableCell",
"items": [
{
"type": "TextBlock",
"text": "項目",
"weight": "Bolder"
}
]
},
{
"type": "TableCell",
"items": [
{
"type": "TextBlock",
"wrap": true,
"text": "内容"
}
]
}
]
},
{
"type": "TableRow",
"cells": [
{
"type": "TableCell",
"items": [
{
"type": "TextBlock",
"text": "test",
"weight": "Bolder"
}
]
},
{
"type": "TableCell",
"items": [
{
"type": "TextBlock",
"wrap": true,
"text": "hoge"
}
]
}
]
}
]
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"msteams": {
"width": "full",
"entities": [
{
"type": "mention",
"text": "<at>平井 裕二</at>",
"mentioned": {
"id": "example@example.com",
"name": "平井 裕二"
}
}
]
}
}
}
]
},
"QueryParameters": {
"api-version": "2016-06-01",
"sig": "xxxxxxxx-xxxxxxx",
"sp": "/triggers/manual/run",
"sv": "1.0"
}
},
"Retry": [
{
"ErrorEquals": [
"States.ALL"
],
"BackoffRate": 2,
"IntervalSeconds": 1,
"MaxAttempts": 3,
"JitterStrategy": "FULL"
}
],
"End": true
}
},
"QueryLanguage": "JSONata"
}
設定内容
TeamsのWebhookURLを以下だと仮定します。
APIエンドポイントは以下を設定します。
- https://xxx.japaneast.logic.azure.com/workflows/xxxxxxxxxx/triggers/manual/paths/invoke
:443
は削除します- クエリストリング以降は削除します
[設定]タブで以下の設定を行います。[入力]、[出力]、[エラー処理]タブはデフォルトのままです。
- APIエンドポイント:TeamsのWebhook URL
- メソッド:POST
- 接続:先ほど作成したEventBridge接続
クエリパラメータは以下の通りです(クエリストリング以降を利用)。
{
"api-version": "2016-06-01",
"sig": "xxxxxxxx-xxxxxxx",
"sp": "/triggers/manual/run",
"sv": "1.0"
}
リクエスト本文は以下のとおりです。
{
"type": "message",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"type": "AdaptiveCard",
"body": [
{
"type": "TextBlock",
"text": "<at>平井 裕二</at>",
"weight": "bolder",
"size": "medium"
},
{
"type": "TextBlock",
"text": "アラート通知です",
"size": "Large",
"wrap": true,
"weight": "Bolder"
},
{
"type": "Table",
"columns": [
{
"width": 1
},
{
"width": 2
}
],
"rows": [
{
"type": "TableRow",
"cells": [
{
"type": "TableCell",
"items": [
{
"type": "TextBlock",
"text": "項目",
"weight": "Bolder"
}
]
},
{
"type": "TableCell",
"items": [
{
"type": "TextBlock",
"wrap": true,
"text": "内容"
}
]
}
]
},
{
"type": "TableRow",
"cells": [
{
"type": "TableCell",
"items": [
{
"type": "TextBlock",
"text": "test",
"weight": "Bolder"
}
]
},
{
"type": "TableCell",
"items": [
{
"type": "TextBlock",
"wrap": true,
"text": "hoge"
}
]
}
]
}
]
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"msteams": {
"width": "full",
"entities": [
{
"type": "mention",
"text": "<at>平井 裕二</at>",
"mentioned": {
"id": "xxx@example.com",
"name": "平井 裕二"
}
}
]
}
}
}
]
}
メンション設定
リクエスト本文のid
とname
は、メンション対象者に応じて変更してください。
attachments.0.content.body.0.text
:ユーザー名を指定し、<at></at>
で囲むattachments.0.content.msteams.entities.0.text
:ユーザー名を指定し、<at></at>
で囲むattachments.0.content.msteams.entities.0.mentioned.id
:ユーザーのメールアドレス(xxxx@example.com
)を指定attachments.0.content.msteams.entities.0.mentioned.name
:ユーザー名を指定
IAMロール
ステートマシン作成時、IAMロールも自動作成されます。
テスト
ステートマシンを実行すると、Teamsに通知されました。
利用ケース
以下のような場面での活用が考えられます。
- 障害検知時にTeamsに通知し、メンバーにメンションを送る
- バッチ処理の完了をTeamsに通知する
Step Functionsの利点は、柔軟なワークフローを組み立てながら、Teams通知を組み込める点です。ぜひ活用してみてください。
参考