无法获取HTTP订阅确认请求

时间:2015-03-04 23:35:17

标签: python amazon-web-services amazon-sns

我将龙卷风服务写为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没有发送请求而不是我的端点没有收到请求。我不知道该怎么办。请帮忙。谢谢。

1 个答案:

答案 0 :(得分:2)

  

是的,外部流量可能会被阻止,但我可以从本地计算机上攻击端点(而不是EC2)。

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

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

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

但是,您需要注意列表可能会发生变化,因此最佳做法可能是使您的端点可以全局访问。

使用提供的签名验证消息以及通过验证证书的URL与SNS合法关联以及通过获取证书来验证消息中证书的公钥也很重要。 HTTPS并验证在该TLS请求期间提供的合法属于Amazon的证书。

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

相关问题