如何使用VPC端点在VPC内从Lambda发布到SNS?

时间:2018-05-04 08:22:49

标签: amazon-web-services aws-lambda amazon-sns amazon-vpc

我已经设置了一个包含3个子网的VPC,这可以从我的Lambda函数访问私有RDS实例。 RDS< - > Lambda连接工作正常,但现在我无法发布到SNS。

我发现了对SNS的VPC端点支持的公告(包括此博客帖子https://aws.amazon.com/blogs/security/securing-messages-published-to-amazon-sns-with-aws-privatelink/),并添加了具有这些属性的VPC端点接口:

Service name: com.amazonaws.eu-west-1.sns
VPC: same as Lambda functions and other services
Subnets: all included in my VPC (have also tested toggling them individually)
Security Groups: all VPC security groups selected

所有服务都在 eu-west-1 区域。我知道发布到SNS的代码是正确的,因为它在非VPC环境中运行时起作用。我发布的ARN保持不变:arn:aws:sns:eu-west-1:962446592636:whatever

我知道可以设置NAT服务器来避免此问题,但如果可能的话,我更愿意使用VPC端点来降低成本。

1 个答案:

答案 0 :(得分:2)

对我有用!

我做了以下事情:

  • 创建亚马逊SNS主题并订阅
  • 创建了一个没有VPC配置的 AWS Lambda函数,它向SNS主题发送消息
  • 测试了Lambda函数 - 收到的消息
  • 创建了一个带有两个私有子网的 VPC
  • 在私有子网中为SNS 创建服务端点,安全组允许来自0.0.0.0/0所有TCP (用于测试目的)
  • 修改了Lambda函数以使用私有子网
  • 测试了Lambda函数 - 收到的消息

所以,一切都很好。我没有必要修改任何Lambda代码。

我的Lambda代码:

def lambda_handler(event, context):
    import boto3

    client = boto3.client('sns', region_name='ap-southeast-2')
    response = client.publish(
        TopicArn='arn:aws:sns:ap-southeast-2:123456789012:stack',
        Message='From Lambda'
        )

    return