使用 AWS re:Post 即表示您同意 AWS re:Post 使用條款

將 HTTP(S) 端點訂閱至 Amazon SNS 主題時,如何疑難排解此問題?

2 分的閱讀內容
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) 端點。當您訂閱 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"

設定交付狀態日誌記錄

請完成下列步驟:

  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 指標NumberOfNotificationsFilteredOutNumberOfNotificationsFilteredOut-InvalidAttributesNumberOfNotificationsFilteredOut-NoMessageAttributes
AWS 官方
AWS 官方已更新 1 年前