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

最終更新日: 2021 年 2 月 17 日

ウェブフックを使用して、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 ウェブサイトの「Setting up a custom incoming webhook」を参照してください。

注: この 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. 右上の [Select a test event] (テストイベントの選択) を選択します。その後、[Configure test events] (テストイベントの設定) を選択します。
  3. [Configure test event] (テストイベントの設定) ダイアログボックスで、[Create new test event] (新しいテストイベントの作成) を選択します。
  4. [Event template] では、[Amazon SNS Topic Notification] を選択します。
  5. [Event name] には、テストイベントの名前を入力します。
  6. [Create] をクリックします。
  7. [Test] を選択します。
  8. [Execution result] (実行結果) を確認します。

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

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

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

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

  1. Lambda コンソールの関数ページで関数を選択します。
  2. [Designer] で、[Add trigger] (トリガーを追加) を選択します。詳細については、「デザイナーを使用する」をご参照ください。
  3. [Trigger configuration] (トリガーの設定) で、[Select a trigger] (トリガーの選択)、[SNS] の順に選択します。
  4. [SNS topic] では、以前に作成した SNS トピックを選択します。
  5. [Enable trigger] チェックボックスをオンにします。
  6. [Add] (追加) を選択します。

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

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

注: 他の AWS のサービスを通じて Amazon SNS 通知を取得する方法については、「AWS Chatbot を他の AWS のサービスで使用する」をご参照ください。