如何在 AWS-SAM template.yml 中为每个阶段类型指定不同的环境变量

问题描述

我希望在我的 template.yml 中为每个构建阶段设置不同的环境变量

我会想象这样的事情:

Globals:
  Function:
    Environment:
      Variables:
        SomeHost: x.amazonaws.com
        dbname: somename
        DBPort: 5430
        DBUsername: ${var1}
        API_BASE_URL: ${var2}

Parameters:
  paramEnvironment:
    Type: String
    AllowedValues:
    - stage
    - prod
    Default: stage

我可以在哪里设置

stage:
  var1: user1
  API_BASE_URL: https://baseurl1.com
prod:
  var1: user2
  API_BASE_URL: https://baseurl2.com

当我使用 paramEnvironment 运行 deploy 时,环境将获得所有基于阶段的变量

解决方法

处理不同环境(尤其是无服务器环境)的理想方式是在同一组织 (AWS Organizations) 下拥有多个 AWS 帐户,其中您有一个单独的帐户用于暂存,另一个帐户用于生产。

因此,如果您想在单个帐户中解决此问题,您可以使用 SSM 参数或 SAM 模板中的映射

引用现有系统管理器参数

Parameters:
  ApiBaseUrl :
    Type : 'AWS::SSM::Parameter::Value<String>'
    Default:  /${paramEnvironment}/apiBaseUrl

通过 SAM 模板中的映射

Mappings:
    EnvVariables:
        stage:
           var1: user1
           API_BASE_URL: https://baseurl1.com
        prod:
           var1: user2
           API_BASE_URL: https://baseurl2.com

并参考地图使用,

!FindInMap [ EnvVariables,${paramEnvironment},API_BASE_URL ]