え!? CloudFormation で既存リソースをインポートするときの “DeletionPolicy” って “Retain” じゃなくてもいいの!?

2021.04.26

はじめに

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 は任意の使用できる値に設定できます。

もしや知らなかったのは自分だけ...?

教訓

ドキュメントはちゃんと読もう!