
え!? CloudFormation で既存リソースをインポートするときの “DeletionPolicy” って “Retain” じゃなくてもいいの!?
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
CloudFormation で既存リソースをインポートするとき、インポートするリソースにはテンプレート上で DeletionPolicy 属性を指定する必要があります。
そして、DeletionPolicy 属性の値は "Retain" にする必要があると思っていました。
しかし、とある筋から、"Retain" じゃなくてもインポートできるよ!という情報を入手しました。「"DeletionPolicy" : "Delete"」や「"DeletionPolicy" : "Snapshot"」と指定してもインポート可能だと。 しかも、インポート機能がリリースされた当初からそうだというのです。
確かにドキュメントには、DeletionPolicy 属性が必要とは書いてあるものの、"Retain" にする必要があるとは書いてありません。
- 元のスタックリソースとインポートするリソースの両方を含む、スタック全体を記述するテンプレート。インポートする各リソースには、DeletionPolicy 属性が必要です。
 
既存リソースの CloudFormation 管理への取り込み
それでも、CloudFormation の既存リソースのインポート機能について書かれたブログ記事の多くで "DeletionPolicy" は "Retain" にする必要があると記載されており、半信半疑でした。
そんなときは、実際にやってみて確かめるのが一番!ということで、やってみました!
やってみた
1.「"DeletionPolicy" : "Delete"」でインポートしてみる
まず、下記のコマンドで RDS DB インスタンスを作成しました。
aws rds create-db-instance 
--db-instance-identifier rds-mysql-for-cfn-import 
--db-instance-class db.t3.micro 
--allocated-storage 20 
--storage-type gp2 
--engine mysql 
--engine-version 5.7.31 
--master-username admin 
--master-user-password xxxxxxxxxx
作成された直後の DB インスタンスにはタグがついていませんが、CloudFormation にインポートできたなら CloudFormation のタグが付くはずです。
次に、作成した DB インスタンスを CloudFormation にインポートするためのテンプレートを下記の内容で作成しました。"DeletionPolicy" には "Delete" を指定しています。
---
AWSTemplateFormatVersion: '2010-09-09'
Description: Import test
Resources:
  ImportedRDS:
    Type: AWS::RDS::DBInstance
    DeletionPolicy: Delete
    Properties: 
        AllocatedStorage: 20
        StorageType: gp2
        DBInstanceClass: db.t3.micro
        DBInstanceIdentifier: rds-mysql-for-cfn-import
        Engine: mysql
        EngineVersion: 5.7.31
        MasterUsername: admin
        MasterUserPassword: xxxxxxxxxxそして、インポートしてみたところ、、、

インポートできました!
リソースタブを確認すると、最初に作成した DB インスタンスがこのスタックのリソースになっていました。
念の為、使用したテンプレートの内容を確認すると、"DeletionPolicy" には間違いなく "Delete" が指定されています。
DB インスタンスのほうには、CloudFormation のタグがつきました。
「"DeletionPolicy" : "Delete"」で、問題なくインポートできましたね。。
なお、当然ではありますが、このスタックを削除すると DB インスタンスも削除されました。


誤削除を防ぐためには、"Retain" を指定したほうがいいですね。
2.「"DeletionPolicy" : "Snapshot"」でインポートしてみる
つづいて、"DeletionPolicy" に "Snapshot" を指定してもインポートできるのか、試してみました。
下記のコマンドで RDS DB インスタンスを作成しました。
aws rds create-db-instance 
--db-instance-identifier rds-mysql-for-cfn-import-2 
--db-instance-class db.t3.micro 
--allocated-storage 20 
--storage-type gp2 
--engine mysql 
--engine-version 5.7.31 
--master-username admin 
--master-user-password xxxxxxxxxx
作成された直後の DB インスタンスにはタグがついていませんが、CloudFormation にインポートできたなら CloudFormation のタグが付くはずです。
次に、作成した DB インスタンスを CloudFormation にインポートするためのテンプレートを下記の内容で作成しました。"DeletionPolicy" には "Snapshot" を指定しています。
---
AWSTemplateFormatVersion: '2010-09-09'
Description: Import test
Resources:
  ImportedRDS:
    Type: AWS::RDS::DBInstance
    DeletionPolicy: Snapshot
    Properties: 
        AllocatedStorage: 20
        StorageType: gp2
        DBInstanceClass: db.t3.micro
        DBInstanceIdentifier: rds-mysql-for-cfn-import-2
        Engine: mysql
        EngineVersion: 5.7.31
        MasterUsername: admin
        MasterUserPassword: xxxxxxxxxxそして、インポートしてみたところ、、、
インポートできました!
リソースタブを確認すると、作成した DB インスタンスがこのスタックのリソースになっていました。

念の為、使用したテンプレートの内容を確認すると、"DeletionPolicy" には間違いなく "Snapshot" が指定されています。
DB インスタンスのほうには、CloudFormation のタグがつきました。
「"DeletionPolicy" : "Snapshot"」で、問題なくインポートできましたね。。
そして、このスタックを削除すると DB インスタンスも削除されましたが、スナップショットが作成されました。



まとめ
やってみた結果、CloudFormation で既存リソースをインポートするときに指定する DeletionPolicy 属性の値は、"Retain" じゃなくてもいいということが確かめられました!
個人的には、この事実に結構な衝撃を受けたのですが、その後ドキュメント を確認したところ、ちゃんと書いてありました。。
インポートオペレーションを成功させるには、インポートする各リソースに
DeletionPolicy属性が必要です。DeletionPolicyは任意の使用できる値に設定できます。
もしや知らなかったのは自分だけ...?
教訓
ドキュメントはちゃんと読もう!






