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