

# インポートオペレーションでドリフトを解決する
<a name="resource-import-resolve-drift"></a>

リソースの構成が意図した構成から逸脱したために、新しい構成を意図した構成として受け入れる必要が生じることがあります。ほとんどの場合は、スタックテンプレート内のリソースの定義を新しい構成で更新することでドリフト結果を解決してから、スタックの更新を実行します。ただし、置換が必要なリソースプロパティが新しい構成によって更新された場合、リソースはスタックの更新中に再作成されます。既存のリソースを保持する場合は、リソースのインポート機能を使用してリソースを更新し、リソースを置き換えることなくドリフト結果を解決できます。

インポートオペレーションによるリソースのドリフトの解決は、次の基本的なステップで行います。
+ [Retain に設定されている DeletionPolicy 属性をリソースに追加します](#resource-import-resolve-drift-console-step-01-update-stack)。これにより、既存のリソースがスタックから取り除かれたときに、削除されるのではなく、保持されます。
+ [テンプレートからリソースを取り除き、スタック更新オペレーションを実行します](#resource-import-resolve-drift-console-step-02-remove-drift)。これにより、スタックからリソースが取り除かれますが、削除はされません。
+ [スタックテンプレートでリソースの実際の状態を記述し、既存のリソースをスタックにインポートし直します](#resource-import-resolve-drift-console-step-03-update-template)。これにより、リソースがスタックに戻され、ドリフト結果を発生させていたプロパティの差異が解決されます。

リソースのインポートについて詳しくは、「[AWS リソースを CloudFormation スタックに手動でインポートする](import-resources-manually.md)」を参照してください。インポートをサポートしているリソースのリストについては、「[リソースタイプのサポート](resource-import-supported-resources.md)」を参照してください。

この例では、`templateToImport.json` という名前の次のテンプレートを使用します。

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        },
        "GamesTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "TableName": "Games",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PROVISIONED",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 1
                }
            }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
  GamesTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Games
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
```

------

この例では、ユーザーが CloudFormation の 外部でリソースを変更したと仮定します。ドリフト検出の実行により、`GamesTable` の `BillingMode` が `PAY_PER_REQUEST` に変更されていることが検出されました。ドリフト検出の詳細については、「[ドリフト検出を使用してスタックとリソースへのアンマネージド型設定変更を検出する](using-cfn-stack-drift.md)」を参照してください。

![コンソールのドリフト結果には、予想される結果と実際の結果が表示されます。](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/drift-results-gamestable.png)


スタックは古くなっており、リソースはライブですが、意図したリソース構成を保持する必要があります。サービスを中断することなく、インポートオペレーションでドリフトを解決することでこれを達成できます。

## CloudFormation コンソールを使用して、インポートオペレーションでドリフトを解決する
<a name="resource-import-resolve-drift-console"></a>

### ステップ 1. Retain 削除ポリシーでスタックを更新する
<a name="resource-import-resolve-drift-console-step-01-update-stack"></a>

**`DeletionPolicy` 属性の `Retain` オプションを使用してスタックを更新するには**

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

1. [**Stacks (スタック)**] ページで、ドリフトしているスタックを選択します。

1. [**Update (更新する)**] を選択し、スタックの詳細ペインから [**Replace current template (既存テンプレートを置き換える)**] を選択します。

1. [**Specify template (テンプレートの指定)**] ページで、次のいずれかの方法を使用して、`Retain` オプションが指定されている `DeletionPolicy` 属性を含む更新済みテンプレートを指定します。
   + [**Amazon S3 URL**] を選択し、テキストボックスでテンプレートの URL を指定します。
   + [**Upload a template file (テンプレートファイルのアップロード)**] を選択し、テンプレートを参照します。

   その後、**[Next]** を選択します。

1. [**Specify stack details (スタックの詳細を指定)**] ページを確認し、[**Next (次へ)**] を選択します。

1. [**Configure stack options (スタックオプションの設定)**] ページを確認し、[**Next (次へ)**] を選択します。

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

*結果*: スタックの [**Events (イベント)**] ページのステータスは `UPDATE_COMPLETE` です。

サービスを中断せずにインポートオペレーションでドリフトを解決するには、スタックから取り除くリソースに対して `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) を指定します。次の例では、`Retain` に設定されている [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) 属性を `GamesTable` リソースに追加しました。

------
#### [ Example JSON ]

```
    "GamesTable": {
        "Type": "AWS::DynamoDB::Table",
        "DeletionPolicy": "Retain",
        "Properties": {
            "TableName": "Games",
```

------
#### [ Example YAML ]

```
  GamesTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: Games
```

------

### ステップ 2. ドリフトしたリソース、関連パラメータ、出力を取り除く
<a name="resource-import-resolve-drift-console-step-02-remove-drift"></a>

**ドリフトしたリソース、関連パラメータ、出力を取り除くには**

1. [**Update (更新する)**] を選択し、スタックの詳細ペインから [**Replace current template (既存テンプレートを置き換える)**] を選択します。

1. [**Specify template (テンプレートの指定)**] ページで、次のいずれかの方法を使用して、更新されたテンプレートにリソース、関連パラメータ、およびスタックテンプレートから削除された出力を指定します。
   + [**Amazon S3 URL**] を選択し、テキストボックスでテンプレートの URL を指定します。
   + [**Upload a template file (テンプレートファイルのアップロード)**] を選択し、テンプレートを参照します。

   その後、**[Next]** を選択します。

1. [**Specify stack details (スタックの詳細を指定)**] ページを確認し、[**Next (次へ)**] を選択します。

1. [**Configure stack options (スタックオプションの設定)**] ページを確認し、[**Next (次へ)**] を選択します。

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

結果: スタックの **[Events]** (イベント) ページの **[Logical ID]** (論理 ID) `GamesTable` のステータスは `DELETE_SKIPPED` です。

CloudFormation がスタックの更新オペレーションを完了するまで待ちます。スタックの更新オペレーションが完了したら、リソース、関連パラメータ、および出力をスタックテンプレートから取り除きます。次に、更新されたテンプレートをインポートします。これらのアクションを完了すると、テンプレートの例は次のようになります。

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
```

------

### ステップ 3. リソースのライブ状態に合わせてテンプレートを更新する
<a name="resource-import-resolve-drift-console-step-03-update-template"></a>

**リソースのライブ状態に合わせてテンプレートを更新するには**

1. 更新されたテンプレートをインポートするには、[**Stack actions (スタックアクション)**] を選択し、[**Import resources into stack (スタックへのリソースのインポート)**] を選択します。  
![コンソールの [Import resources into stack (リソースをスタックにインポートする)] オプション。](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/stack-actions-import.png)

1. このオペレーション中に指定する必要がある項目の一覧に関して [**Import overview (概要をインポート)**] ページを確認し、[**Next (次へ)**] を選択します。

1. [**Specify template (テンプレートの指定)**] ページで、次のいずれかの方法を使用して、更新したテンプレートを指定します。
   + [**Amazon S3 URL**] を選択し、テキストボックスでテンプレートの URL を指定します。
   + [**Upload a template file (テンプレートファイルのアップロード)**] を選択し、テンプレートを参照します。

   その後、**[Next]** を選択します。

1. [**Identify resources (リソースの識別)**] ページで、各ターゲットリソースを識別します。詳細については、「[リソース識別子](import-resources-manually.md#resource-import-identifiers-unique-ids)」を参照してください。

   1. [**Identifier property (識別子のプロパティ)**] で、リソース識別子のタイプを選択します。たとえば、`TableName` プロパティは `AWS::DynamoDB::Table` リソースを識別します。

   1. [**Identifier value (識別子の値)**] に、実際のプロパティ値を入力します。テンプレートの例では、`GamesTable` リソースの `TableName` は `Games` です。

   1. [**次へ**] を選択します。

1. [**Specify stack details (スタックの詳細を指定)**] ページを確認し、[**Next (次へ)**] を選択します。

1. [**Import overview (概要をインポート)**] ページで、インポートするリソースを確認し、[**Import resources (リソースをインポート)**] を選択します。これにより、`AWS::DynamoDB::Table` リソースタイプがスタックにインポートされます。

*結果*: この例では、サービスを中断することなく、インポートオペレーションによってリソースのドリフトを解決しました。インポートアクションの進行状況は、CloudFormation コンソールの [Events] (イベント) タブで確認できます。インポートされたリソースでは、`IMPORT_COMPLETE` ステータスに続いて `CREATE_COMPLETE` ステータスが続き、ステータス理由は**リソースのインポート完了**になります。

CloudFormation がスタックの更新オペレーションを完了するまで待ちます。スタックの更新オペレーションが完了したら、リソースの実際のドリフト状態と一致するようにテンプレートを更新します。たとえば、`BillingMode` は `PAY_PER_REQUEST` に設定され、`ReadCapacityUnits` と `WriteCapacityUnits` は `0` に設定されます。

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        },
        "GamesTable": {
            "Type": "AWS::DynamoDB::Table",
            "DeletionPolicy": "Retain",
            "Properties": {
                "TableName": "Games",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PAY_PER_REQUEST",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 0,
                    "WriteCapacityUnits": 0
                }
            }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
  GamesTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: Games
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST
      ProvisionedThroughput:
        ReadCapacityUnits: 0
        WriteCapacityUnits: 0
```

------