如何访问SNS HTTPS订阅端点中的消息属性

时间:2019-05-01 01:26:54

标签: amazon-web-services go amazon-sns aws-sdk-go

我正在设置集成测试,以确定向SNS发布消息的程序是否正常运行。发布的消息包括一些关键消息属性,我需要检查这些属性以确定正确性。

到目前为止,我已经建立了一个充当SNS订阅者的简单HTTP服务器。服务器正确地确认了其订阅,甚至从该主题接收消息,但是我对如何访问这些消息的属性一无所知。

应该提到的是,我正在使用ngrok将主机暴露给SNS。为此,我使用命令:

ngrok http 8080

创建订阅时,请确保启用原始消息传递:

subOut, err := snsCli.Subscribe(&sns.SubscribeInput{
    Endpoint: &ngrokURL,
    Attributes: map[string]*string{
        "RawMessageDelivery": aws.String("True"),
    },
    Protocol: aws.String("https"),
    TopicArn: aws.String(topicArn),
})

注意:我还尝试将“ RawMessageDelivery”设置为“ true”,而不是“ True”。这似乎没有引起任何变化。

我也尝试使用http协议而不是https,但是取得了相同的结果。

以下是端点接收的通知发布请求(我用星号替换了ARN):

POST / HTTP/1.1
x-amz-sns-message-type: Notification
x-amz-sns-message-id: c8bce1ed-3766-5a04-a9ad-b4afc662cc31
x-amz-sns-topic-arn: ****
x-amz-sns-subscription-arn: ****
x-amz-sns-rawdelivery: true
Content-Length: 1
Content-Type: text/plain; charset=UTF-8
Host: ****.ngrok.io
User-Agent: Amazon Simple Notification Service Agent
Accept-Encoding: gzip,deflate
X-Forwarded-Proto: https
X-Forwarded-For: 54.240.230.176

发布到SNS的邮件正文中只有一个字节(一个空格字符)-我认为这就是内容长度为1的原因。

其中一个消息属性是二进制格式,并且包含SNS消息正文中不允许的字符,否则,我只是将编码后的属性放在消息正文中。

请求中似乎没有任何可用的属性,而我对此完全感到困惑。我希望它们将成为原始请求主体的一部分,但事实并非如此。有什么想法吗?

编辑:我可能应该补充说,我已经将SQS订户添加到了同一主题,并且SQS订户将收到预期的消息属性。

1 个答案:

答案 0 :(得分:0)

该解决方案就像禁用RawMessageDelivery一样简单。看来,此选项是将消息属性传递到SQS端点所必需的,但是在传递到HTTP / S端点时,必须必须使用。