

# リソースのプロビジョニング時における失敗への対応方法を選択する
<a name="stack-failure-options"></a>

スタックオペレーションが失敗した場合でも、既に正常にプロビジョニングされたリソースを毎回ロールバックし、最初からやり直す必要はありません。その代わりに、`CREATE_FAILED` または `UPDATE_FAILED` ステータスのリソースをトラブルシューティングして、問題が発生した箇所からプロビジョニングを再開することができます。

これを行うには、[正常にプロビジョニングされたリソースの保持] オプションを有効にする必要があります。このオプションは、すべてのスタックデプロイと変更セットオペレーションで利用できます。
+ スタックの作成で **[正常にプロビジョニングされたリソースの保持]** オプションを選択すると、CloudFormation は正常に作成されたリソースの状態を保持しますが、失敗したリソースは次の更新オペレーションが実行されるまで失敗状態のままにしておきます。
+ 更新オペレーションや変更セットオペレーション中に **[正常にプロビジョニングされたリソースの保持]** を選択すると、成功状態のリソースが保持されると同時に、失敗したリソースが最後に認識された安定した状態にロールバックされます。失敗したリソースは `UPDATE_FAILED` 状態になります。最後の安定状態が確認されていないリソースは、次のスタックオペレーション時に削除されます。

**Topics**
+ [スタック障害オプションの概要](#stack-failure-options-overview)
+ [スタックのロールバックを一時停止するために必要な条件](#stack-failure-options-conditions)
+ [正常にプロビジョニングされたリソースを保持する (コンソール)](#stack-failure-options-console)
+ [正常にプロビジョニングされたリソースを保持する (AWS CLI)](#stack-failure-options-cli)

## スタック障害オプションの概要
<a name="stack-failure-options-overview"></a>

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 はスタックを最後の既知の安定状態にロールバックします。

## スタックのロールバックを一時停止するために必要な条件
<a name="stack-failure-options-conditions"></a>

CloudFormation が正常に作成されたリソースを自動的にロールバックして削除しないようにするには、次の条件を満たす必要があります。

1. スタックを作成または更新するときに、**[正常にプロビジョニングされたリソースの保持]** オプションを選択すること。そうすることで、スタックオペレーション全体が失敗した場合でも、正常に作成されたリソースは削除しないよう CloudFormation に指示します。

1. スタックオペレーションが失敗していること。つまり、スタックのステータスが `CREATE_FAILED` または `UPDATE_FAILED` である必要があります。

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

## 正常にプロビジョニングされたリソースを保持する (コンソール)
<a name="stack-failure-options-console"></a>

------
#### [ Create stack ]

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

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. **[スタック]** ページでは、右上の **[スタックの作成]** を選択してから、**[新しいリソースを使用 (標準)]** を選択します。

1. **[前提条件 - テンプレートの準備]** で、**[既存のテンプレートを選択]** を選択します。

1. [**Specify template (テンプレートの指定)**] で、スタックテンプレートを含む S3 バケットの URL を指定するか、スタックテンプレートファイルをアップロードするかを選択します。その後、**[Next]** を選択します。

1. **[Specify stack details]** (スタック詳細の指定) ページで、**[Stack name]** (スタックの名前) ボックスにスタック名を入力します。

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

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

1. パラメータ値が適切であることを確認したら、**[Next]** (次へ) を選択します。

1. **[Configure stack options]** (スタックオプションを設定する) ページでは、スタックのオプションを追加設定できます。

1. **[Stack failure options]** (スタック障害オプション) の場合、**[Preserve successfully provisioned resources]** (正常にプロビジョニングされたリソースを保持する) を選択します。

1. スタックオプションが適切であることを確認したら、**[Next]** (次へ) を選択します。

1. **[Review]** (確認) ページでスタックを確認し、**[Create stack]** (スタックの作成) を選択します。

結果: 作成に失敗したリソースは、スタックオペレーションで障害が発生したときにスタックがロールバックされないように、スタックステータスを `CREATE_FAILED` に移行します。正常にプロビジョニングされたリソースは、`CREATE_COMPLETE` 状態にあります。**[Stack events]** (スタックイベント) タブでスタックを監視できます。

------
#### [ Update stack ]

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

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

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

1. **[Update stack]** (スタックの更新) ページで、以下のいずれかのオプションを使用してスタックのテンプレートを選択します。
   + **既存のテンプレートを使用する**
   + **[Replace current template]** (現在のテンプレートを置換する)
   + **Infrastructure Composer でテンプレートを編集する**

   設定を受け入れて、**[Next]** (次へ) を選択してください。

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

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

1. パラメータ値が適切であることを確認したら、**[Next]** (次へ) を選択します。

1. **[Configure stack options]** (スタックオプションを設定する) ページでは、スタックのオプションを追加設定できます。

1. **[Behavior on provisioning failure]** (プロビジョニングの失敗時の動作) で、**[Preserve successfully provisioned resources]** (正常にプロビジョニングされたリソースを保持する) を選択します。

1. スタックオプションが適切であることを確認したら、**[Next]** (次へ) を選択します。

1. **[Review]** (確認) ページでスタックを確認し、**[Update stack]** (スタックの更新) を選択します。

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

------
#### [ Change set ]

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

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

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

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

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

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

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

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

------

## 正常にプロビジョニングされたリソースを保持する (AWS CLI)
<a name="stack-failure-options-cli"></a>

------
#### [ Create stack ]

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

[create-stack](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) オペレーション中に `--disable-rollback` オプションまたは `on-failure DO_NOTHING` 列挙を指定します。

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

   ```
   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"
   }
   ```

1. **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 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"
   }
   ```

1. **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](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/execute-change-set.html) オペレーション中に `--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"
   }
   ```

1. `--disable-rollback` オプションで変更セットを開始します。

   ```
   aws cloudformation execute-change-set --stack-name myteststack \
       --change-set-name my-change-set -–disable-rollback
   ```

1. **describe-stacks** または **describe-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"
        }
   }
   ```

1. 権限エラーを修正してオペレーションを再試行してください。

   ```
   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"
   }
   ```

1. **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
           }
       ]
   }
   ```

------

### スタックをロールバックする
<a name="roll-back-stack-cli"></a>

[rollback-stack](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/rollback-stack.html) コマンドを使用して、スタックステータスが `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** オペレーションは、スタックに最新の既知の安定状態が含まれていない場合、スタックを削除します。