將 HTTP 或 HTTPS 端點訂閱至 Amazon Simple Notification Service (Amazon SNS) 主題時,我無法收到訂閱確認通知。
解決方法
將 HTTP(S) 端點訂閱至 SNS 主題之前,您必須確認 HTTP(S) 端點已準備好處理 Amazon SNS 訊息。
**注意:**以下步驟也適用於 HTTP(S) 訂閱處於已確認狀態,但您仍未收到通知的案例。
在訂閱 SNS 主題之前,請確認您的 HTTP(S) 端點是否可公開存取
Amazon SNS 不支援私有 HTTP(S) 端點。當您訂閱 SNS 主題的 HTTP(S) 端點時,Amazon 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
如果您訂閱的 HTTP 端點無法公開存取 SNS 主題,則會收到以下錯誤訊息:
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 Editor 網站) 支援的其他選用參數。例如:
WWW-Authenticate: Basic
摘要存取驗證:
您的端點收到未經驗證的請求時,它將傳回 HTTP/1.1 401 未經授權的標頭回應和 "WWW-Authenticate" 標頭。標頭值必須包含以下內容:
- 關鍵字摘要
- 隨機產生的一次性值,稱為 "nonce"
- 身分驗證範圍
- RFC 2617 支援的其他選用參數 (來自 RFC Editor 網站)
例如:
WWW-Authenticate: Digest realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
設定交付狀態日誌記錄
請完成下列步驟:
- 為您的 SNS 主題設定交付狀態日誌。
- 檢視 SNS 訂閱確認通知交付的日誌資料,此資料是在您嘗試訂閱 HTTP(S) 端點時產生。
失敗日誌 (如果有的話) 將在日誌群組中以下列格式產生:
sns/your_aws_region/your_account_ID/your_topic_name/Failure
**注意:**若要瞭解訂閱確認通知交付失敗的原因,請查看 Amazon CloudWatch 交付狀態日誌中的 providerResponse。
檢查您 HTTPS 端點的 SSL 憑證
如果您使用 HTTPS 端點,請完成下列疑難排解步驟:
-
確認端點傳回的 SSL 憑證有效,且由 Amazon SNS 信任的憑證授權單位簽署。
-
確認您的端點傳回完整的憑證鏈結。完整的鏈結包括所有中繼憑證。
**注意:**您可以使用第三方工具驗證端點傳回的 SSL 憑證是否受信任且完整。例如,您可以使用 SSL Labs 網站的 SSL Server Test。
或者,如果要驗證端點傳回的 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) 端點是否具有訂閱篩選器政策
如果您的端點處於訂閱狀態,但未收到主題通知,請完成以下步驟:
- 檢查您的端點是否已設定訂閱篩選器政策。如果您的 HTTP(S) 訂閱具有篩選器政策,則可能會篩選通知。
- 若要確認您的 SNS 訊息已經過篩選,請檢查下列 CloudWatch 指標: NumberOfNotificationsFilteredOut、NumberOfNotificationsFilteredOut-InvalidAttributes 和 NumberOfNotificationsFilteredOut-NoMessageAttributes。