Tri*_*ews 9 amazon-web-services aws-cloudformation
我正在尝试设置一个云形式模板,该模板将启动一个干净的实例或一个来自快照的实例.我希望能够使用if/else类型语句,以便看起来像
pseudo code:
if InputSnapshotId:
"SnapshotId" : {"Ref" : "InputSnapshotId"},
else:
"Size" : 20,
Run Code Online (Sandbox Code Playgroud)
在cloudformation中,我尝试了很多类似的东西:
"WebserverInstanceDataVolume" : {
"Type" : "AWS::EC2::Volume",
"Properties" : {
"Fn::If" : [
{"Ref" : "FromSnapshot"},
{"SnapshotId" : { "Ref" : "InputSnapshotId" }},
{"Size" : "20"}
],
"VolumeType" : "standard",
"AvailabilityZone" : { "Fn::GetAtt" : [ "WebserverInstance", "AvailabilityZone" ]},
"Tags" : [
{"Key" : "Role", "Value": "data" },
]
},
"DeletionPolicy" : "Delete"
},
Run Code Online (Sandbox Code Playgroud)
或者在{}中包装Fn :: If:
{"Fn::If" : [
{"Ref" : "FromSnapshot"},
{"SnapshotId" : { "Ref" : "InputSnapshotId" }},
{"Size" : "20"}
]}
Run Code Online (Sandbox Code Playgroud)
所有这些都会导致不同的类型或错误.第一个在cloudformation中给出了"遇到不支持的属性Fn :: If",第二个只是无效的JSON.我可以快照一个空卷并定义一个大小参数然后总是传递SnapshotId和大小,但我觉得必须有一种方法在cloudformation中有一个可选行.
有任何想法吗?
你可以这样做:
"Conditions" : {
"NotUseSnapshot" : {"Fn::Equals" : [{"Ref" : "InputSnapshotId"}, ""]}
},
"Resources" : {
"WebserverInstanceDataVolume" : {
"Type" : "AWS::EC2::Volume",
"Properties" : {
"Size" : {
"Fn::If" : [
"NotUseSnapshot",
"20",
{"Ref" : "AWS::NoValue"}
]
},
"SnapshotId" : {
"Fn::If" : [
"NotUseSnapshot",
{"Ref" : "AWS::NoValue"},
{"Ref" : "InputSnapshotId"}
]
},
"VolumeType" : "standard",
"AvailabilityZone" : { "Fn::GetAtt" : [ "WebserverInstance", "AvailabilityZone" ]},
"Tags" : [
{"Key" : "Role", "Value": "data" }
]
},
"DeletionPolicy" : "Delete"
}
}
Run Code Online (Sandbox Code Playgroud)
以下是功能模板的链接:https://github.com/caussourd/public-cloudformation-templates/blob/master/conditional_volume_creation.template
| 归档时间: |
|
| 查看次数: |
3658 次 |
| 最近记录: |