Cloud Formation Logic Split Parameter Array Elements

0

I have a could formation template with a parameter that contains a list of elements e.g.

Parameter_Name: "a,b,c,d"

I need to split the list into single elements so that I can specify a list of values for a Resource entity. So far I have used the !Select and !Split functions to separate the list of elements into single values e.g.

- !Select [0, !Split [",", !Ref Paramter_Name]]
- !Select [1, !Split [",", !Ref Paramter_Name]]
- !Select [2, !Split [",", !Ref Paramter_Name]]
- !Select [3, !Split [",", !Ref Paramter_Name]]

This works providing I know the number of elements in the list. Can anyone suggest a way to handle lists with variable numbers of elements?

已提問 1 年前檢視次數 640 次
3 個答案
0
已接受的答案

Hi, AFAIK, the best of what you can do is use !If like in HACK VI of https://garbe.io/blog/2017/07/17/cloudformation-hacks/ I would not say that it is ideal in syntax ;-) but at least you can deal with a list of variable length...

Parameters:
  Env1:
    Type: String
    Description: An item of possible environment variables
    Default: ''

  Env2:
    Type: String
    Description: An item of possible environment variables
    Default: ''

  Env3:
    Type: String
    Description: An item of possible environment variables
    Default: ''


Conditions:
  Env1Exist: !Not [ !Equals [!Ref Env1, '']]
  Env2Exist: !Not [ !Equals [!Ref Env2, '']]
  Env3Exist: !Not [ !Equals [!Ref Env3, '']]


  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      TaskRoleArn: !Ref TaskRole
      ContainerDefinitions:
      - Name: !Ref AWS::StackName
        Image: !Ref ImageName

        Environment:
          'Fn::If':
            - Env1Exist
            -
              - Name: !Select [0, !Split ["|", !Ref Env1]]
                Value: !Select [1, !Split ["|", !Ref Env1]]
              - 'Fn::If':
                - Env2Exist
                -
                  Name: !Select [0, !Split ["|", !Ref Env2]]
                  Value: !Select [1, !Split ["|", !Ref Env2]]
                - !Ref "AWS::NoValue"
              - 'Fn::If':
                - Env3Exist
                -
                  Name: !Select [0, !Split ["|", !Ref Env3]]
                  Value: !Select [1, !Split ["|", !Ref Env3]]
                - !Ref "AWS::NoValue"

            - !Ref "AWS::NoValue"
profile pictureAWS
專家
已回答 1 年前
0

I "solved" this once by just including a "reserved" word for empty entries, like "none", and passed the full array in. Then tested whether the element was the reserved word or not. Not very elegant but got the job done. Also, I used a parameter type of CommaDelimitedList.

profile pictureAWS
專家
kentrad
已回答 1 年前
0

Thanks @Diddler_AWS the solution using conditions will work for me.

已回答 1 年前

您尚未登入。 登入 去張貼答案。

一個好的回答可以清楚地回答問題並提供建設性的意見回饋,同時有助於提問者的專業成長。

回答問題指南