インポートオペレーションでドリフトを解決する - AWS CloudFormation

インポートオペレーションでドリフトを解決する

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

インポートオペレーションによるリソースのドリフトの解決は、次の基本的なステップで行います。

リソースのインポートについて詳しくは、「リソースインポートを使用して CloudFormation スタックに AWS リソースをインポートする」を参照してください。インポートをサポートしているリソースのリストについては、「リソースタイプのサポート」を参照してください。

この例では、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 の 外部でリソースを変更したと仮定します。ドリフト検出の実行により、GamesTableBillingModePAY_PER_REQUEST に変更されていることが検出されました。ドリフト検出の詳細については、「ドリフト検出を使用してスタックとリソースへのアンマネージド型設定変更を検出する」を参照してください。

コンソールのドリフト結果には、予想される結果と実際の結果が表示されます。

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

CloudFormation コンソールを使用して、インポートオペレーションでドリフトを解決する

ステップ 1. Retain 削除ポリシーでスタックを更新する

DeletionPolicy 属性の Retain オプションを使用してスタックを更新するには
  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

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

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

  4. [Specify template (テンプレートの指定)] ページで、次のいずれかの方法を使用して、Retain オプションが指定されている DeletionPolicy 属性を含む更新済みテンプレートを指定します。

    • [Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。

    • [Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。

    [次へ] を選択します。

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

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

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

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

サービスを中断せずにインポートオペレーションでドリフトを解決するには、スタックから取り除くリソースに対して Retain DeletionPolicy を指定します。次の例では、Retain に設定されている DeletionPolicy 属性を 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. ドリフトしたリソース、関連パラメータ、出力を取り除く

ドリフトしたリソース、関連パラメータ、出力を取り除くには
  1. [Update (更新する)] を選択し、スタックの詳細ペインから [Replace current template (既存テンプレートを置き換える)] を選択します。

  2. [Specify template (テンプレートの指定)] ページで、次のいずれかの方法を使用して、更新されたテンプレートにリソース、関連パラメータ、およびスタックテンプレートから削除された出力を指定します。

    • [Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。

    • [Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。

    [次へ] を選択します。

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

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

  5. [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. リソースのライブ状態に合わせてテンプレートを更新する

リソースのライブ状態に合わせてテンプレートを更新するには
  1. 更新されたテンプレートをインポートするには、[Stack actions (スタックアクション)] を選択し、[Import resources into stack (スタックへのリソースのインポート)] を選択します。

    コンソールの [Import resources into stack (リソースをスタックにインポートする)] オプション。
  2. このオペレーション中に指定する必要がある項目の一覧に関して [Import overview (概要をインポート)] ページを確認し、[Next (次へ)] を選択します。

  3. [Specify template (テンプレートの指定)] ページで、次のいずれかの方法を使用して、更新したテンプレートを指定します。

    • [Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。

    • [Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。

    [次へ] を選択します。

  4. [Identify resources (リソースの識別)] ページで、各ターゲットリソースを識別します。詳細については、「リソース識別子」を参照してください。

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

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

    3. [Next] を選択します。

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

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

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

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

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