You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据环境为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:15:32