Amazon web services 从VPC中的Lambda发布到SNS
我试图从VPC中的Lambda发布到SNS,但我的Lambda挂起,并最终在大约一分钟后超时 基于和类似的文章,我创建了一个VPC端点,如下所示:Amazon web services 从VPC中的Lambda发布到SNS,amazon-web-services,aws-lambda,amazon-sns,amazon-vpc,Amazon Web Services,Aws Lambda,Amazon Sns,Amazon Vpc,我试图从VPC中的Lambda发布到SNS,但我的Lambda挂起,并最终在大约一分钟后超时 基于和类似的文章,我创建了一个VPC端点,如下所示: Type: AWS::EC2::VPCEndpoint Properties: PrivateDnsEnabled: true SecurityGroupIds: - security-group-id ServiceName: com.amazonaws.a
Type: AWS::EC2::VPCEndpoint
Properties:
PrivateDnsEnabled: true
SecurityGroupIds:
- security-group-id
ServiceName: com.amazonaws.ap-southeast-2.sns
SubnetIds:
- subnet1-id
- subnet2-id
VpcEndpointType: Interface
VpcId: vpc-blahblah
这仍然会导致我的Lambda在发布到SNS时被挂起。建议使用AWS::EC2::SecurityGroupIngress,它也允许来自VPC的CIDR的所有TCP流量,但也不起作用
My Lambda和VPC端点位于同一个安全组中,并且存在入口规则,仅允许来自某些地方的MySQL传入连接以及来自VPC的所有流量(如前所述)
为了让我的Lambda能够发布到SNS主题,我缺少了什么?为了再现您的情况,我创建了:
- 一个亚马逊专有网络(只有一个子网且没有互联网网关)
- 亚马逊SNS的VPC端点,具有:
- 允许所有入站流量的访问策略
- 安全组允许从专有网络的CIDR进行所有入站访问
- 一个亚马逊SNS主题,订阅手机短信
- 允许使用Amazon SNS的Lambda函数使用的IAM角色
- AWS Lambda函数的
- 具有上述IAM角色
- 安全组允许所有出站流量
- 连接到专有网络中的专用子网
def lambda_处理程序(事件、上下文):
#向SNS发送消息
MY_SNS_TOPIC_ARN='ARN:aws:SNS:ap-southerast-2:111111:foo'
sns_client=boto3.client(“sns”)
sns_client.publish(
主题=我的主题,
主题='来自lambda',
Message='Hello'
)
然后,我通过从Lambda控制台手动运行Lambda函数来测试它
我成功地在手机上收到了测试信息
因此,我建议您将您的配置与上述配置进行比较,并尝试找出任何差异
我注意到您正在通过CloudFormation部署,因此您可以启动堆栈,然后将您的资源与所描述的内容进行比较,或者您可以尝试手动创建上述内容以确认它对您有效,然后将这些资源与CloudFormation模板进行比较。什么是SGs,对于端点和lambda。我假设lambda已设置为与vpc协同工作,例如,它是否正确设置了使用来自vpc或非vpc lambda的SNS所需的任何网络设置?我认为,只要您拥有SNS的IAM权限,Lambda就应该能够使用SNS服务。我想,对调用Lambda的SNS IAM权限应该足够了,如果没有,它需要启用SNS的VPC端点,以部署Lambda的子网Lambda在您的VPC中创建网络接口。因此,在vpc中做任何事情之前,它需要执行角色。在我之前发布的链接中,对该角色进行了解释。是的,需要Lambda执行角色权限。我认为中的VPC端点的默认访问策略允许所有入站流量,这样就可以了。不过,我的VPC有一个互联网网关——这可能是问题所在吗?我没有包括互联网网关,因此我可以证明VPC端点工作正常。如果你有一个互联网网关,那么你在亚马逊SNS上使用VPC端点的用例是什么?(例如,可能是为了增加安全性。)在这种情况下,请确保Lambda函数连接到一个子网,该子网的路由表已更新,以指向VPC端点。VPC中的Lambda函数只有在VPC中配置了NAT网关才能访问Internet。不确定(我继承了此代码),但VPC包含可以从某些公共IP地址访问的RDS,所以我想这就是为什么有Internet网关?如何更新路由表以指向VPC端点?VPC端点似乎不是路由表路由可以知道的。实际上,当VPC端点添加到VPC时,它可能会自动配置。这就是为什么需要将子网指定为VPC端点定义的一部分。因此,只需确保Lambda函数连接到VPC端点定义中列出的子网之一。如果您没有特定的理由将Lambda功能连接到VPC(例如,如果您不需要与VPC内的资源进行交互),那么通常最好不要将Lambda功能配置为使用VPC。嗯,似乎仍然缺少一些东西。SNS是一个接口而不是网关服务,所以它不应该是路由表问题?