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

スタック障害オプション

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

  • 作成オペレーションを [正常にプロビジョニングされたリソースを保持] に設定すると、成功したリソースの状態が保持されますが、失敗したリソースは、次の更新オペレーションが実行されるまで失敗した状態のままになります。

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

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

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

AWS CloudFormation コンソール、API、または AWS Command Line Interface (AWS CLI) からオペレーションを発行する前に、プロビジョニングされたリソースの障害に対する動作を指定します。次に、他の変更を加えることなく、リソースのデプロイプロセスを続行します。オペレーションに障害が発生した場合、CloudFormation は、各独立したプロビジョニングパスの最初の障害で停止します。CloudFormation はリソース間の依存関係を識別して、独立したプロビジョニングアクションを並列化します。次に、障害が発生するまで、各独立したプロビジョニングパスでリソースのプロビジョニングを続行します。1 つのパスで障害が発生しても、他のプロビジョニングパスには影響しません。CloudFormation は、完了するまでリソースのプロビジョニングを続行するか、別の障害で停止します。

問題を修正して、デプロイプロセスを続行します。CloudFormation は、以前に正常にプロビジョニングできなかったリソースに対してプロビジョニングアクションを再試行する前に、必要な更新を実行します。問題を修正するには、再試行更新、またはロールバックオペレーションを送信します。例えば、Amazon EC2 インスタンスをプロビジョニングしていて、作成オペレーション中に EC2 インスタンスが失敗した場合、失敗したリソースをすぐにロールバックするのではなく、エラーを調査することをお勧めします。システムステータスチェックとインスタンスステータスチェックを確認し、問題が解決したら [再試行] オペレーションを選択できます。

スタックオペレーションが失敗し、[スタック障害オプション] メニューから [正常にプロビジョニングされたリソースを保持する] を指定した場合、次のオプションを選択できます。

  • 再試行 – 失敗したリソースに対するプロビジョニングオペレーションを再試行し、スタックオペレーションが正常に完了するか、次の障害が発生するまで、テンプレートのプロビジョニングを続行します。AWS Identity and Access Management(IAM) アクセス許可など、テンプレートの変更を必要としない問題が原因でリソースのプロビジョニングに失敗した場合は、このオプションを選択します。

  • 更新 – プロビジョニングされたリソースは、テンプレートの更新時に更新されます。作成または更新に失敗したリソースは再試行されます。テンプレートエラーが原因でリソースのプロビジョニングに失敗し、テンプレートを変更した場合は、このオプションを選択します。FAILED 状態のスタックを更新する場合、スタックの更新を続行するには、[スタック障害オプション] の [正常にプロビジョニングされたリソースを保持する] を選択する必要があります。

  • ロールバック – CloudFormation はスタックを最後に既知の安定状態にロールバックします。

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

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

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

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

注記

イミュータブルな更新タイプはサポートされていません。

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

Create stack

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

  1. AWS Management Console にサインインして、https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソールを開きます。

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

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

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

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

    • Create template in Designer (デザイナーでテンプレートを作成)

    設定を受け入れ、[次へ] を選択します。

  4. [スタック詳細の指定] ページで、[スタックの名前] ボックスにスタック名を入力します。

  5. [パラメータ] セクションで、スタックテンプレートで定義されているパラメータを指定します。

    デフォルト値を持つパラメーターを使用または変更できます。

  6. パラメータ値に問題がなければ、[次へ] を選択します。

  7. [スタックオプションの設定] ページで、スタックの追加オプションを設定できます。

  8. [スタック障害オプション] で、[正常にプロビジョニングされたリソースを保持する] を選択します。

  9. スタックオプションに問題がなければ、[次へ] を選択します。

  10. [確認] ページでスタックを確認し、[スタックの作成] を選択します。

結果: リソースの作成に失敗すると、スタックステータスが CREATE_FAILED に変わり、スタックオペレーションで障害が発生したときにスタックがロールバックされないようにします。正常にプロビジョニングされたリソースは CREATE_COMPLETE 状態になります。スタックは [スタックイベント] タブでモニタリングできます。

Update stack

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

  1. AWS Management Console にサインインして、https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソールを開きます。

  2. 更新するスタックを選択し、[更新] を選択します。

  3. [スタックの更新] ページで、次のオプションの 1 つを使用してスタックのテンプレートを選択します:

    • 現在のテンプレートを使用

    • 現在のテンプレートを置換

    • デザイナーでテンプレートを編集

    設定を受け入れ、[次へ] を選択します。

  4. [スタックの詳細の指定] ページで、スタックテンプレートで定義されているパラメータを指定します。

    デフォルト値を持つパラメーターを使用または変更できます。

  5. パラメータ値に問題がなければ、[次へ] を選択します。

  6. [スタックオプションの設定] ページで、スタックの追加オプションを設定できます。

  7. [プロビジョニング失敗時の動作] で、[正常にプロビジョニングされたリソースを保持する] を選択します。

  8. スタックオプションに問題がなければ、[次へ] を選択します。

  9. [確認] ページでスタックを確認し、[スタックの更新] を選択します。

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

Change set
注記

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

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

  1. AWS Management Console にサインインして、https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソールを開きます。

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

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

  4. [変更セットの実行] で、[正常にプロビジョニングされたリソースを保持する] オプションを選択します。

  5. [変更セットの実行] を選択します。

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

正常にプロビジョニングされたリソースを保持する (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://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

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

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

  1. disable-rollback オプションを使用して、update-stack コマンドに既存のスタック名とテンプレートを指定します。

    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 オプションまたは on-failure DO_NOTHING 列挙を指定します。

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