我知道可以通过使用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}
有什么建议吗?
答案 0 :(得分:1)
也许我误会了,但这听起来像参数用例而不是条件用例。我之所以这样说,是因为您没有说在什么条件下需要公开IP。只是“有时出于调试目的”模板将如何知道您正在调试?您必须通过参数告诉它。
签出文档https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html
因此,您可以具有一个公共ip参数和一个子网id参数,并在创建堆栈时传递您喜欢的内容。
条件可能有用的一种方法是创建一个调试参数,该参数将切换公共/专用ip和子网。这就是您的想法吗?
要使用属性条件,请使用IF函数
我建议将您的公共子网设置为在启动时提供公共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属性。