【问题标题】:CloudFormation Joining List of Strings with FindInMapCloudFormation 使用 FindInMap 连接字符串列表
【发布时间】:2021-02-04 23:06:37
【问题描述】:

在从地图中获取字符串列表后,我遇到了 Cloudformation 加入字符串列表的问题。

导致的错误是安全组需要一个字符串列表。

"123456":
    us-east-1:
      #VPC1
      VpcId: vpc-xxxx
      VpcCidr: 10.78.160.0/20
      SecurityGroups: sg-123
      AvailabilityZones: us-east-1a,us-east-1b,us-east-1c
"123457":
    us-east-1:
      #VPC
      VpcId: vpc-xxxx
      VpcCidr: 10.78.160.0/20
      SecurityGroups: sg-123,sg-124
      AvailabilityZones: us-east-1a,us-east-1b,us-east-1c
LaunchConfig:
    Type: AWS::AutoScaling::LaunchConfiguration
    Metadata:
      AWS::CloudFormation::Init:
        config:
    Properties:
      InstanceType:
        Ref: InstanceType
      SecurityGroups: !Join [ ",", [!FindInMap [!Ref "AWS::AccountId", !Ref "AWS::Region", SecurityGroups], !Ref EC2SG ]]
      IamInstanceProfile:

请告诉我如何获取安全组列表并将其添加到另一个资源

用这个问题解决了

How do I use nested lists or append to a list in Cloudformation?

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-cloudformation


    【解决方案1】:

    让我们进行映射:

    Mappings:
      "111222333444":
        us-east-1:
          SecurityGroups:
            - sg-abc
            - sg-xyz
        us-west-2:
          SecurityGroups:
            - sg-1234
            - sg-3456
    

    安全组可以称为

    SecurityGroupIds:
      "Fn::FindInMap":
        [!Ref AWS::AccountId, !Ref AWS::Region, SecurityGroups]
    

    在映射中定义为数组并传递完整的数组,这样我们就可以避免拆分和连接。

    完整模板,在 Lambda 上测试

    AWSTemplateFormatVersion: "2010-09-09"
    Description: "Test"
    Mappings:
      "111222333444":
        us-east-1:
          SecurityGroups:
            - sg-abc
            - sg-xyz
        us-west-2:
          SecurityGroups:
            - sg-1234
            - sg-3456
    Resources:
      TestLambda:
        Type: "AWS::Lambda::Function"
        Properties:
          Handler: com.test.MainClass::handleRequest
          Runtime: java8
          FunctionName: "Test-Lambda"
          Code:
            S3Bucket: code-bucket
            S3Key: !Sub "artifacts/test.jar"
          Description: "Test Lambda"
          MemorySize: 512
          Timeout: 60
          Role: !Ref my-role-arn
          VpcConfig:
            SecurityGroupIds:
              "Fn::FindInMap":
                [!Ref AWS::AccountId, !Ref AWS::Region, SecurityGroups]
            SubnetIds:
              - subnet-1
              - subnet-2
    

    【讨论】:

    • 如何将地图添加到另一个资源,例如 EC2SG。这样做会导致失败,SecurityGroups: !Join [ ",", [!FindInMap [!Ref "AWS::AccountId", !Ref "AWS::Region", SecurityGroups], !Ref EC2SG ]]。我已经编辑了 qn,以使其清晰
    • @Umar 这正是您在另一个资源中引用的方式。就像我在上面提到的 Lambda 一样,您将在您的 EC2 中引用!唯一的区别是,我在示例中创建为数组而不是字符串。
    • 按照这里的解决方案修复它stackoverflow.com/questions/49035760/…
    • 太棒了。我总是发现在映射本身中简单地定义为数组更容易,任何一个都可以。很高兴你解决了。
    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2017-04-24
    • 2018-05-15
    • 1970-01-01
    • 2018-08-25
    相关资源
    最近更新 更多