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

최종 업데이트 날짜: 2020년 4월 29일

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 Incoming Webhook은 모두 "text" 키에 해당하는 메시지 문자열로 JSON 요청을 예상합니다.

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

AWS Lambda 함수를 사용하여 Webhook 엔드포인트가 처리할 Amazon SNS 메시지 본문 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 Webhook은 "Content" 키에 해당하는 메시지 문자열이 포함된 JSON 요청을 예상합니다. 자세한 내용은 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 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 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 주제에 구독합니다. SNS 주제 트리거를 추가하여 Lambda 콘솔에서 이를 구성할 수 있습니다.

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

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

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

팁: 경보가 트리거되면 Amazon CloudWatch 경보를 사용하여 Amazon Chime, Slack 또는 Microsoft Teams에서 Amazon SNS 알림을 받을 수 있습니다.