合并 cloudformation 模板中的两个对象列表

Merge two lists of objects in cloudformation template

我正在尝试编写一个 clouformation 模板以部署到 ECS。为此,我还想为任务定义定义环境变量。然而我面临的问题是环境一部分由映射决定,另一部分由模板参数决定。

这是我目前正在尝试的(为简洁起见减少了模板)。

Parameters:
  Version:
    AllowedPattern: '^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(((0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\+([0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*))?$'
    Description: The version number
    Type: String
  ParameterEnvironment:
    Description: The environment
    Type: String
    AllowedValues:
      - Beta
      - Live
    Default: Beta    

Mappings:
  EnvironmentData:
    Beta:
      Environment:
        - Name: SOME_VARIABLE
          Value: some_variable_value
    Live:
      Environment:
        - Name: SOME_VARIABLE
          Value: some_variable_value_when_live

Resources:
  WebTaskDefinition:
    Properties:
      ContainerDefinitions:
          Environment:
            - Name: ENVIRONMENT
              Value: !Ref Version
            !FindInMap [ EnvironmentData, !Ref ParameterEnvironment, Environment ]
    Type: 'AWS::ECS::TaskDefinition'

目标是将 !FindInMap [ EnvironmentData, !Ref ParameterEnvironment, Environment ] 结果与包含版本的单个名称、值对对象“合并”。

然而,这会导致整个模板失败。

我也试过:

Mappings:
  EnvironmentData:
    Beta:
      Environment:
        - Name: VERSION
          Value: !Ref Version
        - Name: SOME_VARIABLE
          Value: some_variable_value
    Live:
      Environment:
        - Name: VERSION
          Value: !Ref Version
        - Name: SOME_VARIABLE
          Value: some_variable_value_when_live

但这似乎也失败了,因为我认为不允许在映射中使用 !Ref。

我四处寻找解决方案,但我能找到的只是使用 !Join 然后 !Split 的解决方案,这对我不起作用,因为我有一个对象列表而不是字符串。

你只能通过 macro 来做到这一点。如果您不想开发宏,则必须 re-organize 您的模板和设置,这样您就不必合并任何列表。