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

최종 업데이트 날짜: 2021년 6월 21일

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는 HTTP(S) 엔드포인트를 SNS 주제에 구독할 때 퍼블릭 인터넷을 통해 엔드포인트에 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 승인되지 않은 헤더 응답을 지원하는지 확인합니다.

기본 액세스 인증:

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

WWW-Authenticate: Basic

다이제스트 액세스 인증:

엔드포인트가 승인되지 않은 요청을 수신하면 HTTP/1.1 401 승인되지 않은 헤더 응답을 ‘WWW-Authenticate’ 헤더와 함께 반환해야 합니다. 헤더 값에는 키워드 ‘Digest’, ‘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) 엔드포인트를 차단하고 있는지 확인

방화벽이 SNS 구독 확인 알림을 HTTP(S) 엔드포인트에 전달하지 못하게 하는 경우 AWS 리전별 IP 주소를 허용합니다.

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

엔드포인트가 구독 상태이지만 주제 알림을 수신하지 않는 경우 다음 단계를 완료합니다.

1.    엔드포인트에 구독 필터 정책이 구성되어 있는지 확인합니다. HTTP(S) 구독에 필터 정책이 있는 경우 알림이 필터링될 수 있습니다.

2.    SNS 메시지가 필터링되고 있는지 확인하려면 NumberOfNotificationsFilteredOutNumberOfNotificationsFilteredOut-InvalidAttributes 및 NumberOfNotificationsFilteredOut-NoMessageAttributes과 같은 CloudWatch 지표를 확인합니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?