選擇佈建資源時如何處理失敗 - AWS CloudFormation

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

選擇佈建資源時如何處理失敗

如果您的堆疊操作失敗,則不必回復已成功佈建的資源,並從頭開始。反之,您可以對處於 CREATE_FAILEDUPDATE_FAILED 狀態的資源進行故障診斷,然後從發生問題的點繼續佈建。

若要這樣做,您必須啟用保留成功佈建的資源選項。此選項適用於所有堆疊部署和變更集操作。

  • 對於堆疊建立,如果您選擇保留成功佈建的資源選項, 會 CloudFormation 保留成功建立的資源狀態,並使失敗的資源處於失敗狀態,直到執行下一個更新操作為止。

  • 在更新和變更集操作期間,選擇保留成功佈建的資源,在將失敗的資源復原至其最後已知的穩定狀態時,會保留成功資源的狀態。失敗的資源將處於 UPDATE_FAILED 狀態。沒有上一個已知穩定狀態的資源將在下一次堆疊操作時遭刪除。

堆疊失敗選項概觀

從 CloudFormation 主控台、 API或 發出 操作之前 AWS CLI,請指定佈建資源失敗的行為。然後,繼續進行資源的部署過程,而無需進行任何其他修改。發生操作故障時, 會在每個獨立佈建路徑中第一次失敗時 CloudFormation 停止。 會 CloudFormation 識別資源之間的相依性,以平行化獨立佈建動作。然後,它會繼續在每個獨立佈建路徑上佈建資源,直到遇到失敗為止。一個路徑中的失敗不會影響其他佈建路徑。 CloudFormation 會繼續佈建資源,直到完成或停止不同的失敗為止。

修復任何問題以繼續部署程序。在對無法成功佈建的資源重試佈建動作之前, 會 CloudFormation 執行必要的更新。您可以透過提交 Retry (重試)、Update (更新) 或 Roll back (復原) 操作來修復問題。例如,如果您佈建 Amazon EC2執行個體,而EC2執行個體在建立操作期間失敗,您可能想要調查錯誤,而不是立即轉返失敗的資源。您可以檢閱系統狀態檢查和執行個體狀態檢查,一旦問題得到解決,選取 Retry (重試) 操作。

當堆疊操作失敗,並且您已經從 Stack failure options (堆疊失敗選項) 選單指定 Preserve successfully provisioned resources (保留已成功佈建的資源) 時,您可以選取下列選項。

  • Retry (重試) – 在失敗的資源上重試佈建操作,並繼續佈建範本,直到成功完成堆疊操作或下一次失敗為止。如果資源因為不需要修改範本的問題而無法佈建,例如 AWS Identity and Access Management (IAM) 許可,請選取此選項。

  • Update (更新) – 已佈建的資源會在範本更新時更新。將重試建立或更新失敗的資源。如果資源因範本錯誤而無法佈建,且您已修改範本,請選取此選項。當您更新狀態為 FAILED 的堆疊時,您必須針對 Stack failure options (堆疊失敗選項) 選取 Preserve successfully provisioned resources (保留已成功佈建的資源),以繼續更新您的堆疊。

  • 復原 – CloudFormation 將堆疊復原至最後已知的穩定狀態。

暫停堆疊復原的必要條件

若要 CloudFormation 防止 自動轉返和刪除已成功建立的資源,必須符合下列條件。

  1. 當您建立或更新堆疊時,您必須選擇保留成功佈建資源的選項。這會告知 CloudFormation 不會刪除已成功建立的資源,即使整體堆疊操作失敗。

  2. 堆疊操作必須失敗,這表示堆疊狀態為 CREATE_FAILEDUPDATE_FAILED

注意

不支援不可變更新類型。

保留已成功佈建的資源 (主控台)

Create stack
在建立堆疊操作期間保留已成功佈建的資源
  1. 登入 AWS Management Console 並在 https://console.aws.amazon.com/cloudformation 開啟 AWS CloudFormation 主控台。

  2. 選擇 Create stack (建立堆疊),然後選取 With new resources (standard) (使用新資源 (標準))。

  3. Specify template (指定範本) 頁面上,使用下列其中一個選項選擇堆疊範本:

    • 範本已就緒

    • 使用範例範本

    • 從基礎設施編寫器建置

    接受您的設定並選取 Next (下一步)。

  4. Specify stack details (指定堆疊詳細資訊) 頁面上,在 Stack name (堆疊名稱) 方塊中輸入堆疊名稱。

  5. Parameters (參數) 部分中,指定堆疊範本中定義的參數。

    您可以用預設值來使用或變更任何參數。

  6. 當您滿意參數值時,請選擇 Next (下一步)。

  7. Configure stack options (設定堆疊選項) 頁面上,您可以設定堆疊的其他選項。

  8. 對於 Stack failure options (堆疊失敗選項),請選取 Preserve successfully provisioned resources (保留已成功佈建的資源)。

  9. 當您滿意堆疊選項時,請選擇 Next (下一步)。

  10. Review (檢閱) 頁面上檢閱您的堆疊並選取 Create stack (建立堆疊)。

結果:建立失敗的堆疊會將堆疊狀態轉換為 CREATE_FAILED,以防止堆疊在堆疊操作遭遇失敗時復原。已成功佈建的資源處於 CREATE_COMPLETE 狀態。您可以在 Stack events (堆疊事件) 索引標籤中監控堆疊。

Update stack
在更新堆疊操作期間保留已成功佈建的資源
  1. 登入 AWS Management Console 並在 https://console.aws.amazon.com/cloudformation 開啟 AWS CloudFormation 主控台。

  2. 選取您希望更新的堆疊,然後選擇 Update (更新)。

  3. Update stack (更新堆疊) 頁面上,使用下列其中一個選項選擇堆疊範本:

    • Use current template (使用目前範本)

    • Replace current template (取代目前範本)

    • 在 Infrastructure Composer 中編輯範本

    接受您的設定並選取 Next (下一步)。

  4. Specify stack details (指定堆疊詳細資訊) 頁面上,指定堆疊範本中所定義的參數。

    您可以用預設值來使用或變更任何參數。

  5. 當您滿意參數值時,請選擇 Next (下一步)。

  6. Configure stack options (設定堆疊選項) 頁面上,您可以設定堆疊的其他選項。

  7. 對於 Behavior on provisioning failure (佈建失敗時的行為),選取 Preserve successfully provisioned resources (保留已成功佈建的資源)。

  8. 當您滿意堆疊選項時,請選擇 Next (下一步)。

  9. Review (檢閱) 頁面上檢閱您的堆疊並選取 Update stack (更新堆疊)。

結果:更新失敗的堆疊會將狀態轉換為 UPDATE_FAILED,並復原到上一個已知穩定狀態。沒有最後已知穩定狀態的資源將在下一個堆疊操作 CloudFormation 時由 刪除。已成功佈建的資源處於 CREATE_COMPLETEUPDATE_COMPLETE 狀態。您可以在 Stack events (堆疊事件) 索引標籤中監控堆疊。

Change set
注意

您可以為狀態為 CREATE_FAILEDUPDATE_FAILED 的堆疊啟動變更集,但不適用於狀態 UPDATE_ROLLBACK_FAILED

在變更集操作期間保留已成功佈建的資源
  1. 登入 AWS Management Console 並在 https://console.aws.amazon.com/cloudformation 開啟 AWS CloudFormation 主控台。

  2. 選取包含您要啟動的變更集的堆疊,然後選擇 Change sets (變更集) 索引標籤。

  3. 選取變更集,然後選擇 Execute (執行)。

  4. 對於 Execute change set (執行變更集),選取 Preserve successfully provisioned resources (保留已成功佈建的資源) 選項。

  5. 選取 Execute change set (執行變更集)。

結果:更新失敗的堆疊會將狀態轉換為 UPDATE_FAILED,並復原到上一個已知穩定狀態。沒有最後已知穩定狀態的資源將在下一個堆疊操作 CloudFormation 時由 刪除。已成功佈建的資源處於 CREATE_COMPLETEUPDATE_COMPLETE 狀態。您可以在 Stack events (堆疊事件) 索引標籤中監控堆疊。

保留已成功佈建的資源 (AWS CLI)

Create stack
在堆疊建立操作期間保留已成功佈建的資源

指定 create-stack 操作期間的 --disable-rollback 選項或 on-failure DO_NOTHING 列舉。

  1. 使用 --disable-rollback 選項向 create-stack 命令提供堆疊名稱和範本。

    aws cloudformation create-stack --stack-name myteststack \ --template-body file://template.yaml \ --disable-rollback

    命令會傳回下列輸出:

    {     "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
  2. 使用 describe-stacks命令描述堆疊的狀態。

    aws cloudformation describe-stacks --stack-name myteststack

    命令會傳回下列輸出:

    {     "Stacks":  [         {             "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",             "Description": "AWS CloudFormation Sample Template",             "Tags": [],             "Outputs": [],             "StackStatusReason": “The following resource(s) failed to create: [MyBucket]”,             "CreationTime": "2013-08-23T01:02:15.422Z",             "Capabilities": [],             "StackName": "myteststack",             "StackStatus": "CREATE_FAILED",             "DisableRollback": true         }     ] }
Update stack
在堆疊更新操作期間保留成功佈建的資源
  1. 使用 --disable-rollback 選項向 update-stack 命令提供現有堆疊名稱和範本。

    aws cloudformation update-stack --stack-name myteststack \ --template-url https://s3.amazonaws.com/amzn-s3-demo-bucket/updated.template --disable-rollback

    命令會傳回下列輸出:

    {     "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
  2. 使用 describe-stacksdescribe-stack-events命令描述堆疊的狀態。

    aws cloudformation describe-stacks --stack-name myteststack

    命令會傳回下列輸出:

    { "Stacks":  [         {             "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",             "Description": "AWS CloudFormation Sample Template",             "Tags": [],             "Outputs": [],             "CreationTime": "2013-08-23T01:02:15.422Z",             "Capabilities": [],             "StackName": "myteststack",             "StackStatus": "UPDATE_COMPLETE",             "DisableRollback": true         }     ] }
Change set
注意

您可以為狀態為 CREATE_FAILEDUPDATE_FAILED 的堆疊啟動變更集,但不適用於狀態 UPDATE_ROLLBACK_FAILED

在變更集操作期間保留已成功佈建的資源

execute-change-set操作期間指定 --disable-rollback選項。

  1. 使用 --disable-rollback 選項向 execute-change-set 命令提供堆疊名稱和範本。

    aws cloudformation execute-change-set --stack-name myteststack \ --change-set-name my-change-set --template-body file://template.yaml

    命令會傳回下列輸出:

    {  "Id": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/my-change-set/bc9555ba-a949-xmpl-bfb8-f41d04ec5784",  "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
  2. 使用 --disable-rollback 選項啟動變更集。

    aws cloudformation execute-change-set --stack-name myteststack \ --change-set-name my-change-set -–disable-rollback
  3. 使用 describe-stacksdescribe-stack-events命令判斷堆疊的狀態。

    aws cloudformation describe-stack-events --stack-name myteststack

    命令會傳回下列輸出:

    { "StackEvents": [ { "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896", "EventId": "49c966a0-7b74-11ea-8071-024244bb0672", "StackName": "myteststack", "LogicalResourceId": " MyBucket", "PhysicalResourceId": "myteststack-MyBucket-abcdefghijk1", "ResourceType": "AWS::S3::Bucket", "Timestamp": "2020-04-10T21:43:17.015Z", "ResourceStatus": "UPDATE_FAILED" "ResourceStatusReason": "User XYZ is not allowed to perform S3::UpdateBucket on MyBucket" } }
  4. 修正許可錯誤,然後重試操作。

    aws cloudformation update-stack --stack-name myteststack \ --use-previous-template --disable-rollback

    命令會傳回下列輸出:

    {     "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
  5. 使用 describe-stacksdescribe-stack-events命令描述堆疊的狀態。

    aws cloudformation describe-stacks --stack-name myteststack

    命令會傳回下列輸出:

    {     "Stacks":  [         {             "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",             "Description": "AWS CloudFormation Sample Template",             "Tags": [],             "Outputs": [],             "CreationTime": "2013-08-23T01:02:15.422Z",             "Capabilities": [],             "StackName": "myteststack",             "StackStatus": "UPDATE_COMPLETE",             "DisableRollback": true         }     ] }

復原堆疊

您可以使用 Rollback-stack 命令,將具有 CREATE_FAILED或 堆疊狀態的UPDATE_FAILED堆疊復原至其最後穩定狀態。

下列rollback-stack命令會復原指定的堆疊。

aws cloudformation rollback-stack --stack-name myteststack

命令會傳回下列輸出:

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
注意

如果堆疊不包含上一個已知穩定狀態,rollback-stack 操作將刪除堆疊。