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

最終更新日: 2022 年 8 月 11 日

ウェブフックを使用して、AWS 環境を Amazon Chime チャットルーム、または Slack や Microsoft Teams のチャネルに接続したいと考えています。Amazon Simple Notification Service (Amazon SNS) からウェブフックに通知を送信するにはどうすればよいですか?

簡単な説明

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

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

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

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

解決方法

SNS トピックを作成する

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

Lambda 関数を作成する

Lambda 関数を作成する手順については、「AWS Lambda の開始方法」を参照してください。詳細については、「Amazon SNS での AWS Lambda の使用」を参照してください。

Lambda 関数コードには、使用しているウェブフックエンドポイントのタイプに応じて SNS トピックの通知メッセージを変換するロジックを含める必要があります。例については、Amazon Chime、Slack、および Microsoft Teams のウェブフックに関する以下の Python コードスニペットをご覧ください。これらのコード例はそのまま提供されます。これらは、Python 3.6 ランタイムと互換性があります。

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

Amazon Chime のウェブフックは、「Content」キーに対応するメッセージ文字列を含む JSON リクエストを想定しています。詳細については、「Amazon Chime のウェブフック」を参照してください。

注: この Amazon Chime のウェブフックの関数コードの例では、https://hooks.chime.aws/incomingwebhooks/xxxxxxx をウェブフック URL に置き換えます。

#!/usr/bin/python3.6
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 Incoming Webhook は、「text」 キーに対応するメッセージ文字列を含む JSON リクエストを想定しています。また、ユーザー名やアイコンの追加、ウェブフックのデフォルトチャネルのオーバーライドなど、メッセージのカスタマイズもサポートしています。詳細については、Slack ウェブサイトの「Sending messages using incoming webhooks」をご参照ください。

注: この Slack Incoming Webhook の関数コードの例では、https://hooks.slack.com/services/xxxxxxx を着信ウェブフック URL に置き換えます。また、#CHANNEL_NAME を送信先チャネルの名前に置き換えます。

#!/usr/bin/python3.6
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 の着信ウェブフックは、「text」キーに対応するメッセージ文字列を含む JSON リクエストも想定しています。詳細については、Microsoft Docs ウェブサイトの「メッセージの作成と送信」を参照してください。

注意: この Microsoft Teams 着信ウェブフックの関数コードの例では、https://outlook.office.com/webhook/xxxxxxx をウェブフック URL に置き換えます。

#!/usr/bin/python3.6
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. [Test] (テスト) ドロップダウンリストを選択します。その後、[Configure test events] (テストイベントの設定) を選択します。
  3. [Configure test event] (テストイベントの設定) ダイアログボックスで、[Create new event] (新しいイベントの作成) を選択します。
  4. [Event template] (ベントテンプレート) で、[SNS Topic Notification] (SNS トピック通知) を選択します。
  5. [Event name] (イベント名) に、テストイベントの名前を入力します。
  6. [Save] (保存) を選択します。
  7. 保存したら、[Test] (テスト) を選択します。次に、[Execution result] (実行結果) を確認します。

テストの呼び出しが 200 ステータスコードで成功した場合、Amazon SNS 通知メッセージはウェブフックによって受け入れられ、対応するチャネルに配信されます。呼び出しが 4xx ステータスコードで失敗した場合は、ウェブフック URL を確認し、キーと値のペアが正しく、送信先ウェブフックによって受け入れられていることを確認します。

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

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

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

  1. Lambda コンソールの関数ページで関数を選択します。
  2. [Function overview] で、[Add trigger] を選択します。詳細については、AWS Lambda 関数の呼び出しを参照してください。
  3. [Trigger configuration] (トリガーの設定) で、[Select a trigger] (トリガーの選択) を選択します。 次に、[SNS] を選択します。
  4. [SNS topic] では、以前に作成した SNS トピックを選択します。
  5. [追加] を選択します。

詳細については、「コンソールでの関数の設定」を参照してください。

関数が SNS トピックにサブスクライブすると、トピックに発行されたメッセージが関数に転送されてから、ウェブフックに転送されます。

注意: 他の AWS のサービスを通じて Amazon SNS 通知を取得する方法については、「AWS Chatbot を使用した AWS のサービスのモニタリング」を参照してください。