无法获取 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
我编写了一个龙卷风服务作为 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