如何使用 VPC Endpoint 从 VPC 内的 Lambda 发布到 SNS?

Mic*_*kel 6 amazon-web-services amazon-sns amazon-vpc aws-lambda

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

我发现了 VPC Endpoint 支持 SNS 的公告(包括这篇博文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
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*ein 5

这个对我有用!

我做了以下事情:

  • 创建Amazon SNS 主题并订阅它
  • 创建了一个没有 VPC 配置的AWS Lambda 函数,它向 SNS 主题发送消息
  • 测试了 Lambda 函数——收到消息
  • 创建了一个具有两个私有子网VPC
  • 在私有子网中为 SNS创建了一个服务端点,安全组允许所有 TCP来自0.0.0.0/0(用于测试目的)
  • 修改 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
Run Code Online (Sandbox Code Playgroud)

  • **SNS 服务端点** 是位于 VPC 内的弹性网络接口。它提供 VPC 和 SNS 之间的网络连接,就像 ENI 提供 VPC 和 Amazon EC2 实例之间的连接一样。关联的安全组可用于控制入站连接。最好将其配置为 VPC 本身的 CIDR 范围,而不是“0.0.0.0/0”,以确保流量仅来自 VPC 内(甚至更小的子集)。 (5认同)
  • 在默认 VPC 安全组上添加允许 0.0.0.0/0 的入站规则也适用于我!我不知道为什么,你有什么想法吗?为什么 VPC 需要入站连接才能发布到 SNS? (2认同)