내용으로 건너뛰기

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

3분 분량
0

Amazon Simple Notification Service(Amazon SNS) 메시지에서 Amazon Chime, Slack 또는 Microsoft Teams로 알림을 보내고 싶습니다.

간략한 설명

Amazon SNS를 사용하여 웹훅 URL과 같은 HTTP 또는 HTTPS 엔드포인트에 알림 메시지를 보낼 수 있습니다. 하지만 특정 웹훅은 HTTP 또는 HTTPS 구독이 확인될 때 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 함수를 만듭니다. Lambda 함수 코드에는 사용 중인 웹훅 엔드포인트 유형에 맞게 SNS 주제의 알림 메시지를 변환하는 로직이 포함되어야 합니다.

예시는 다음과 같은 Amazon Chime, Slack, Microsoft Teams 웹훅용 Python 코드 스니펫을 참조하십시오.

Amazon Chime용 Python 코드 스니펫 예시

Amazon Chime 웹훅에는 Content 키에 해당하는 메시지 문자열이 포함된 JSON 요청이 필요합니다. 자세한 내용은 Amazon Chime용 웹훅 생성을 참조하십시오.

import urllib3import 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,
        }
    )

참고: https://hooks.chime.aws/incomingwebhooks/xxxxxxx를 웹훅 URL로 바꾸십시오.

Slack용 Python 코드 스니펫 예시

Slack 웹훅에는 text 키에 해당하는 메시지 문자열이 포함된 JSON 요청이 필요합니다. 또한 사용자 이름 및 아이콘을 추가하거나 웹훅의 기본 채널을 재정의하기 위해 메시지 사용자 지정을 지원합니다. 자세한 내용은 Slack 웹사이트에서 수신 웹훅을 사용하여 메시지 보내기를 참조하십시오.

import urllib3import 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,
        }
    )

참고: https://hooks.slack.com/services/xxxxxxx를 웹훅 URL로, #CHANNEL_NAME을 대상 채널 이름으로 바꾸십시오.

Microsoft Teams용 Python 코드 스니펫 예시

Microsoft Teams 웹훅에는 text 키에 해당하는 메시지 문자열이 포함된 JSON 요청이 필요합니다. 자세한 내용을 보려면 Microsoft Teams 웹사이트에서 메시지 생성 및 보내기를 참조하십시오.

import urllib3import 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,
        }
    )

참고: https://outlook.office.com/webhook/xxxxxxx를 웹훅 URL로 바꾸십시오.

Lambda 함수 테스트

다음 단계를 완료합니다.

  1. Lambda 콘솔의 함수 페이지에서 함수를 선택합니다.
  2. 테스트 탭을 엽니다. 이벤트 이름에 이름을 입력합니다.
  3. 템플릿 드롭다운 목록을 선택하고, SNS 주제 알림을 선택합니다.
  4. 저장을 선택하고, 실행을 선택합니다.

상태 코드 200으로 테스트 호출이 성공하면 웹훅에서 Amazon SNS 알림 메시지를 수락하여 채널로 전송한 것입니다.

테스트 호출이 4xx 상태 코드와 함께 실패하는 경우 웹훅 URL 키-값 쌍이 올바르고 대상 웹훅에서 수락되는지 확인하십시오.

자세한 내용은 콘솔 코드 편집기를 사용하여 Lambda 함수 호출을 참조하십시오.

SNS 주제 추제 및 Lambda 함수 구독

다음 단계를 완료합니다.

  1. Lambda 콘솔의 함수 페이지에서 함수를 선택합니다.
  2. 함수 개요에서 트리거 추가를 선택합니다.
  3. 트리거 구성 드롭다운 목록을 선택하고, SNS를 선택합니다.
  4. SNS 주제에서 이전에 생성한 SNS 주제를 선택합니다.
  5. 추가를 선택합니다.
  6. SNS 주제에 대해 Lambda 함수를 구독합니다.

SNS 주제에 대해 함수를 구독하면 주제에 게시된 메시지가 함수로 전달된 다음 웹훅으로 전달됩니다.

관련 정보

CloudFormation의 푸시 기반 이벤트 소스에 Lambda 함수를 구독할 때 발생하는 오류를 어떻게 해결할 수 있습니까?

채팅 애플리케이션에서 Amazon Q Developer를 사용하여 AWS 서비스 모니터링