我已设置 AWS SNS 设置,主题为“A”。我正在使用 Http 订阅此 SNS 主题(尝试手动使用 AWS 控制台在线和使用 Java 代码)。在这两种情况下,我得到的只是“等待确认”。但是,SNS 不会将初始“订阅确认”发送到提供的 URL。
请注意,我的端点已准备好接收 http POST 通知。当我从我这边手动执行 POST 时,我看到我的 servlet 正在处理我发送的那些 Json。由于某种原因,我没有从 AWS SNS 收到任何信息。
请注意,我用于订阅的 http 端点是面向公众的,因此 SNS 应该没有问题到达它。
如有任何意见,我们将不胜感激。
这是我的订阅功能。
public String subscribe(String arn,String url) {
if(arn == null || arn.isEmpty())
arn = topicArn;
SubscribeRequest subRequest = new SubscribeRequest(arn,"http",url);
SubscribeResult result = snsClient.subscribe(subRequest);
//get request id for SubscribeRequest from SNS metadata
if(result != null){
LOGGER.info("SubscribeResult - " + result.toString());
}
LOGGER.info("SubscribeRequest - " + snsClient.getCachedResponseMetadata(subRequest));
return result.toString();
}
您始终会收到“待确认”作为订阅Arn 的响应。 确认过程作为一个单独的过程异步进行。 更令人困惑的是,如果您调用获取当前订阅列表,它们将显示略有不同的“PendingConfirmation”subscriptionArn,因此您以后甚至无法匹配它。
就能够连接而言,我会首先尝试连接 AWS 之外的端点。 默认情况下,大多数 AWS 元素都被严格锁定,甚至无法相互连接,因此可能需要更改某处的安全设置才能让 SNS 连接到您的 EC2。 这就是为什么您可以连接到 AWS 外部的 EC2,但您的 SNS 服务却不能。
还要检查并确保您使用的 SNS 和 EC2 位于同一区域。 这是连接问题的常见原因。
如果您使用主机名进行连接,我会尝试使用直接 IP 来查看是否可以通过。
要进行故障排除,您应该在主题操作中打开“交付状态”报告 - https://docs.aws.amazon.com/sns/latest/dg/sns-msg-status.html。然后你就会明白为什么AWS端发送确认消息失败了。
在 EC2 实例端,在网络级别,您必须确保您正在侦听的端口是从外部打开的。有几件事:确保端口在防火墙中打开(安全组设置),并确保 IP 可访问(即确保计算机所在的 VPC 是公开可见的)。
我遇到了同样的问题,该地区是问题所在。
确保SNS、CloudWatch 和 EC2 位于同一区域。
对我来说,禁用该主题的加密可以让电子邮件最终被发送,尽管是被发送到垃圾邮件文件夹。
您是否尝试过导航到 AWS 控制台,转至主题 > 订阅,然后勾选处于“待处理”状态的订阅,然后点击请求确认按钮? 这对我有用,因为我能够转到端点并获取 URL,然后点击“确认订阅”并将 URL 粘贴到其中。然后我的订阅从待定变为已确认。
以下是 AWS 在创建订阅时关于确认的说明: 订阅终端节点后,Amazon SNS 会向终端节点发送一条订阅确认消息。端点处的代码必须从订阅确认消息中检索 SubscribeURL,然后访问 SubscribeURL 指定的位置或将其提供给您,以便您可以手动访问 SubscribeURL(例如,使用 Web 浏览器)。 在确认订阅之前,Amazon SNS 不会向终端节点发送消息。当您访问 SubscribeURL 时,响应包含一个 XML 文档,该文档又包含指定订阅 ARN 的元素 SubscriptionArn。 您还可以使用 Amazon SNS 控制台验证订阅是否已确认:订阅 ID 显示订阅的 ARN,而不是您首次添加订阅时的 PendingConfirmation 值。