最初はCloudFormationで作成したリソースを、本格IaC導入に伴ってTerraformを始めとした別のツールに移管するケースがあります。
それを実現する場合、次の手順が考えられます(今回は題名通りTerraformを前提)。
- CloudFormationで生成されたリソースをTerraformのresourceで定義する
- Terraform importですでに存在するリソースをtfstateにインポートする
- CloudFormationのStackを削除する
- Terraform applyでTerraform管理下にする
ここまではさっと思いつきますが、個人的にはCloudFormationのStackを削除する
タイミングで「Stack消したらリソースも消えるのでは」と困りました。
今回はそこを見ていきましょう。
DeletionPolicy: Retain
DeletionPolicy: Retain
を使って、Stack管理下から除外できます。
CloudFormation は、スタックを削除する際に、リソースやコンテンツを削除せず保持します。この削除ポリシーは、あらゆるリソースタイプに追加することができます。
というわけでCloudFormationですでに作成されいているStackを編集します。 なんの方法でも良いですが、テンプレートを編集します。今回はクリップボードでコピペしてローカルで編集して再アップロードする方法にします。
Stackで生成されているリソースに対してDeletionPolicy: Retainを追加します。
- 例
AWSTemplateFormatVersion: '2010-09-09' Resources: myS3Bucket: Type: AWS::S3::Bucket DeletionPolicy: Retain
リソースに付与漏れがあると事故るので、リソースの数とDeletionPolicy: Retainの数が一致するかくらいは確認しましょう(これ機械的に確認する方法はないんだろうか?)。
次のコマンドでリソース数を数えられます
aws --profile PROFILE_NAME cloudformation describe-stack-resources --stack-name STACK_NAME | jq '.StackResources | length'
なおGUIでも見れます。
付与したCloudFormationテンプレートをアップロードし、更新します。
更新されれば、あとはStackを削除してもリソースは削除されずDELETE_SKIPPED
が表示されて完了します。