参考

フロー

  1. Drift しているリソースを確認する
  2. Drift しているリソースに Retain を設定した DeletionPolicy 属性 を追加する
    1. テンプレート変更:Drift しているリソースに Retain に設定した DeletionPolicy を追加する
    2. テンプレート更新:スタックを更新( update-stack )する
  3. Retain に設定したリソースをスタックから切り離す
    1. テンプレート変更:Retain に設定した DeletionPolicy を追加したリソースをテンプレートから削除する
    2. テンプレート更新:スタックを更新( update-stack )する
  4. スタックから切り離したリソースをインポートする
    1. 実体と一致するように修正したリソースをテンプレートに追加する
    2. テンプレートインポートスタックへのリソースのインポート を実行する
  5. (必要に応じて)インポート後の後始末をする
    1. 不要であれば DeletionPolicy を元に戻して、スタックを更新( update-stack )する
    2. ドリフト検出を再実行して、ドリフトが解消されたことを確認する

注意点

手順 3(切り離し)

  • 切り離すリソースを、他のリソースが Ref / Fn::GetAtt / Fn::ImportValue で参照していると、スタックの更新が失敗します
    参照している箇所も先に修正してください( OutputsExport を他のスタックが使用している場合も同様です)
  • 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 に指定するキーはリソースタイプごとに異なります。上記の参考ドキュメントを確認してください。