Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
Webhook を使用して Amazon SNS メッセージを Amazon Chime、Slack、または Microsoft Teams に発行する方法を教えてください。
Amazon Simple Notification Service (Amazon SNS) メッセージから Amazon Chime、Slack、または Microsoft Teams に通知を送信したいです。
簡単な説明
Amazon SNS を使用すると、通知メッセージをWebhook の URL などの HTTP または HTTPS エンドポイントに送信できます。ただし、特定の Webhook では、HTTP または HTTPS での サブスクリプションを確認する際に、Amazon SNS がサポートしていない JSON キーと値のペアを想定します。
たとえば Amazon Chime の Webhook は、Content キーに対応するメッセージ文字列を含む JSON リクエストを想定します。同様に SlackとMicrosoft Teamsの Webhook は、text キーに対応するメッセージ文字列を含む JSON リクエストを想定します。
Amazon SNS メッセージ本文の JSON ドキュメントを変換し、Webhook エンドポイントが処理できるようにするには、AWS Lambda 関数を使用します。
注: Amazon SNS メッセージ本文の JSON ドキュメント内のキーと値のペアのリストについては、「HTTP/HTTPS サブスクリプションの確認用の JSON 形式」を参照してください。
解決策
SNS トピックを作成する
まだ作成していない場合は、一意の名前で SNS トピックを作成してください。
Lambda 関数を作成する
指示に従い、Lambda 関数を作成します。Lambda 関数コードには、使用している Webhook エンドポイントのタイプに応じて、SNS トピックの通知メッセージを変換するロジックを含める必要があります。
例については、Amazon Chime、Slack、および Microsoft Teams Webhook 用の次の Python コードスニペットを参照してください。
Amazon Chime 用の Python コードスニペットの例
Amazon Chime の Webhook は、Content キーに対応するメッセージ文字列を含む JSON リクエストを想定します。詳細については、「Amazon Chime 用の Webhooks を作成する」を参照してください。
import urllib3import json http = urllib3.PoolManager() def lambda_handler(event, context): url = "https://hooks.chime.aws/incomingwebhooks/xxxxxxx" msg = {"Content": event["Records"][0]["Sns"]["Message"]} encoded_msg = json.dumps(msg).encode("utf-8") resp = http.request("POST", url, body=encoded_msg) print( { "message": event["Records"][0]["Sns"]["Message"], "status_code": resp.status, "response": resp.data, } )
注: https://hooks.chime.aws/incomingwebhooks/xxxxxxx を実際の Webhook の URL に置き換えます。
Slack 用の Python コードスニペット例
Slack の Webhook では、text キーに対応するメッセージ文字列を含む JSON リクエストが必要です。なお、ユーザー名やアイコンを追加したり、Webhook のデフォルトチャンネルをオーバーライドしたりするためのメッセージのカスタマイズもサポートしています。詳細については、Slack のウェブサイトで「受信 Webhook を使用してメッセージを送信する」を参照してください。
import urllib3import json http = urllib3.PoolManager() def lambda_handler(event, context): url = "https://hooks.slack.com/services/xxxxxxx" msg = { "channel": "#CHANNEL_NAME", "username": "WEBHOOK_USERNAME", "text": event["Records"][0]["Sns"]["Message"], "icon_emoji": "", } encoded_msg = json.dumps(msg).encode("utf-8") resp = http.request("POST", url, body=encoded_msg) print( { "message": event["Records"][0]["Sns"]["Message"], "status_code": resp.status, "response": resp.data, } )
注: 実際のものでそれぞれ、https://hooks.slack.com/services/xxxxxxx を Webhook の URL に、#CHANNEL_NAME を宛先チャンネル名に置き換えます。
Microsoft Teams 用の Python コードスニペット例
Microsoft Teams ウェブフックでは、text キーに対応するメッセージ文字列を含む JSON リクエストが必要です。詳細については、Microsoft Teams のサイトで「メッセージの作成と送信」を参照してください。
import urllib3import json http = urllib3.PoolManager() def lambda_handler(event, context): url = "https://outlook.office.com/webhook/xxxxxxx" msg = {"text": event["Records"][0]["Sns"]["Message"]} encoded_msg = json.dumps(msg).encode("utf-8") resp = http.request("POST", url, body=encoded_msg) print( { "message": event["Records"][0]["Sns"]["Message"], "status_code": resp.status, "response": resp.data, } )
注: https://outlook.office.com/webhook/xxxxxxx を実際の Webhook の URL に置き換えます。
Lambda 関数をテストする
次の手順を実行します。
- Lambda コンソールの [関数] ページで該当する関数を選択します。
- [テスト] タブを開きます。[イベント名] に名前を入力します。
- [テンプレート] ドロップダウンリストを選択し、[SNS トピック通知] を選択します。
- [保存] を選択し、[テスト] を選択します。
テスト呼び出しが 200 ステータスコードで成功した場合、Amazon SNS 通知メッセージは Webhook によって受け付けられ、チャネルに配信されたことを示します。
テスト呼び出しが 4xx ステータスコードで失敗した場合は、Webhook URL のキーと値のペアが正しく、宛先 Webhook で受け付けられていることを確認してください。
詳細については、「コンソールのコードエディタを使用して Lambda 関数を呼び出す」を参照してください。
SNS トピックを追加し、Lambda 関数をサブスクライブさせる
次の手順を実行します。
- Lambda コンソールの [関数] ページで該当する関数を選択します。
- [関数の概要] で [トリガーを追加] を選択します。
- [トリガーの設定] ドロップダウンリストを選択し、[SNS] を選択します。
- **[SNS トピック] ** で先ほど作成した SNS トピックを選択します。
- [追加] を選択します。
- Lambda 関数を SNS トピックにサブスクライブします。
関数を SNS トピックにサブスクライブさせると、そのトピックに発行されたメッセージが関数および Webhook に転送されます。
関連情報
Lambda 関数を AWS CloudFormation のプッシュベースのイベントソースにサブスクライブさせる際にエラーが発生するため、解決方法を教えてください
- 言語
- 日本語

関連するコンテンツ
AWS公式更新しました 3年前
