在 CloudFormation範本中建立等待條件 - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 CloudFormation範本中建立等待條件

重要

對於 Amazon EC2 和 Auto Scaling 資源,我們建議您使用 CreationPolicy 屬性而不是等待條件。將 CreationPolicy 屬性添加到這些資源中,並使用 cfn-signal 幫助程序腳本在實例創建過程成功完成時發出信號。

如需詳細資訊,請參閱 CreationPolicy 屬性在 Amazon 上部署應用 EC2

您可以使用 AWS::CloudFormation::WaitConditionHandle 資源和 CreationPolicy 屬性 屬性執行下列動作:

  • 協調堆疊資源建立與堆疊建立外部的其他組態動作

  • 追蹤組態程序的狀態

例如,您可以在應用程式組態完成一部分後,開始建立另一個資源,或是在安裝和組態程序期間傳送訊號來追蹤其進度。

使用等待條件控點

注意

如果您使用VPC端點功能,則回應等待條件的資源必須能VPC夠存取 AWS CloudFormation特定的 Amazon Simple Storage Service (Amazon S3) 儲存貯體。資源必須將等待條件回應傳送至預先簽署的 Amazon S3 URL。如果他們無法傳送回應至 Amazon S3,就 AWS CloudFormation 不會收到回應,且堆疊作業會失敗。如需詳細資訊,請參閱 Amazon S3 VPC 端點適用的儲存貯體政策使 CloudFormation 用介面端點存取 (AWS PrivateLink)和範例。

您可以使用等待條件和等待條件句柄來 AWS CloudFormation 暫停堆棧的創建,並在繼續創建堆棧之前等待信號。例如,您可能想要在 Amazon EC2 執行個體上下載和設定應用程式,然後再考慮建立該 Amazon EC2 執行個體完成。

下列清單摘要說明如何搭配使用等待條件與等待條件控點

  • AWS CloudFormation 創建一個等待條件,就像任何其他資源。 AWS CloudFormation 建立等待條件時,會將等待條件的狀態報告為 CREATE _IN_ PROGRESS 並等待,直到收到必要的成功訊號數或等待條件的逾時期間已過期為止。如果在逾時期限到期之前 AWS CloudFormation 收到必要的成功訊號數目,它會繼續建立堆疊;否則,會將等待條件的狀態設定為,CREATE_FAILED並將堆疊復原。

  • Timeout屬性決定 AWS CloudFormation 等待必要的成功訊號數目的時間長度。 Timeout是一個最小綁定屬性,這意味著超時發生的時間不會早於您指定的時間,但可能會在此後不久發生。您可以指定的時間上限是 43200 秒 (12 小時)。

  • 通常,您希望在特定資源 (例如 Amazon EC2 執行個體、資RDS料庫執行個體或 Auto Scaling 群組) 建立後立即開始等待條件。若要執行此作業,請將 DependsOn 屬性新增至等待條件。當您將 DependsOn 屬性新增至等待條件時,您要指定只在特定資源已建立完成後才建立等待條件。建立等待條件後,會 AWS CloudFormation 開始逾時期間並等待成功訊號。

  • 您也可以在其他資源上使用 DependsOn 屬性。例如,在建立使用該資料RDS庫的執行個體之前,您可能需要先在該資料庫執行個體上建立 Amazon 資料庫EC2執行個體並設定資料庫。在這種情況下,您會建立具有指定資料庫執行個體之DependsOn屬性的等待條件,並建立具有指定等待條件之DependsOn屬性的EC2執行個體資源。這樣可確保只有在資料庫EC2執行個體和等待條件完成之後,才能直接建立執行個體。

  • AWS CloudFormation 在將等待條件的狀態設定為CREATE_COMPLETE繼續建立堆疊之前,必須接收指定數目的等待條件的成功訊號。等待條件的 Count 屬性會指定成功訊號數目。若未設定,預設為 1。

  • 等待條件需要等待條件句柄來設置用作信令機制的預先簽名URL。預先簽署URL可讓您傳送訊號,而無需提供您的 AWS 認證。您可以使用預先簽署URL來表示成功或失敗,這是封裝在陳述式中JSON。如需該JSON陳述式的格式,請參閱等待條件信號JSON格式

  • 如果等待條件在逾時期間過期前收到必要的成功訊號數目 (如 Count 屬性中所定義), AWS CloudFormation 會將等待條件標記為 CREATE_COMPLETE,並繼續建立堆疊。否則, AWS CloudFormation 會失敗等待條件並將堆疊復原 (例如,如果逾時期限到期而沒有必要的成功訊號,或者如果收到失敗訊號)。

在堆疊中使用等待條件:
  1. 在堆疊的範本中宣告 AWS::CloudFormation::WaitConditionHandle 資源。等待條件控制代碼沒有任何屬性;不過,WaitConditionHandle資源的參考會解析URL為預先簽署,您可以用來向WaitCondition. 例如:

    "myWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle", "Properties" : { } }
  2. 在堆疊的範本中宣告 AWS::CloudFormation::WaitCondition 資源。WaitCondition資源有兩個必要的屬性:Handle是對範本中WaitConditionHandle宣告的參考,Timeout是等待 AWS CloudFormation 的秒數。您可以選擇性地設定Count屬性,以決定等待條件必須接收的成功訊號數目,才 AWS CloudFormation 能繼續建立堆疊。

    若要控制何時觸發等待條件,您可以在等待條件中設定 DependsOn 屬性。DependsOn 子句會建立資源與等待條件的關聯。 AWS CloudFormation 建立DependsOn資源之後,會封鎖進一步的堆疊資源建立,直到發生下列其中一個事件為止:a) 逾時期限到期 b) 收到必要的成功訊號數 c) 收到失敗訊號。

    以下是等待條件範例,該等待條件會在成功建立 Ec2Instance 資源之後開始,並使用 myWaitHandle 資源作為 WaitConditionHandle,其逾時為 4500 秒,而其預設 Count 為 1 (因為未指定 Count 屬性):

    "myWaitCondition" : { "Type" : "AWS::CloudFormation::WaitCondition", "DependsOn" : "Ec2Instance", "Properties" : { "Handle" : { "Ref" : "myWaitHandle" }, "Timeout" : "4500" } }
  3. 獲取預先簽名URL以用於信令。

    在模板中,URL可以通過將AWS::CloudFormation::WaitConditionHandle資源的邏輯名稱傳遞給 Ref 內部函數來檢索預先簽名。例如,您可以使用AWS::EC2::Instance資源上的UserData屬性將預先簽署URL的資源傳遞給 Amazon EC2 執行個體,以便在這些執行個體上執行的指令碼或應用程式表示成功或失敗: AWS CloudFormation

    "UserData" : { "Fn::Base64" : { "Fn::Join" : [ "", ["SignalURL=", { "Ref" : "myWaitHandle" } ] ] } }

    附註:在 AWS Management Console 或 AWS CloudFormation 命令列工具中,預先簽署會顯示URL為等待條件處理碼資源的實體 ID。

  4. 選取用於偵測堆疊何時進入等待條件的方法。

    如果您建立啟用通知的堆疊,則會將每個堆疊事件的通知 AWS CloudFormation 發佈到指定主題。如果您或您的應用程式訂閱該主題,您可以監視等待條件處理建立事件的通知,並URL從通知訊息擷取預先簽署的項目。

    您也可以使用 AWS Management Console、命 AWS CloudFormation 令列工具或 AWS CloudFormation API.

  5. 使用預先簽名URL來表示成功或失敗。

    要發送信號,您可以使用預先簽名URL發送HTTP請求消息。請求方法必須是 PUT,而且 Content-Type 標頭必須是空白字串或予以省略。請求消息必須是中指定的表單的JSON結構等待條件信號JSON格式

    您必須傳送Count屬性指定的成功訊號數,才能 AWS CloudFormation 繼續建立堆疊。如果您的 Count 大於 1,在傳送至特定等待條件的所有訊號之間,每個訊號的 UniqueId 值必須都是不重複的。UniqueId 是任意英數字串。

    curl 命令是傳送訊號的一種方式。下列範例示範將成功訊號傳送至等待條件的 curl 命令列。

    $ curl -T /tmp/a \ "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aaws-region%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"

    其中文件 /tmp/a 包含以下結構:JSON

    { "Status" : "SUCCESS", "Reason" : "Configuration Complete", "UniqueId" : "ID1234", "Data" : "Application has completed configuration." }

    此範例顯示的curl指令行會傳送相同的成功訊號,但它會將結JSON構做為指令行上的參數傳送。

    $ curl -X PUT \ -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' \ "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aaws-region%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"

等待條件信號JSON格式

當您表示等待條件時,必須使用下列JSON格式:

{ "Status" : "StatusValue", "UniqueId" : "Some UniqueId", "Data" : "Some Data", "Reason" : "Some Reason" }

其中:

StatusValue必須是下列其中一個值:

  • SUCCESS表示成功信號。

  • FAILURE表示失敗信號並觸發失敗的等待條件和堆棧回滾。

UniqueId識別到的信號 AWS CloudFormation。如果等待條件的Count屬性大於 1,則該UniqueId值在針對特定等待條件發送的所有信號中必須是唯一的; 否則, AWS CloudFormation 將認為該信號具有相同的先前發送的信號的重新傳輸UniqueId,並且將忽略該信號。

Data 是您要以訊號傳回的任何資訊。該Data值可以通過調用模板中的 Fn:: GetAtt 函數來訪問。例如,如果您為等待條件建立下列輸出值mywaitcondition,您可以使用 AWS CloudFormation 主控台的aws cloudformation describe-stacks命令、DescribeStacksAPI作業或出索引標籤來檢視Data傳送至的有效訊號所傳送的資訊 AWS CloudFormation:

"WaitConditionData" : { "Value" : { "Fn::GetAtt" : [ "mywaitcondition", "Data" ]}, "Description" : "The data passed back as part of signalling the WaitCondition" },

Fn:: GetAtt 函數函數返回UniqueId和作Data為一個JSON結構內的名稱/值對。下列是由上述定義之 WaitConditionData 輸出值傳回的 Data 屬性範例:

{"Signal1":"Application has completed configuration."}

R@@ eas on 是一個字符串,除了JSON合規性外,對其內容沒有其他限制。