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

所要時間3分
0

Webhook を使って、AWS 環境を Amazon Chime チャットルームや Slack チャンネル、Microsoft Teams チャンネルに接続しようと思います。Amazon Simple Notification Service (Amazon SNS) から Webhook に通知を送信する方法を教えてください。

簡単な説明

Amazon SNS を使用して Webhook URL などの通知メッセージを HTTP エンドポイントまたは HTTPS エンドポイントに送信することができます。ただし、一部の Webhook では HTTP サブスクリプションまたは HTTPS サブスクリプションを確認する際に、Amazon SNS がサポートしていない JSON キーと値のペアを想定します。

例えば、Amazon Chime Webhook は、「Content」キーに対応するメッセージ文字列を含む JSON リクエストを想定します。同様に、SlackとMicrosoft Teamsの Webhook はどちらも、「テキスト」キーに対応するメッセージ文字列を含むJSONリクエストを想定します。

Amazon SNS メッセージ本文 JSON ドキュメントを Webhook エンドポイントが処理できるように変換するには、 AWS Lambda 関数を使用します。

**注:**Amazon SNS メッセージ本文 JSON ドキュメント内のキーと値のペアのリストについては、「HTTP/HTTPS 通知の JSON 形式」を参照してください。

解決策

SNS トピックを作成する

まだ作成していない場合は、一意の名前で SNS トピックを作成してください。

Lambda 関数を作成する

Lambda 関数を作成する手順については、「Getting Started with AWS Lambda」を参照してください。詳細については、「Using AWS Lambda with Amazon SNS」を参照してください。

Lambda 関数コードには、使用している Webhook エンドポイントのタイプに合わせて SNS トピックの通知メッセージを変換するロジックを含める必要があります。例については、Amazon Chime、Slack、および Microsoft Teams Webhook 用の次の Python コードスニペットを参照してください。これらのコード例は特に手を入れていません。これらは Python 3.7 ランタイム と互換性があります。

Amazon Chime の Python コードスニペットの例

Amazon Chime Webhook では、**「コンテンツ」**キーに対応するメッセージ文字列が含まれる JSON リクエストを想定します。詳細については、「 Webhooks for Amazon Chime」を参照してください。

注:この Amazon Chime Webhook のサンプル関数コードでは、 https://hooks.chime.aws/incomingwebhooks/xxxxxxx を Webhook URL に置き換えてください。

import urllib3
import 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,
        }
    )

**Slack の Python コードスニペットの例 **

Slack 受信 Webhook では、**「テキスト」**キーに対応するメッセージ文字列を含む JSON リクエストを想定します。また、ユーザー名やアイコンの追加や、Webhook のデフォルトチャンネルのオーバーライドなど、メッセージのカスタマイズもサポートしています。詳細については、Slack ウェブサイトの「Sending messages using incoming webhooks 」を参照してください。

注:この Slack 受信 Webhook 用のサンプル関数コードでは、https://hooks.slack.com/services/xxxxxxx を着信 Webhook URL に置き換えてください。また、#CHANNEL\ _NAME は宛先チャンネルの名前に置き換えてください。

import urllib3
import 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,
        }
    )

**Microsoft Teams の Python コードスニペットの例 **

Microsoft Teams の受信 Webhook でも、「テキスト」キーに対応するメッセージ文字列を含む JSON リクエストを想定します。詳細については、Microsoft Docs サイトの「メッセージを作成して送信する 」を参照してください。

**注:**この Microsoft Teams 受信 Webhook のサンプル関数コードでは、https://outlook.office.com/webhook/xxxxxxx を Webhook URL に置き換えてください。

import urllib3
import 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,
        }
    )

Lambda 関数をテストする

  1. Lambda コンソールの [関数] ページで、関数を選択します。
  2. [テスト] ドロップダウンリストを選択します。次に、[テストイベントの設定] を選択します。
  3. [テストイベントの設定] ダイアログボックスで [新しいイベントを作成] を選択します。
  4. [イベントテンプレート][SNS トピック通知] を選択します。
  5. [イベント名] にテストイベントの名前を入力します。
  6. [保存] を選択します。
  7. 保存したら、[テスト] を選択します。次に、[実行結果] を確認します。
  • テスト呼び出しがステータスコード 200 で成功した場合:
    Amazon SNS 通知メッセージが Webhook によって受け入れられ、対応するチャネルに配信されます。
  • 呼び出しが 4xx ステータスコードで失敗した場合:
    Webhook URL で、キーと値のペアが正しく、宛先の Webhook で受け入れられていることを確認します。

Lambda コンソールでの関数のテストの詳細については、「Invoke the Lambda function」を参照してください。

SNS トピックトリガーを Lambda 関数に追加する

Lambda コンソールでテストとして SNS メッセージを Webhook に送信したら、関数を SNS トピックにサブスクライブします。Lambda コンソールでこれを設定するには、SNS トピックトリガーを追加します。

  1. Lambda コンソールの [関数] ページで、関数を選択します。
  2. [関数の概要][トリガーを追加] を選択します。詳細については、「Invoking Lambda functions」を参照してください。
  3. [トリガーの設定][トリガーを選択] を選択します。次に、[SNS] を選択します。
  4. **[SNS トピック] ** で、前に作成した SNS トピックを選択します。
  5. [追加] を選択します。

詳細については、「Configuring functions (console)」を参照してください。

関数が SNS トピックにサブスクライブされると、そのトピックに公開されたメッセージが関数に転送され、次に Webhook に転送されます。

**注:**他の AWS サービスで Amazon SNS 通知を受け取る方法については、「Monitoring AWS Services using AWS Chatbot」を参照してください。


関連情報

Adding webhooks to chat rooms

raw メッセージの配信

Lambda 関数を同じアカウントの Amazon SNS トピックにサブスクライブする方法を教えてください。

Lambda 関数を AWS CloudFormation のプッシュベースのイベントソースにサブスクライブする際にエラーが表示されます。その解決方法を教えてください。

コメントはありません