0

我在AWS站點上發現了一個很棒的文檔,介紹如何在第二個實例開始出現之前讓一個實例完全啓動並設置。它在https://aws.amazon.com/blogs/devops/tag/cloudformation/page/2/Cloudformation「CreationPolicy」屬性不起作用

文檔使用CreationPolicy屬性和cfn-signal通知AWS Cloudformation Instance1已經啓動。我嘗試了代碼。它運行。但問題是Instance2首先出現,而不是等待Instance1出現。這是代碼,當實例出現時,我附加了屏幕截圖。

{ 
"AWSTemplateFormatVersion": "2010-09-09", 
"Description": "EC2 Head Node Instance ", 
"Resources": { 
    "EC2Instance1": { 
     "Type": "AWS::EC2::Instance", 
     "CreationPolicy" : { 
      "ResourceSignal" : { 
      "Timeout": "PT10M", 
      "Count" : "1" 
      } 
     }, 
     "Properties": { 
      "ImageId": "ami-3723c04f", 
      "UserData":{ 
       "Fn::Base64":{ 
        "Fn::Join": ["", [ 
             "<script>\n",            
              "cfn-signal.exe -e 0 ", 
              " --stack ", {"Ref" : "AWS::StackName"}, 
              " --resource EC2Instance1", 
              " --region ", {"Ref" : "AWS::Region"}, "\n" ,           
             "</script>\n" 

            ] 

        ] 

       } 


      },    
      "Tags" : [ 
       {"Key" : "Name", "Value" : "QRM Head Node"}    
      ] 

     } 
    }, 
    "EC2Instance2": {    
     "Type": "AWS::EC2::Instance", 
     "Properties": { 
      "ImageId": "ami-3723c04f", 
      "Tags" : [{"Key" : "Dependency", "Value" : "EC2Instance1"}    
      ] 

     } 
    } 


} 

Stack Events picture}

回答

2

您必須指定DependsOn屬性。

"EC2Instance2": { 
    "DependsOn": "EC2Instance1",    
    "Type": "AWS::EC2::Instance", 
    "Properties": { 
     "ImageId": "ami-3723c04f", 
     "Tags" : [{"Key" : "Dependency", "Value" : "EC2Instance1"}    
     ] 

    } 
} 

上面的代碼片段可以解決您的問題。

編輯-1:CFN信號+ DependsOn

創建CFN信號上Ec2Instance1您的安裝後,發出信號完成。請參閱cfn-signal documentation

現在,創建一個AWS::CloudFormation::WaitCondition並在Ec2Instance2中引用它。以下是關於如何將WaitConditions集成到您的模板cfn-wait-condition中的文檔。

+0

如果我們通過使用「DependsOn」屬性確保EC2Instance2只會在EC2Instance1之後出現,那麼在userdata部分使用cfn-signal來通知EC1已經出現了什麼情況? – Jason

+0

使用'DependsOn'將確保EC2Instance2只會在EC2Instance1「創建」後纔會出現。 另一方面,如果您想在EC2Instance1中進行一些設置,比如安裝所需的軟件等,那麼您可以使用'cfn-signal',並且EC2Instance2只會在安裝完成後纔會出現。在這種情況下,可以使用'cfn-signal'。 – krisnik

+0

根據你的問題,我認爲「DependsOn」適合你的要求。 – krisnik