スタック障害オプション - AWS CloudFormation

スタック障害オプション

プロビジョニングに失敗した場合、正常にプロビジョニングされたリソースをロールバックせずに失敗時点から開始することで、アプリケーションを繰り返し開発できます。スタック障害オプションを指定することにより、CREATE_FAILED または UPDATE_FAILED ステータスのリソースのトラブルシューティングを行うことができます。すべてのスタックデプロイと変更セットオペレーションの障害オプションをプロビジョニングできます。

  • [Preserve successfully provisioned resources] (正常にプロビジョニングされたリソースの保持) に設定された作成オペレーションは、正常に処理されたリソースの状態を保持しますが、失敗したリソースは、次の更新オペレーションが行われるまで失敗した状態が維持されます。

  • [Preserve successfully provisioned resources] (正常にプロビジョニングされたリソースの保持) に設定された更新および変更セットオペレーションは、失敗したリソースを最後の既知の安定した状態にロールバックしながら、正常にプロビジョニングされたリソースの状態を保持します。失敗したリソースは UPDATE_FAILED 状態になります。最後の安定状態が確認されていないリソースは、次のスタックオペレーション時に削除されます。

失敗したリソースのロールバックの一時停止の詳細については、次のセクションを参照してください。

スタック障害オプションの概要

AWS CloudFormation コンソール、API、または AWS CLI からオペレーションを発行する前に、プロビジョニングされたリソースの失敗時の動作を指定します。次に、他の変更を加えずに、リソースのデプロイプロセスを続行します。運用上の障害が発生した場合、CloudFormation は各独立したプロビジョニングパスの最初の障害時に停止します。CloudFormation は、リソース間の依存関係を特定して、独立したプロビジョニングアクションを並列化します。その後、障害が発生するまで、各独立したプロビジョニングパスでリソースのプロビジョニングに進みます。1 つのパスで障害が発生しても、他のプロビジョニングパスには影響しません。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] (正常にプロビジョニングされたリソースを保持する) を選択する必要があります。

  • [Roll back] (ロールバック) - CloudFormation はスタックを最後の既知の安定状態にロールバックします。

スタックのロールバックを一時停止する条件

スタック内の失敗したリソースのロールバックを一時停止するには、次の条件を満たしている必要があります。

  • スタックオペレーション中に、[Preserve successfully provisioned resources] (正常にプロビジョニングされたリソースを保持する) パラメータを指定する必要があります。ロールバック動作の詳細については、「AWS CloudFormation スタックオプションの設定」を参照してください。

  • スタックオペレーションのスタックステータスは、CREATE_FAILED または UPDATE_FAILED である必要があります。スタックのステータスの詳細については、「スタックステータスコード」を参照してください。

注記

不変の更新の種類はサポートされていません。

正常にプロビジョニングされたリソースを保持する (コンソール)

Create stack
スタックの作成オペレーション中に正常にプロビジョニングされたリソースを保持するには
  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. [Create stack] (スタックの作成) を選択し、[With new resources (standard)] (新しいリソースを使用 (標準)) を選択します。

  3. [Specify template (テンプレートの指定)] ページで、以下のいずれかのオプションを使用してスタックのテンプレートを選択します。

    • Template is ready (テンプレートの準備ができています)

    • Use a sample template (サンプルテンプレートの使用)

    • Application Composer から構築する

    設定を受け入れて、[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 にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. 更新するスタックを選択し、次に [Update] (更新)を選択します。

  3. [Update stack] (スタックの更新) ページで、以下のいずれかのオプションを使用してスタックのテンプレートを選択します。

    • [Use current template] (現在のテンプレートを使用する)

    • [Replace current template] (現在のテンプレートを置換する)

    • Application 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_COMPLETE または UPDATE_COMPLETE 状態にあります。[Stack events] (スタックイベント) タブでスタックを監視できます。

Change set
注記

ステータスが CREATE_FAILED または UPDATE_FAILED のスタックに対して変更セットを開始できますが、ステータスが UPDATE_ROLLBACK_FAILED のスタックに対しては開始できません。

変更セットオペレーション中に正常にプロビジョニングされたリソースを保持するには
  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. 開始する変更セットを含むスタックを選択し、[Change sets] (変更セット) タブを選択します。

  3. 変更セットを選択し、[Execute] (実行) を選択します。

  4. [Execute change set] (変更セットの実行) の場合、[Preserve successfully provisioned resources] (正常にプロビジョニングされたリソースを保持する) オプションを選択します。

  5. [Execute change set] (変更セットの実行) を選択します。

結果: 更新に失敗したリソースは、スタックステータスを UPDATE_FAILED に移行させ、最後の既知の安定状態にロールバックします。最後の安定状態が確認されていないリソースは、次のスタックオペレーション時に CloudFormation によって削除されます。正常にプロビジョニングされたリソースは、CREATE_COMPLETE または UPDATE_COMPLETE 状態にあります。[Stack events] (スタックイベント) タブでスタックを監視できます。

正常にプロビジョニングされたリソースを保持する (AWS CLI)

Create stack
スタックの作成オペレーション中に正常にプロビジョニングされたリソースを保持するには

create-stack オペレーション中に --disable-rollback オプションまたは on-failure DO_NOTHING 列挙を指定します。

  1. create-stack コマンドに --disable-rollback オプションでスタック名とテンプレートを指定します。

    aws cloudformation create-stack --stack-name myteststack --template-body file://DOC-EXAMPLE-BUCKET.json --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. update-stack コマンドに --disable-rollback オプションで既存のスタック名とテンプレートを指定します。

    aws cloudformation update-stack --stack-name myteststack --template-url DOC-EXAMPLE-BUCKET.template --disable-rollback

    このコマンドは、以下の出力を返します。

    {
        "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
    }
  2. describe-stacks または describe-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_FAILED または UPDATE_FAILED のスタックに対して変更セットを開始できますが、ステータスが UPDATE_ROLLBACK_FAILED のスタックに対しては開始できません。

変更セットオペレーション中に正常にプロビジョニングされたリソースを保持するには

execute-change-set オペレーション中に --disable-rollback オプションを指定します。

  1. execute-change-set コマンドに --disable-rollback オプションでスタック名とテンプレートを指定します。

    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-stacks または describe-stack-events コマンドを使用してスタックのステータスを確認します。

    { "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": "MyBucket", "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-stacks または describe-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
            }
        ]
    }

スタックをロールバックする

CREATE_FAILED または UPDATE_FAILED スタックステータスからスタックをロールバックするには

rollback-stack コマンドを使用して、スタックを最後の安定状態にロールバックします。

  • 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 オペレーションは、スタックに最新の既知の安定状態が含まれていない場合、スタックを削除します。