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"
전송 상태 로깅 설정
다음 단계를 완료합니다.
- SNS 주제에 대한 전송 상태 로그를 설정합니다.
- HTTP(S) 엔드포인트를 구독하려고 할 때 생성되는 SNS 구독 확인 알림 전송에 대한 로그 데이터를 볼 수 있습니다.
실패 로그(있는 경우)는 다음과 같은 형식으로 로그 그룹에 생성됩니다.
sns/your_aws_region/your_account_ID/your_topic_name/Failure
참고: 구독 확인 알림이 전송에 실패한 이유를 알아보려면 Amazon CloudWatch 전송 상태 로그에서 providerResponse를 확인하세요.
HTTPS 엔드포인트의 SSL 인증서를 확인하세요.
HTTPS 엔드포인트를 사용하는 경우 다음 문제 해결 단계를 완료하세요.
-
엔드포인트에서 반환한 SSL 인증서가 유효하고 Amazon SNS가 신뢰하는 인증 기관이 서명했는지 확인합니다.
-
엔드포인트가 전체 인증서 체인을 반환하는지 확인합니다. 전체 체인에는 모든 중간 인증서가 포함됩니다.
참고: 타사 도구를 사용하여 엔드포인트에서 반환한 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) 엔드포인트에 구독 필터 정책이 있는지 확인
엔드포인트가 구독 상태이지만 주제 알림을 받지 못하는 경우 다음 단계를 완료하세요.
- 엔드포인트에 구독 필터 정책이 구성되어 있는지 확인합니다. HTTP(S) 구독에 필터 정책이 있는 경우 알림이 필터링될 수 있습니다.
- SNS 메시지가 필터링되고 있는지 확인하려면 다음 CloudWatch 지표를 확인하세요. NumberOfNotificationsFilteredOut, NumberOfNotificationsFilteredOut-InvalidAttributes 및 NumberOfNotificationsFilteredOut-NoMessageAttributes.