无法获取 HTTP 订阅确认请求

Cannot get HTTP subscription confirmation request

我编写了一个龙卷风服务作为 Amazon 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 没有发送请求,而不是我的端点没有收到它。我不知道如何进行。请帮忙。谢谢。

Right, the outside traffic might get blocked, but I can hit the endpoint (not EC2) from my local machine. 

这没有抓住重点。在 SNS 可以访问您的 http(s) 端点之前,您必须允许来自 Internet 的入站连接。 SNS 没有您的实例的后门。

SNS 通知的源 IP 地址范围已发布,因此您可以在您的安全组中允许它们...

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

但是,您需要注意该列表可能会发生变化,因此最佳做法可能是使您的端点可在全球范围内访问。

同样重要的是使用提供的签名验证消息,以及通过验证证书的 URL 合法性来验证消息中证书的 public 密钥与 SNS 关联,并通过使用 HTTPS 获取证书并验证在该 TLS 请求期间提供的证书是否合法属于亚马逊。

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