ドリフトの解消 | AWS CoudFormation
参考
フロー
- Drift しているリソースを確認する
- Drift しているリソースに Retain を設定した DeletionPolicy 属性 を追加する
テンプレート変更:Drift しているリソースに Retain に設定した DeletionPolicy を追加するテンプレート更新:スタックを更新( update-stack )する
- Retain に設定したリソースをスタックから切り離す
テンプレート変更:Retain に設定した DeletionPolicy を追加したリソースをテンプレートから削除するテンプレート更新:スタックを更新( update-stack )する
- スタックから切り離したリソースをインポートする
- 実体と一致するように修正したリソースをテンプレートに追加する
テンプレートインポート:スタックへのリソースのインポートを実行する
- (必要に応じて)インポート後の後始末をする
- 不要であれば
DeletionPolicyを元に戻して、スタックを更新( update-stack )する - ドリフト検出を再実行して、ドリフトが解消されたことを確認する
- 不要であれば
注意点
手順 3(切り離し)
- 切り離すリソースを、他のリソースが
Ref/Fn::GetAtt/Fn::ImportValueで参照していると、スタックの更新が失敗します
参照している箇所も先に修正してください(OutputsのExportを他のスタックが使用している場合も同様です) DeletionPolicy: Retainを先に反映しておかないと、テンプレートからリソースを削除したときに実リソースも削除されます(手順 2 を飛ばさないこと)
手順 4(インポート)
- インポートするリソースには、テンプレート上で
DeletionPolicy属性の指定が必要です(Retainを残したままインポートします) - インポートの変更セットでは、インポート以外のリソースの追加・変更・削除を同時に行えません
- インポートするリソースのプロパティは、実体の設定と一致させてください(一致していないとドリフトが再発します)
- 対象のリソースタイプがインポートに対応している必要があります ref. インポートオペレーションをサポートするリソース
- 他のスタックで管理されているリソースはインポートできません
AWS CLI でのインポート例
$ aws cloudformation create-change-set \
--stack-name \
--change-set-name \
--change-set-type IMPORT \
--template-body file:// \
--resources-to-import '[{"ResourceType":"AWS::S3::Bucket","LogicalResourceId":"","ResourceIdentifier":{"BucketName":""}}]'
ResourceIdentifier に指定するキーはリソースタイプごとに異なります。上記の参考ドキュメントを確認してください。