Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 从VPC中的Lambda发布到SNS_Amazon Web Services_Aws Lambda_Amazon Sns_Amazon Vpc - Fatal编程技术网

Amazon web services 从VPC中的Lambda发布到SNS

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

我试图从VPC中的Lambda发布到SNS,但我的Lambda挂起,并最终在大约一分钟后超时

基于和类似的文章,我创建了一个VPC端点,如下所示:

      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角色
    • 安全组允许所有出站流量
    • 连接到专有网络中的专用子网
我的Lambda函数是:

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是一个接口而不是网关服务,所以它不应该是路由表问题?