AWS Cloudformation:有条件地创建资源属性

时间:2018-12-05 12:08:59

标签: amazon-web-services amazon-cloudformation

我知道可以通过使用Conditions有条件地(还有什么?)创建资源。

尽管有条件地创建资源属性,但我正在尝试寻找一种方法。

在我的情况下,我正在默认公共IP分配= EC2的子网中创建多个false实例。

有时出于调试目的,我希望实例获得公共IP。

现在,我必须注释掉SG /子网和下面的NetworkInterfaces属性(它们不能一起使用)

  myEC2:
    Type: AWS::EC2::Instance
    Metadata:
      Comment: My EC2 Instance
      AWS::CloudFormation::Init:
        config:
          commands:
            01_provision:
              command:
                !Sub |
                  sed -i "s/somestring/${somevar}/" /some/path/
    CreationPolicy:
      ResourceSignal:
        Timeout: PT4M
    Properties:
      ImageId: !FindInMap [ MyAamiMap, 'myami', amiid ]
      InstanceType: "t2.2xlarge"
      # SubnetId: !Ref SBNDemo1
      # SecurityGroupIds: [!Ref SGInternalDemo]
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          GroupSet:
            - Ref: "SGInternalDemo"
          SubnetId:
            Ref: "SBNDemo1"
      UserData:
        "Fn::Base64":
          !Sub |
            #!/bin/bash -xe
            # Start cfn-init
            /usr/local/bin/cfn-init -s ${AWS::StackId} -r myEC2 --region ${AWS::Region} || echo 'Failed to run cfn-init'
            # All done so signal success
            /usr/local/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource myEC2 --region ${AWS::Region}

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

也许我误会了,但这听起来像参数用例而不是条件用例。我之所以这样说,是因为您没有说在什么条件下需要公开IP。只是“有时出于调试目的”模板将如何知道您正在调试?您必须通过参数告诉它。

签出文档https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html

因此,您可以具有一个公共ip参数和一个子网id参数,并在创建堆栈时传递您喜欢的内容。

条件可能有用的一种方法是创建一个调试参数,该参数将切换公共/专用ip和子网。这就是您的想法吗?

要使用属性条件,请使用IF函数

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html

我建议将您的公共子网设置为在启动时提供公共IP,当然,请确保您的私有子网不会这样做。然后只需将子网作为参数传递即可。

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip

答案 1 :(得分:1)

这可能有点晚了,但是我最近有一个相同的问题。

navigator.sendBeacon()中,您可以使用 Fn :: If 相应地设置属性。

模板如下:

Properties:
  ImageId: !FindInMap [ MyAamiMap, 'myami', amiid ]
  InstanceType: "t2.2xlarge"
  # SubnetId: !Ref SBNDemo1
  # SecurityGroupIds: [!Ref SGInternalDemo]
  NetworkInterfaces:
    !If
    - YourCondition
    - 
      AssociatePublicIpAddress: "true"
      DeviceIndex: "0"
      GroupSet:
        - Ref: "SGInternalDemo"
      SubnetId:
        Ref: "SBNDemo1"
    - !Ref "AWS::NoValue"

AWS :: NoValue表示将不设置NetworkInterfaces属性。