当我的 HTTP 或 HTTPS 端点订阅 Amazon Simple Notification Service(Amazon SNS)主题时,我无法收到订阅确认通知。
解决方法
在您的 HTTP (S) 端点订阅 SNS 主题之前,您必须确认 HTTP (S) 端点已准备好处理 Amazon SNS 消息。
**注意:**以下步骤也适用于您的 HTTP (S) 订阅处于已确认状态但仍未收到通知的情况。
在订阅 SNS 主题之前,请验证您的 HTTP (S) 端点是否可以公开访问
Amazon SNS 不支持私有 HTTP (S) 端点。当您的 HTTP (S) 端点订阅 SNS 主题时,Amazon SNS 通过公共互联网向您的端点发出 HTTP POST 请求。有关更多信息和示例 POST 请求,请参阅 Parsing message formats。
要检查您的端点是否可以公开访问,请从本地计算机发出示例 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”
- 随机生成的一次性使用值称为“随机数”
- 身份验证领域
- 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 实验室网站的 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.