インポートオペレーションでドリフトを解決する
リソースの構成が意図した構成から逸脱したために、新しい構成を意図した構成として受け入れる必要が生じることがあります。ほとんどの場合は、スタックテンプレート内のリソースの定義を新しい構成で更新することでドリフト結果を解決してから、スタックの更新を実行します。ただし、置換が必要なリソースプロパティが新しい構成によって更新された場合、リソースはスタックの更新中に再作成されます。既存のリソースを保持する場合は、リソースのインポート機能を使用してリソースを更新し、リソースを置き換えることなくドリフト結果を解決できます。
インポートオペレーションによるリソースのドリフトの解決は、次の基本的なステップで行います。
-
Retain に設定されている DeletionPolicy 属性をリソースに追加します。これにより、既存のリソースがスタックから取り除かれたときに、削除されるのではなく、保持されます。
-
テンプレートからリソースを取り除き、スタック更新オペレーションを実行します。これにより、スタックからリソースが取り除かれますが、削除はされません。
-
スタックテンプレートでリソースの実際の状態を記述し、既存のリソースをスタックにインポートし直します。これにより、リソースがスタックに戻され、ドリフト結果を発生させていたプロパティの差異が解決されます。
リソースのインポートについて詳しくは、「リソースインポートを使用して CloudFormation スタックに AWS リソースをインポートする」を参照してください。インポートをサポートしているリソースのリストについては、「リソースタイプのサポート」を参照してください。
この例では、templateToImport.json
という名前の次のテンプレートを使用します。
この例では、ユーザーが CloudFormation の 外部でリソースを変更したと仮定します。ドリフト検出の実行により、GamesTable
の BillingMode
が PAY_PER_REQUEST
に変更されていることが検出されました。ドリフト検出の詳細については、「ドリフト検出を使用してスタックとリソースへのアンマネージド型設定変更を検出する」を参照してください。
スタックは古くなっており、リソースはライブですが、意図したリソース構成を保持する必要があります。サービスを中断することなく、インポートオペレーションでドリフトを解決することでこれを達成できます。
CloudFormation コンソールを使用して、インポートオペレーションでドリフトを解決する
ステップ 1. Retain 削除ポリシーでスタックを更新する
DeletionPolicy
属性の Retain
オプションを使用してスタックを更新するには
AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation
) を開きます。 -
[Stacks (スタック)] ページで、ドリフトしているスタックを選択します。
-
[Update (更新する)] を選択し、スタックの詳細ペインから [Replace current template (既存テンプレートを置き換える)] を選択します。
-
[Specify template (テンプレートの指定)] ページで、次のいずれかの方法を使用して、
Retain
オプションが指定されているDeletionPolicy
属性を含む更新済みテンプレートを指定します。-
[Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。
-
[Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。
[次へ] を選択します。
-
-
[Specify stack details (スタックの詳細を指定)] ページを確認し、[Next (次へ)] を選択します。
-
[Configure stack options (スタックオプションの設定)] ページを確認し、[Next (次へ)] を選択します。
-
[Review
stack-name
(スタック名の確認)] ページで、[Update stack (スタックの更新)] を選択します。
結果: スタックの [Events (イベント)] ページのステータスは UPDATE_COMPLETE
です。
サービスを中断せずにインポートオペレーションでドリフトを解決するには、スタックから取り除くリソースに対して Retain
DeletionPolicy を指定します。次の例では、Retain
に設定されている DeletionPolicy 属性を GamesTable
リソースに追加しました。
ステップ 2. ドリフトしたリソース、関連パラメータ、出力を取り除く
ドリフトしたリソース、関連パラメータ、出力を取り除くには
-
[Update (更新する)] を選択し、スタックの詳細ペインから [Replace current template (既存テンプレートを置き換える)] を選択します。
-
[Specify template (テンプレートの指定)] ページで、次のいずれかの方法を使用して、更新されたテンプレートにリソース、関連パラメータ、およびスタックテンプレートから削除された出力を指定します。
-
[Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。
-
[Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。
[次へ] を選択します。
-
-
[Specify stack details (スタックの詳細を指定)] ページを確認し、[Next (次へ)] を選択します。
-
[Configure stack options (スタックオプションの設定)] ページを確認し、[Next (次へ)] を選択します。
-
[Review
stack-name
(スタック名の確認)] ページで、[Update stack (スタックの更新)] を選択します。
結果: スタックの [Events] (イベント) ページの [Logical ID] (論理 ID) GamesTable
のステータスは DELETE_SKIPPED
です。
CloudFormation がスタックの更新オペレーションを完了するまで待ちます。スタックの更新オペレーションが完了したら、リソース、関連パラメータ、および出力をスタックテンプレートから取り除きます。次に、更新されたテンプレートをインポートします。これらのアクションを完了すると、テンプレートの例は次のようになります。
ステップ 3. リソースのライブ状態に合わせてテンプレートを更新する
リソースのライブ状態に合わせてテンプレートを更新するには
-
更新されたテンプレートをインポートするには、[Stack actions (スタックアクション)] を選択し、[Import resources into stack (スタックへのリソースのインポート)] を選択します。
-
このオペレーション中に指定する必要がある項目の一覧に関して [Import overview (概要をインポート)] ページを確認し、[Next (次へ)] を選択します。
-
[Specify template (テンプレートの指定)] ページで、次のいずれかの方法を使用して、更新したテンプレートを指定します。
-
[Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。
-
[Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。
[次へ] を選択します。
-
-
[Identify resources (リソースの識別)] ページで、各ターゲットリソースを識別します。詳細については、「リソース識別子」を参照してください。
-
[Identifier property (識別子のプロパティ)] で、リソース識別子のタイプを選択します。たとえば、
TableName
プロパティはAWS::DynamoDB::Table
リソースを識別します。 -
[Identifier value (識別子の値)] に、実際のプロパティ値を入力します。テンプレートの例では、
GamesTable
リソースのTableName
はGames
です。 -
[Next] を選択します。
-
-
[Specify stack details (スタックの詳細を指定)] ページを確認し、[Next (次へ)] を選択します。
-
[Import overview (概要をインポート)] ページで、インポートするリソースを確認し、[Import resources (リソースをインポート)] を選択します。これにより、
AWS::DynamoDB::Table
リソースタイプがスタックにインポートされます。
結果: この例では、サービスを中断することなく、インポートオペレーションによってリソースのドリフトを解決しました。インポートアクションの進行状況は、CloudFormation コンソールの [Events] (イベント) タブで確認できます。インポートされたリソースでは、IMPORT_COMPLETE
ステータスに続いて CREATE_COMPLETE
ステータスが続き、ステータス理由はリソースのインポート完了になります。
CloudFormation がスタックの更新オペレーションを完了するまで待ちます。スタックの更新オペレーションが完了したら、リソースの実際のドリフト状態と一致するようにテンプレートを更新します。たとえば、BillingMode
は PAY_PER_REQUEST
に設定され、ReadCapacityUnits
と WriteCapacityUnits
は 0
に設定されます。