將 HTTP(S) 端點訂閱至 Amazon SNS 主題時,如何疑難排解此問題?
將 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」標頭。標頭值應包含關鍵字「Digest」,這是隨機產生的「nonce」一次性值、驗證範圍,以及 RFC 2617 (來自 RFC Editor 網站) 支援的其他選用參數。例如:
WWW-Authenticate: Digest realm="testrealm@host.com", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"
設定交付狀態日誌記錄
1. 設定 SNS 主題的交付狀態日誌。
2. 檢視 SNS 訂閱確認通知交付的日誌資料,此資料是在您嘗試訂閱 HTTP(S) 端點時產生。
失敗日誌 (如果有的話) 將在日誌群組中以下列格式產生:
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 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) 端點是否具有訂閱篩選器政策
如果您的端點處於訂閱狀態,但未收到主題通知,請完成以下步驟:
1. 查看您的端點是否已設定訂閱篩選器政策。如果您的 HTTP(S) 訂閱具有篩選器政策,則可能會篩選通知。
2. 若要確認您的 SNS 訊息已經過篩選,請查看以 CloudWatch 指標: NumberOfNotificationsFilteredOut、NumberOfNotificationsFilteredOut-InvalidAttributes 和 NumberOfNotificationsFilteredOut-NoMessageAttributes。
相關內容
- 已提問 10 個月前lg...
- 已提問 9 個月前lg...
- 已提問 10 個月前lg...
- 已提問 1 年前lg...
- 已提問 10 個月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 5 個月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前