CloudFormation公网子网部署时自定义Lambda资源卡在CREATE_IN_PROGRESS求助
问题:CloudFormation公网子网部署Aurora自定义资源超时
我正尝试通过CloudFormation创建AuroraDB集群,其中包含一个用于轮转密钥的自定义资源。该方案在使用私有子网时运行正常,但当我使用公网子网创建相同栈时,资源会一直卡在创建中状态直到CloudFormation超时。
我检查了cfnresponse模块,Python模块可以正常返回响应,代码如下:
cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID")
我使用的CloudFormation代码如下:
CreateSecretRotationLambdaFnTrigger: Condition: IsNotUseDBSnapshot Type: Custom::LambdaAPGSecretsManager Version: "1.0" Properties: ServiceToken: !GetAtt 'CreateSecretRotationLambdaFn.Arn' SecretsManagerEndpoint: !Sub 'https://secretsmanager.${AWS::Region}.amazonaws.com' SecretRotationLambdaFnName: !Sub 'SecretsManager-SecretRotationFn-${AWS::StackName}' SecretRotationLambdaStackName: !Sub '${AWS::StackName}-SecretRotationLambdaStack' SubnetIds: !Split [',', {'Fn::ImportValue': !Sub '${ParentVPCStack}-SubnetsPrivate'}] SecretRotationLambdaSG: !Split [',', {'Fn::ImportValue': !Sub '${ParentVPCStack}-SecretRotationLambdaSecurityGroup'}]
我基于官方CloudFormation模板修改:删除VPC模板中的私有子网,同时将Aurora模板中的子网配置从私有子网替换为公网子网。
请问该问题的原因是什么?CloudFormation是否支持在公网子网中创建自定义Lambda资源?
解答
首先明确:CloudFormation完全支持在公网子网中创建自定义Lambda资源,你遇到的超时问题和CloudFormation本身的支持性无关,核心原因是Lambda挂载到VPC公网子网后的网络访问限制。
根因分析
- 只要Lambda被配置为挂载到VPC下,无论它被部署在私有子网还是公网子网,Lambda绑定的弹性网卡默认都不会被分配公网IPv4地址。
- 你之前使用私有子网时,VPC配置了NAT网关或者对应服务的VPC端点,Lambda可以正常访问Secrets Manager服务,也能调用公网的CloudFormation回调接口返回资源创建状态,所以流程正常。
- 你替换为公网子网后,删除了原有私有子网配套的NAT网关配置,部署在公网子网的Lambda没有公网访问能力,既无法访问你配置的公网Secrets Manager端点,也无法执行
cfnresponse.send调用向CloudFormation返回执行结果,CloudFormation收不到回调就会一直等待直到超时。 - 你本地测试cfnresponse返回正常,是因为本地环境有公网访问能力,和云端VPC内Lambda的运行环境不一致,你可以在CloudWatch中查看该Lambda的运行日志,会明确看到网络连接超时的报错。
解决方案
你可以根据业务场景选择以下任意一种方案修复问题:
- 方案一(推荐):为你的VPC配置Secrets Manager和CloudFormation的VPC端点,Lambda可以通过AWS内网访问这两个服务,不需要公网访问能力即可完成所有操作。
- 方案二:保留VPC的NAT网关配置,将Lambda仍然部署在私有子网中,通过NAT网关完成公网访问,这也是官方推荐的Lambda VPC部署最佳实践。
- 方案三:如果必须将Lambda部署在公网子网中,需要为Lambda绑定的弹性网卡手动关联弹性公网IP(EIP),使其获得公网访问能力,该方案配置繁琐,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者Divya Gowda
相关产品推荐
相关产品推荐

