Webhook를 사용하여 Amazon SNS 메시지를 Amazon Chime, Slack 또는 Microsoft Teams에 게시하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 2월 17일

Webhook를 사용하여 AWS 환경을 Amazon Chime 채팅룸이나 Slack 또는 Microsoft Teams 채널에 연결하고 싶습니다. Amazon Simple Notification Service(Amazon SNS)에서 Webhook로 알림을 보내려면 어떻게 해야 합니까?

간략한 설명

Amazon SNS를 사용하여 Webhook URL과 같은 HTTP(S) 엔드포인트에 알림 메시지를 전송할 수 있습니다. 하지만 일부 Webhook에서는 HTTP(S) 구독을 확인할 때 Amazon SNS가 지원하지 않는 JSON 키–값 페어를 예상합니다.

예를 들어 Amazon Chime Webhook는 "Content" 키에 해당하는 메시지 문자열이 포함된 JSON 요청을 예상합니다. 마찬가지로 Slack 및 Microsoft Teams Webhook는 모두 "text" 키에 해당하는 메시지 문자열로 JSON 요청을 예상합니다.

Webhook 엔드포인트가 처리할 Amazon SNS 메시지 본문 JSON 문서를 변환하려면 AWS Lambda 함수를 사용합니다.

참고: Amazon SNS 메시지 본문 JSON 문서의 키–값 페어 목록은 HTTP/HTTPS 알림 JSON 형식을 참조하십시오.

해결 방법

SNS 주제 생성

아직 생성하지 않았다면 고유한 이름으로 SNS 주제를 생성하십시오.

Lambda 함수 생성

Lambda 함수 생성에 대한 지침은 AWS Lambda 시작하기를 참조하십시오. 자세한 내용은 Amazon SNS에서 AWS Lambda 사용을 참조하십시오.

Lambda 함수 코드에 사용 중인 Webhook 엔드포인트 유형에 맞게 SNS 주제의 알림 메시지를 변환하는 로직이 포함되어야 합니다. 예를 들어 Amazon Chime, Slack 및 Microsoft Teams Webhook용 Python 코드 조각을 참조하십시오. 이 코드 예제는 있는 그대로 제공됩니다. Python 3.6 런타임과 호환됩니다.

Amazon Chime용 Python 코드 조각 예제

Amazon Chime Webhook는 "Content" 키에 해당하는 메시지 문자열이 포함된 JSON 요청을 예상합니다. 자세한 내용은 Webhooks for Amazon Chime을 참조하십시오.

참고: Amazon Chime Webhook에 대한 이 예제 함수 코드에서 https://hooks.chime.aws/incomingwebhooks/xxxxxxx를 Webhook 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 요청을 예상합니다. 또한 사용자 이름 및 아이콘을 추가하거나 Webhook의 기본 채널을 재정의하는 등 메시지 사용자 지정을 지원합니다. 자세한 내용은 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용 Python 코드 조각 예제

Microsoft Teams Incoming Webhook도 "text" 키에 해당하는 메시지 문자열이 포함된 JSON 요청을 예상합니다. 자세한 내용은 Microsoft Docs 웹 사이트의 Setting up a custom incoming webhook을 참조하십시오.

참고: Microsoft Teams Incoming Webhook에 대한 이 예제 함수 코드에서 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. 오른쪽 상단에서 테스트 이벤트 선택을 선택합니다. 그런 다음 테스트 이벤트 구성을 선택합니다.
  3. 테스트 이벤트 구성 대화 상자에서 새 테스트 이벤트 생성을 선택합니다.
  4. [이벤트 템플릿]에서 [Amazon SNS 주제 알림]을 선택합니다.
  5. [이벤트 이름]에 테스트 이벤트의 이름을 입력합니다.
  6. [생성]을 선택합니다.
  7. [테스트]를 선택합니다.
  8. 실행 결과를 검토합니다.

테스트 호출이 200 상태 코드와 함께 성공하면 Webhook에서 Amazon SNS 알림 메시지를 수락하여 해당 채널로 전송합니다. 호출이 4xx 상태 코드와 함께 실패할 경우 Webhook URL을 확인하고 키–값 페어가 올바르며 대상 Webhook에서 수락되는지 확인합니다.

Lambda 콘솔에서 함수를 테스트하는 방법에 대한 자세한 내용은 Lambda 함수 호출을 참조하십시오.

Lambda 함수에 SNS 주제 트리거 추가

Lambda 콘솔에서 테스트로 Webhook에 SNS 메시지를 전송하는 데 성공했으면 함수를 SNS 주제에 구독합니다. Lambda 콘솔에서 이를 구성하려면 다음을 수행하여 SNS 주제 트리거를 추가합니다.

  1. Lambda 콘솔의 함수 페이지에서 함수를 선택합니다.
  2. 디자이너에서 트리거 추가를 선택합니다. 자세한 내용은 디자이너 사용을 참조하십시오.
  3. 트리거 구성에서 트리거 선택을 선택한 다음 SNS를 선택합니다.
  4. [SNS 주제]에서 이전에 생성한 SNS 주제를 선택합니다.
  5. [트리거 활성화] 확인란을 선택합니다.
  6. 추가를 선택합니다.

자세한 내용은 AWS Lambda 콘솔에서 함수 구성을 참조하십시오.

함수가 SNS 주제를 구독하면 주제에 게시된 메시지가 함수로 전달된 후 Webhook로 전달됩니다.

참고: 다른 AWS 서비스를 통해 Amazon SNS 알림을 받는 방법에 대한 자세한 내용은 다른 AWS 서비스에서 AWS Chatbot 사용을 참조하십시오.