2014-09-30 23 views
6

Tôi đang cố gắng thiết lập mẫu hình ảnh đám mây hoặc sẽ khởi chạy một phiên bản rõ ràng hoặc một bản sao từ ảnh chụp nhanh. Tôi muốn để có thể sử dụng một tuyên bố loại if/else do đó sẽ giống như thếAWS cloudformation dòng tùy chọn

pseudo code: 
if InputSnapshotId: 
    "SnapshotId" : {"Ref" : "InputSnapshotId"}, 
else: 
    "Size" : 20, 

Trong cloudformation Tôi đã thử một số thứ như:

"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" 
}, 

Hoặc gói trong Fn :: Nếu trong {}:

{"Fn::If" : [ 
     {"Ref" : "FromSnapshot"}, 
     {"SnapshotId" : { "Ref" : "InputSnapshotId" }}, 
     {"Size" : "20"} 
    ]} 

Tất cả đều gây ra các loại lỗi khác nhau. Cái đầu tiên cung cấp một "Thuộc tính không được hỗ trợ Fn :: Nếu" trong cloudformation, thứ hai, không phải là JSON hợp lệ. Tôi có thể snapshot một khối lượng rỗng và xác định một tham số kích thước sau đó luôn luôn vượt qua một SnapshotId và kích thước nhưng tôi cảm thấy như có phải là một cách để có một dòng tùy chọn trong cloudformation.

Bất kỳ ý tưởng nào?

Trả lời

3

Bạn có thể làm như thế này:

"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" 
    } 
    } 

Đây là một liên kết đến một mẫu chức năng: https://github.com/caussourd/public-cloudformation-templates/blob/master/conditional_volume_creation.template

+0

Hoàn hảo, tôi đã không nhận ra tôi có thể xác định một đầu vào như AWS :: NoValue, cảm ơn. – TristanMatthews

Các vấn đề liên quan