第 1 步:确保您的终端节点已准备就绪,可以处理 Amazon SNS 消息 - Amazon Simple Notification Service

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

第 1 步:确保您的终端节点已准备就绪,可以处理 Amazon SNS 消息

在您HTTP或HTTPS终端节点订阅主题之前,必须确保HTTP或HTTPS终端节点能够处理 Amazon SNS 用于发送订阅确认和通知消息的HTTPPOST请求。通常,这意味着要创建和部署一个处理HTTP来自亚马逊的请求的网络应用程序(例如,如果您的终端节点主机运行的是带有 Apache 和 Tomcat 的 Linux,则为 Java servlet)。SNS当您订阅HTTP终端节点时,Amazon SNS 会向其发送订阅确认请求。创建订阅时,您的终端节点必须准备好接收和处理此请求,因为亚马逊当时SNS会发送此请求。在您确认订阅之前,Amazon SNS 不会向终端节点发送通知。确认订阅后,当对订阅的主题执行发布操作时,Amazon SNS 将向终端节点发送通知。

设置您的终端节点,处理订阅确认和通知消息
  1. 您的代码应读取 Amazon SNS 发送到您的终端节点的HTTPPOST请求HTTP标头。您的代码应查找标题字段x-amz-sns-message-type,该字段会告诉您 Amazon SNS 发送给您的消息类型。通过查看标头,您可以确定消息类型,而不必解析HTTP请求的正文。您需要处理如下两种类型消息:SubscriptionConfirmationNotification。仅当从主题中删除订阅时,方使用 UnsubscribeConfirmation 消息。

    有关HTTP标题的详细信息,请参阅HTTP/HTTPS标题。以下HTTPPOST请求是订阅确认消息的示例。

    POST / HTTP/1.1 x-amz-sns-message-type: SubscriptionConfirmation x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic Content-Length: 1336 Content-Type: text/plain; charset=UTF-8 Host: example.com Connection: Keep-Alive User-Agent: Amazon Simple Notification Service Agent { "Type" : "SubscriptionConfirmation", "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b", "Token" : "2336412f37f...", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...", "Timestamp" : "2012-04-26T20:45:04.751Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEpH+...", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem" }
  2. 您的代码应解析HTTPPOST请求正JSON文中的文档,然后使用内容键入 text/plain 来读取构成 Amazon 消息的名称/值对。SNS使用JSON解析器将控制字符的转义表示形式转换回其ASCII字符值(例如,将\ n 转换为换行符)。你可以使用现有的JSON解析器,比如 Jacks on JSON 处理器,也可以自己编写解析器。为了使主题和消息字段中的文本有效JSON,Amazon SNS 必须将某些控制字符转换为可以包含在JSON文档中的转义表示形式。当您收到发送到终端节点的POST请求正文中的JSON文档时,如果您想要精确表示原始主题和发布到该主题的消息,则必须将转义字符转换回其原始字符值。由于签名采用了原始形式的消息和主题作为待签字符串的一部分,因此如果您想要验证通知签名,则上述操作非常重要。

  3. 您的代码应验证 Amazon SNS 发送的通知、订阅确认或取消订阅确认消息的真实性。使用亚马逊SNS消息中包含的信息,您的终端节点可以重新创建签名,这样您就可以通过将您的签名与亚马逊随消息一起SNS发送的签名进行匹配来验证消息的内容。有关验证消息签名的更多信息,请参阅 验证 Amazon SNS 消息的签名

  4. 根据标题字段指定的类型x-amz-sns-message-type,您的代码应读取HTTP请求正文中包含的JSON文档并处理消息。这里是处理两大主要消息类型的指导原则:

    SubscriptionConfirmation

    阅读的值SubscribeURL并访问该值URL。要确认订阅并开始在终端节点上接收通知,您必须访问 SubscribeURLURL(例如,向发送HTTPGET请求URL)。请查看上一步中的示例HTTP请求,了解其SubscribeURL外观。有关 SubscriptionConfirmation 消息格式的更多信息,请参阅 HTTP/HTTPS订阅确认JSON格式。当你访问时URL,你会得到一个类似于以下XML文档的回复。该文档返回ConfirmSubscriptionResult元素内ARN终端节点的订阅。

    <ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/"> <ConfirmSubscriptionResult> <SubscriptionArn>arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55</SubscriptionArn> </ConfirmSubscriptionResult> <ResponseMetadata> <RequestId>075ecce8-8dac-11e1-bf80-f781d96e9307</RequestId> </ResponseMetadata> </ConfirmSubscriptionResponse>

    除了访问之外SubscribeURL,您还可以使用在SubscriptionConfirmation消息中Token设置相应值的ConfirmSubscription操作来确认订阅。如果您仅允许主题所有者和订阅所有者拥有取消订阅终端节点的权限,那么您可以通过 AWS 签名调用 ConfirmSubscription 操作。

    通知

    读取 SubjectMessage 值,获取已向主题发布的通知信息。

    有关 Notification 消息格式的详细信息,请参阅 HTTP/HTTPS标题。以下HTTPPOST请求是发送到终端节点 example.com 的通知消息的示例。

    POST / HTTP/1.1 x-amz-sns-message-type: Notification x-amz-sns-message-id: 22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324 x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96 Content-Length: 773 Content-Type: text/plain; charset=UTF-8 Host: example.com Connection: Keep-Alive User-Agent: Amazon Simple Notification Service Agent { "Type" : "Notification", "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "My First Message", "Message" : "Hello world!", "Timestamp" : "2012-05-02T00:54:06.655Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEw6JRN...", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem", "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96" }
  5. 确保您的终端节点使用相应的状态代码响应来自 SNS Amazon的HTTPPOST消息。连接将在大约 15 秒后超时。如果您的终端节点在连接超时之前没有响应,或者您的终端节点返回的状态代码超出了 200—4 xx 的范围,Amazon SNS 会将消息的传递视为失败的尝试。

  6. 请确保您的代码可以处理 Amazon SNS 的消息传送重试。如果 Amazon SNS 未收到来自您的终端节点的成功响应,它将尝试再次传送消息。这适用于包括订阅确认消息在内的所有消息。默认情况下,如果消息的初始传送失败,Amazon 最多会SNS尝试三次重试,失败尝试之间的延迟设置为 20 秒。

    注意

    消息请求将在大约 15 秒后超时。这意味着,如果消息传送失败是由超时造成的,Amazon 将在上SNS次尝试传送后重试大约 35 秒。您可以为终端节点设置不同的发送策略。

    亚马逊SNS使用标x-amz-sns-message-id题字段来唯一标识发布到亚马逊SNS主题的每条消息。通过将已处理IDs的消息与传入的消息进行比较,可以确定该消息是否为重试尝试。

  7. 如果您要订阅HTTPS终端节点,请确保您的终端节点具有来自可信证书颁发机构 (CA) 的服务器证书。Amazon 只SNS会向拥有由亚马逊信任的 CA 签署的服务器证书的HTTPS终端节点发送消息SNS。

  8. 部署您创建的用于接收 Amazon SNS 消息的代码。当您订阅终端节点时,该终端节点必须准备好至少接收订阅确认消息。