2014-09-30 7 views
6

मैं एक क्लाउडफॉर्मेशन टेम्पलेट सेट अप करने का प्रयास कर रहा हूं जो या तो एक स्वच्छ उदाहरण या स्नैपशॉट से एक लॉन्च करेगा। मैं एक अगर/किसी और प्रकार के बयान का उपयोग करने में सक्षम होना चाहते हैं, जिससे कि तरहएडब्ल्यूएस क्लाउडॉर्मेशन वैकल्पिक लाइन

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

कुछ ऐसा दिखाई देगा 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" 
}, 

या में लपेटकर एफएन :: यदि {}:

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

जिनमें से सभी अलग-अलग प्रकार या त्रुटियों को चुनते हैं। पहला व्यक्ति "एनकॉन्टेड अप्रयुक्त संपत्ति Fn :: अगर" क्लाउडफॉर्मेशन में देता है, दूसरा, बस वैध JSON नहीं है। मैं एक खाली मात्रा को स्नैपशॉट कर सकता हूं और आकार पैरामीटर को परिभाषित कर सकता हूं, फिर हमेशा एक स्नैपशॉट आईडी और आकार पास कर सकता हूं लेकिन मुझे लगता है कि क्लाउडॉर्मेशन में वैकल्पिक लाइन होने का एक तरीका होना चाहिए।

कोई विचार?

उत्तर

3

आप इस तरह कर सकते हैं:

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

यहाँ एक कार्यात्मक टेम्पलेट के लिए एक लिंक है: https://github.com/caussourd/public-cloudformation-templates/blob/master/conditional_volume_creation.template

+0

बिल्कुल सही, मुझे नहीं पता था मैं एडब्ल्यूएस :: NoValue, धन्यवाद के रूप में एक इनपुट को परिभाषित कर सकते हैं। – TristanMatthews

संबंधित मुद्दे