如何根据环境为Lambda选择对应VPC子网?(CloudFormation+SAM部署)
解决方案:根据环境自动选择Lambda子网ID
方法一:使用!If条件函数(适合两环境场景)
这是最直接的实现方式,通过判断environment参数的值,返回对应环境的子网ID列表。
首先优化参数定义(推荐把子网参数改成CommaDelimitedList类型,直接匹配SubnetIds需要的列表格式):
Parameters: environment: Type: String AllowedValues: [dev, prod] # 限制可选值,避免输入错误 devLambdaSubnetIds: Type: CommaDelimitedList Default: [subnet-[devVpcA], subnet-[devVpcB]] prodLambdaSubnetIds: Type: CommaDelimitedList Default: [subnet-[prodVpcA], subnet-[prodVpcB]]
然后修改Lambda的VpcConfig部分:
Resources: HealthCheckFunction: Type: AWS::Serverless::Function Properties: ... VpcConfig: Ipv6AllowedForDualStack: false SecurityGroupIds: - !Ref genericSecurityGroup SubnetIds: !If - !Equals [!Ref environment, dev] - !Ref devLambdaSubnetIds - !Ref prodLambdaSubnetIds
如果坚持使用原有的String类型参数,需要用!Split把逗号分隔的字符串转成列表:
SubnetIds: !Split - ',' - !If - !Equals [!Ref environment, dev] - !Ref devLambdaSubnetIds - !Ref prodLambdaSubnetIds
方法二:使用映射(Mappings)(适合多环境扩展)
如果后续需要新增环境,用映射更便于维护,只需在映射中添加新环境的子网配置即可。
添加映射并调整参数:
Parameters: environment: Type: String AllowedValues: [dev, prod] Mappings: EnvironmentSubnetMap: dev: LambdaSubnets: [subnet-[devVpcA], subnet-[devVpcB]] prod: LambdaSubnets: [subnet-[prodVpcA], subnet-[prodVpcB]]
修改Lambda的SubnetIds配置:
Resources: HealthCheckFunction: Type: AWS::Serverless::Function Properties: ... VpcConfig: Ipv6AllowedForDualStack: false SecurityGroupIds: - !Ref genericSecurityGroup SubnetIds: !FindInMap [EnvironmentSubnetMap, !Ref environment, LambdaSubnets]
部署时的配置(GitHub Actions + SAM)
在GitHub Actions的部署步骤中,通过--parameter-overrides指定环境参数:
sam deploy \ --stack-name health-check-stack-${{ env.ENVIRONMENT }} \ --parameter-overrides environment=${{ env.ENVIRONMENT }} \ --region your-aws-region \ --no-fail-on-empty-changeset
嵌套栈场景优化
如果子网ID是从独立的VPC嵌套栈输出的,无需手动设置默认值,直接通过!ImportValue引用嵌套栈的输出:
devLambdaSubnetIds: Type: CommaDelimitedList Value: !ImportValue DevVpcNestedStack-LambdaSubnetIds
内容的提问来源于stack exchange,提问作者JustANoob
相关产品推荐
相关产品推荐

