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

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

在範本中建立等待條件

重要

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

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

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

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

  • 追蹤組態程序的狀態

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

使用等待條件控點

注意

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

您可以使用等待條件和等待條件句柄來 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 屬性。例如,您可能想要先建立 Amazon RDS 資料庫執行個體,並在該資料庫執行個體上設定資料庫,再建立使用該資料庫的 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 以用於傳送訊號。

    在範本中,透過將 AWS::CloudFormation::WaitConditionHandle 資源的邏輯名稱傳遞至 Ref 內部函數,即可擷取預先簽章的 URL。例如,您可以在 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%3Aus-east-2%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%3Aus-east-2%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" },

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

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

Reason 是字串,內容除了需要符合 JSON 規定以外,沒有其他限制。