2016-01-05 19 views
10

कार्य मुझे करने की आवश्यकता है सीडीएन को एस 3 बाल्टी पर निर्भर होना चाहिए, लेकिन हम एक नया निर्माण करने के बजाय मौजूदा बाल्टी का भी उपयोग कर सकते हैं।क्लाउडफॉर्मेशन, निर्भर करता है पर निर्भर करता है

यहाँ नमूना कोड है कि मैं के साथ लड़ रहा है:

"Parameters" : { 
    "UseExistingBucket" : { 
    "Description" : "Yes/No", 
    "Default" : "yes", 
    "Type" : "String", 
    "AllowedValues" : [ "yes", "no" ] 
    } 
}, 
"Conditions" : { 
    "CreateS3Resources" : {"Fn::Equals" : [{"Ref" : "UseExistingBucket"}, "no"]} 
}, 
"Resources" : { 
    "StaticBucket" : { 
    "Type" : "AWS::S3::Bucket", 
    "Condition" : "CreateS3Resources", 
    "Properties" : { 
     "BucketName" : { "Fn::Join": [ "-", [ "app", { "Ref": "EnvType" }, "static" ] ] } 
    }, 
    "DeletionPolicy": "Retain" 
    }, 
    "MyStaticDistribution": { 
    "Type": "AWS::CloudFront::Distribution", 
    "Properties": { 
     "DistributionConfig": { 
     "Origins": [ 
      { 
      "DomainName": { 
       "Fn::If" : [ 
       "CreateS3Resources", 
       { "Fn::Join": [ "-", [ "app", { "Ref": "EnvType" }, "static" ] ] }, 
       {"Fn::GetAtt": [ "StaticBucket", "DomainName" ] } 
       ] 
      }, 
      "Id": "S3Origin", 
      } 
     ] 
     } 
    }, 
    "DependsOn": [{ 
     "Fn::If" : [ 
     "CreateS3Resources", 
     { "Fn::Join": [ "-", [ "app", { "Ref": "EnvType" }, "static" ] ] }, 
     "" 
     ] 
    }] 
    } 
} 

कृपया मुझे किसी भी अधिक जानकारी के सुझाव है कि यदि आवश्यक

उत्तर

0

(कम से कम stackoverflow अधिक जानकारी के लिए, लेकिन किसी भी :-P निर्दिष्ट नहीं चाहता है) मैं वही बात लड़ रहा हूँ। त्रुटि है:

A client error (ValidationError) occurred when calling the ValidateTemplate operation: Template format error: DependsOn must be a string or list of strings.

एक DependsOn भीतर एक सशर्त डाल करने के लिए संभव नहीं लगता है।

मैंने इसे व्यक्त करने के अन्य तरीकों को देखना शुरू कर दिया। हो सकता है कि आश्रित कोड को 2 अलग-अलग बाल टेम्पलेट्स में रखें। बाहरी स्थिति का पता लगाएं और उचित नेस्टेड टेम्पलेट नाम को मूल टेम्पलेट पैरामीटर में पास करें। तो DependsOn उस पैरामीटर को देखता है जिसे मैं निर्भर टेम्पलेट के रूप में पास करता हूं।

अत्यधिक contorted तर्क की तरह लगता है।

एक बेहतर तरीका होना चाहिए।

7

आप Fn:GetAtt को सशर्त Fn:If में लपेटकर इसका उपयोग करके ऐसा कर सकते हैं। एफएन का उपयोग करना: GetAtt एक निर्भरता का तात्पर्य है, इसलिए क्लाउडफ़ॉर्मेशन स्वचालित रूप से उस फ़ंक्शन तक पहुंचने के बाद प्रतीक्षा करेगा, जैसा कि आप DependsOn का उपयोग कर रहे थे।

उदाहरण

कोड स्निपेट नीचे सशर्त एक नेस्टेड ढेर अभी तक नहीं बनाया गया है कि पुन: प्राप्त करने के नाम से यह पता चलता है, लेकिन हालत UseNestedStack सही पर सेट है, तो केवल ऐसा नहीं करता है। यदि UseNestedStack गलत है तो यह प्रतीक्षा नहीं करेगा और इसके बजाय स्थानीय चर नाम पुनर्प्राप्त करेगा।

{ 
"Fn::If": ["UseNestedStack", { 
    "Fn::GetAtt": ["NestedStack", "Outputs.Name"] 
}, { 
    "Ref": "LocalName" 
}] 

मुझे यह कैसे पता चलेगा? (एक और उदाहरण)

दुर्भाग्यवश कोई आधिकारिक दस्तावेज आधिकारिक तौर पर यह बताता नहीं है लेकिन यह एडब्ल्यूएस था जिसने मुझे ऐसा करने के लिए कहा और उनके कोड उदाहरणों में आप देख सकते हैं कि आदेश के मामले में वे एफएन: GetAtt का उपयोग करते हैं। मैंने कई बार कोशिश की है और यह हर बार काम करता है। इसे अपने आप को एक साधारण ढेर पर आज़माएं। एडब्ल्यूएस लैम्ब्डा उदाहरण से कुछ और छद्म सबूत यहां दिया गया है कि मैंने tweaked और खुद का उपयोग किया है। संसाधन एएमआई जानकारी के बाद एएमआई फ़ंक्शन बनाया गया है, तो नीचे का ढेर संभवतः काम नहीं कर सका, एएमआई जानकारी को एएमआई फ़ंक्शन के आउटपुट की आवश्यकता है, इसलिए एडब्ल्यूएस ने उन्हें एफएन: गेटएट का उपयोग करके एक साथ जोड़ दिया है। इस स्क्रॉल को नीचे देखने के लिए और संसाधन AMIInfo को देखें और आप इसे एफएन: गेट के माध्यम से संदर्भों को संदर्भित करेंगे। क्लाउडफॉर्मेशन इसे देखता है और इसे पहले बनाने के लिए एमिफंक्शन पर वापस चला जाता है।

"AMIInfoFunction": { 
    "DependsOn":"SourceStack", 
    "Type": "AWS::Lambda::Function", 
    "Properties": { 
    "Code": { 
     "S3Bucket": { "Ref": "DeploymentBucket" }, 
     "S3Key": {"Fn::Join": [ 
     "", 
     [ 
      { 
      "Ref": "ApplicationName" 
      }, 
      "/amilookup.zip" 
     ] 
     ]} 
    }, 
    "Handler": "amilookup.handler", 
    "Runtime": "nodejs", 
    "Timeout": "30", 
    "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] }, 
    "VpcConfig": { 
     "SecurityGroupIds": [ {"Ref": "InstanceSecurityGroup"}], 
     "SubnetIds": [ {"Ref":"PrivateSubnetA"},{"Ref":"PrivateSubnetB"} ] 
    } 
    } 
}, 
"AMIInfo": { 
    "Type": "Custom::AMIInfo", 
    "Properties": { 
    "ServiceToken": { "Fn::GetAtt" : ["AMIInfoFunction", "Arn"] }, 
    "StackName": { "Ref":"SourceStack" } 
    } 
} 
+0

वहाँ प्रलेखन कहीं है का कहना है कि कि GetAtt स्वचालित रूप से होगा आगे बढ़ने से पहले अन्य संसाधनों को समाप्त करने की प्रतीक्षा करें? – doeiqts

+2

@doeiqts अच्छा सवाल है। दुर्भाग्य से मैंने इसे दस्तावेज नहीं देखा है, लेकिन मुझे विश्वास है कि यह एडब्ल्यूएस उदाहरणों में इसके उपयोग से सच है, तथ्य यह है कि मैंने इसे कई बार काम किया है, और एडब्ल्यूएस इंजीनियरों से मुझे ऐसा करने का निर्देश दिया है। मैंने एडब्ल्यूएस से लैम्ब्डा उदाहरण जोड़ा है जिसमें उन्होंने इस तरह सृजन में देरी की है। लेकिन हाँ कुछ आधिकारिक दस्तावेज क्लीनर होगा। –

0

अपने टेम्पलेट में आप अपने MyStaticDistribution संसाधन को DependsOn विशेषता जोड़ने के रूप में आप पहले से ही StaticBucket संसाधन के लिए एक संदर्भ है की जरूरत नहीं है।

यह निर्दिष्ट निर्भरताअनुकूलन एडब्ल्यूएस CloudFormation टेम्पलेट्स ब्लॉग पोस्ट की धारा में दर्ज है: https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/

When you need CloudFormation to wait to provision one resource until another one has been provisioned, you can use the DependsOn attribute.

You can also introduce references between elements by using either the { "Ref": "MyResource" } or the { "Fn::GetAtt" : [ "MyResource" , "MyAttribute" ] } functions. When you use one of these functions, CloudFormation behaves as if you’ve added a DependsOn attribute to the resource.

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