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

最終更新日: 2020 年 4 月 29 日

ウェブフックを使用して、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 ドキュメントのキーと値のペアのリストについては、「HTTP/HTTPS 通知 JSON 形式」を参照してください。

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

解決方法

SNS トピックを作成する

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

Lambda 関数を作成する

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

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

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

注: この Slack Incoming Webhook の関数コードの例では、https://hooks.slack.com/services/xxxxxxx を Incoming Webhook 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 の着信ウェブフックは、「text」キーに対応するメッセージ文字列を含む JSON リクエストも想定しています。詳細については、Microsoft Docs ウェブサイトの「Setting up a custom incoming webhook」を参照してください。

注: この Microsoft Teams 着信ウェブフックの関数コードの例では、https://outlook.office.com/webhook/xxxxxxx を Webhook 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 を確認し、Key-Value ペアが正しく、送信先ウェブフックによって受け入れられていることを確認します。

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

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

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

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

ヒント: Amazon CloudWatch アラームを使用して、アラームがトリガーされたときに Amazon Chime、Slack、または Microsoft Teams で Amazon SNS 通知を取得します。