无法获得HTTP订购确认请求(Cannot get HTTP subscription confir

2019-10-22 03:50发布

我写了一个龙卷风服务为亚马逊SNS端点。

class TestHandler(tornado.web.RequestHandler):
    def get(self):
        logging.info('get')
        self.sns()
        self.write(self.request.body.decode('utf-8'))

    def post(self):
        logging.info('post')
        self.sns()
        self.write(self.request.body.decode('utf-8'))

    def sns(self):
        headers = self.request.headers
        logging.info('HEADER: {}'.format(headers))
        arn = headers.get('x-amz-sns-subscription-arn')
        obj = json.loads(self.request.body)

        if headers.get('x-amz-sns-message-type') == 'SubscriptionConfirmation':
            logging.info('REQUEST: {}'.format(self.request))
            subscribe_url = obj[u'SubscribeURL']
            logging.info('URL:{}'.format(subscribe_url))
            return '<Arn %r>' % arn

        elif headers.get('x-amz-sns-message-type') == 'UnsubscribeConfirmation':
            logging.info('Unsubscription')

        elif headers.get('x-amz-sns-message-type') == 'Notification':
            logging.info('Unsubscription')

        return '', 200

但是,当我订阅端点SNS,我没有得到任何HTTP POST请求。 没有日志被打印出来。 于是,我就做curl ,而是和日志显示它的罚款。 我更相信,SNS没有发送请求,而不是我的终点没有收到它。 我不知道如何着手。 请帮忙。 谢谢。

Answer 1:

对了,外面的交通可能会阻止,但我可以从我的本地机器打端点(不EC2)。

这忽略了一点。 你必须允许从Internet的入站连接之前,SNS可以访问您的HTTP(S)端点。 SNS没有一个后门到您的实例。

对于SNS通知的源IP地址范围公布,这样你就可以让他们在你的安全组...

https://forums.aws.amazon.com/ann.jspa?annID=1649

然而,你需要注意的是,名单如有更改,所以最好的做法可能使您的端点全局访问。

同样重要的是使用所提供的签名验证的消息,以及通过验证证书的URL是合法与SNS相关的验证消息的证书的公钥,通过与HTTPS获取的证书和验证作为合法属于亚马逊该TLS请求期间提供的证书。

http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.verify.signature.html



文章来源: Cannot get HTTP subscription confirmation request