Amazon SNS 주제에 HTTP(S) 엔드포인트를 구독할 때 발생하는 문제를 해결하려면 어떻게 해야 하나요?

4분 분량
0

HTTP 또는 HTTPS 엔드포인트에서 Amazon Simple Notification Service(Amazon SNS) 주제를 구독할 때 구독 확인 알림을 받을 수 없습니다.

해결 방법

HTTP(S) 엔드포인트의 SNS 주제를 구독하기 전에 HTTP(S) 엔드포인트가 Amazon SNS 메시지를 처리할 준비가 되었는지 확인해야 합니다.

참고: 다음 단계는 HTTP(S) 구독이 확인 상태이지만 여전히 알림을 받지 못하는 시나리오에도 적용됩니다.

SNS 주제를 구독하기 전에 HTTP(S) 엔드포인트에 공개적으로 액세스할 수 있는지 확인하세요.

Amazon SNS는 프라이빗 HTTP(S) 엔드포인트를 지원하지 않습니다. Amazon SNS는 사용자가 SNS 주제에 대한 HTTP(S) 엔드포인트를 구독할 때 퍼블릭 인터넷을 통해 엔드포인트에 HTTP POST 요청을 보냅니다. 자세한 내용 및 POST 요청 예는 메시지 형식 구문 분석을 참조하세요.

엔드포인트에 공개적으로 액세스할 수 있는지 확인하려면 로컬 머신에서 샘플 POST 요청을 생성하세요. 예를 들면, 다음과 같습니다.

curl -X POST your_HTTPS_endpoint -H "Content-Type:text/plain; charset=UTF-8" --data {"x":"y"} -v

엔드포인트에 공개적으로 액세스할 수 있는 경우 명령은 다음 HTTP 상태 코드를 반환합니다.

200 OK

SNS 주제에 공개적으로 액세스할 수 없는 HTTP 엔드포인트를 구독하는 경우 다음 오류가 발생합니다.

An error occurred (InvalidParameter) when calling the Subscribe operation: Invalid parameter: Unreachable Endpoint

중요: 호스트 이름은 밑줄을 포함할 수 없습니다. 예를 들어, 다음 호스트 이름은 허용되지 않습니다. your_hostname

엔드포인트 응답 헤더 검증

사용 중인 인증 유형(기본 또는 다이제스트 액세스 인증) 에 따라 다음 단계를 완료하세요. 엔드포인트가 **'https'**이고 HTTP/1.1 401 승인되지 않은 헤더 응답을 지원하는지 확인하세요.

기본 액세스 인증:

엔드포인트는 승인되지 않은 요청을 수신하면 “WWW-Authenticate” 헤더와 함께 HTTP/1.1 401 승인되지 않은 헤더 응답을 반환합니다. 헤더 값에는 “Basic”이라는 키워드와 RFC 2617에서 지원되는 기타 선택적 파라미터(RFC 편집기 웹 사이트 제공)가 포함되어야 합니다. 예를 들면, 다음과 같습니다.

WWW-Authenticate: Basic

다이제스트 액세스 인증:

엔드포인트는 승인되지 않은 요청을 수신하면 “WWW-Authenticate” 헤더와 함께 HTTP/1.1 401 승인되지 않은 헤더 응답을 반환합니다. 헤더 값에는 다음이 포함되어야 합니다.

  • 키워드 다이제스트
  • "nonce"라고 불리는 무작위로 생성된 일회용 값입니다.
  • 인증 영역
  • RFC 2617에서 지원되는 기타 선택적 파라미터(RFC 편집기 웹 사이트에서 제공)

예를 들면, 다음과 같습니다.

WWW-Authenticate: Digest realm="testrealm@host.com",
                        qop="auth,auth-int",
                        nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                        opaque="5ccc069c403ebaf9f0171e9517f40e41"

전송 상태 로깅 설정

다음 단계를 완료합니다.

  1. SNS 주제에 대한 전송 상태 로그를 설정합니다.
  2. HTTP(S) 엔드포인트를 구독하려고 할 때 생성되는 SNS 구독 확인 알림 전송에 대한 로그 데이터를 볼 수 있습니다.

실패 로그(있는 경우)는 다음과 같은 형식으로 로그 그룹에 생성됩니다.

sns/your_aws_region/your_account_ID/your_topic_name/Failure

참고: 구독 확인 알림이 전송에 실패한 이유를 알아보려면 Amazon CloudWatch 전송 상태 로그에서 providerResponse를 확인하세요.

HTTPS 엔드포인트의 SSL 인증서를 확인하세요.

HTTPS 엔드포인트를 사용하는 경우 다음 문제 해결 단계를 완료하세요.

  1. 엔드포인트에서 반환한 SSL 인증서가 유효하고 Amazon SNS가 신뢰하는 인증 기관이 서명했는지 확인합니다.

  2. 엔드포인트가 전체 인증서 체인을 반환하는지 확인합니다. 전체 체인에는 모든 중간 인증서가 포함됩니다.

    참고: 타사 도구를 사용하여 엔드포인트에서 반환한 SSL 인증서가 신뢰할 수 있고 완전한지 확인할 수 있습니다. 예를 들어 SSL Labs 웹 사이트에서 SSL 서버 테스트를 사용할 수 있습니다.

    또는 엔드포인트에서 반환한 SSL 인증서가 신뢰할 수 있고 완전한지 확인하려면 다음 OpenSSL 명령을 실행합니다.

    openssl s_client -connect yourHostname:443 -servername yourHostname -showcerts

    엔드포인트에서 반환한 SSL 인증서가 신뢰할 수 없거나 완전하지 않은 경우 CloudWatch 로그에서 다음과 같은 providerResponse를 확인할 수 있습니다.

    {
        "notification": {
            "messageId": "...",
            "topicArn": "arn:aws:sns:ap-northeast-1:***:***",
            "timestamp": "2021-05-12 06:41:20.778"
        },
        "delivery": {
            "deliveryId": "***",
            "destination": "https://***",
            "providerResponse": "SSLPeerUnverifiedException in HttpClient",
            "dwellTimeMs": 66171,
            "attempts": 4
        },
        "status": "FAILURE"
    }

방화벽이 HTTP(S) 엔드포인트를 차단하고 있는지 확인

방화벽으로 인해 HTTP(S) 엔드포인트에 SNS 구독 확인 알림을 전송할 수 없는 경우 AWS 리전별 IP 주소를 허용하세요.

HTTP(S) 엔드포인트에 구독 필터 정책이 있는지 확인

엔드포인트가 구독 상태이지만 주제 알림을 받지 못하는 경우 다음 단계를 완료하세요.

  1. 엔드포인트에 구독 필터 정책이 구성되어 있는지 확인합니다. HTTP(S) 구독에 필터 정책이 있는 경우 알림이 필터링될 수 있습니다.
  2. SNS 메시지가 필터링되고 있는지 확인하려면 다음 CloudWatch 지표를 확인하세요. NumberOfNotificationsFilteredOut, NumberOfNotificationsFilteredOut-InvalidAttributesNumberOfNotificationsFilteredOut-NoMessageAttributes.
AWS 공식
AWS 공식업데이트됨 9달 전