スキップしてコンテンツを表示

Webhook を使用して Amazon SNS メッセージを Amazon Chime、Slack、または Microsoft Teams に発行する方法を教えてください。

所要時間2分
0

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 関数をテストする

次の手順を実行します。

  1. Lambda コンソールの [関数] ページで該当する関数を選択します。
  2. [テスト] タブを開きます。[イベント名] に名前を入力します。
  3. [テンプレート] ドロップダウンリストを選択し、[SNS トピック通知] を選択します。
  4. [保存] を選択し、[テスト] を選択します。

テスト呼び出しが 200 ステータスコードで成功した場合、Amazon SNS 通知メッセージは Webhook によって受け付けられ、チャネルに配信されたことを示します。

テスト呼び出しが 4xx ステータスコードで失敗した場合は、Webhook URL のキーと値のペアが正しく、宛先 Webhook で受け付けられていることを確認してください。

詳細については、「コンソールのコードエディタを使用して Lambda 関数を呼び出す」を参照してください。

SNS トピックを追加し、Lambda 関数をサブスクライブさせる

次の手順を実行します。

  1. Lambda コンソールの [関数] ページで該当する関数を選択します。
  2. [関数の概要][トリガーを追加] を選択します。
  3. [トリガーの設定] ドロップダウンリストを選択し、[SNS] を選択します。
  4. **[SNS トピック] ** で先ほど作成した SNS トピックを選択します。
  5. [追加] を選択します。
  6. Lambda 関数を SNS トピックにサブスクライブします

関数を SNS トピックにサブスクライブさせると、そのトピックに発行されたメッセージが関数および Webhook に転送されます。

関連情報

Lambda 関数を AWS CloudFormation のプッシュベースのイベントソースにサブスクライブさせる際にエラーが発生するため、解決方法を教えてください

チャットアプリケーションで Amazon Q Developer を使用して AWS サービスを監視する

コメントはありません