VTRyo Blog

一歩ずつ前に進むブログ

CloudFormationで管理していたリソースを安全にTerraformに移管するならDeletionPolicyを設定する

最初はCloudFormationで作成したリソースを、本格IaC導入に伴ってTerraformを始めとした別のツールに移管するケースがあります。

それを実現する場合、次の手順が考えられます(今回は題名通りTerraformを前提)。

  • CloudFormationで生成されたリソースをTerraformのresourceで定義する
  • Terraform importですでに存在するリソースをtfstateにインポートする
  • CloudFormationのStackを削除する
  • Terraform applyでTerraform管理下にする

ここまではさっと思いつきますが、個人的にはCloudFormationのStackを削除するタイミングで「Stack消したらリソースも消えるのでは」と困りました。

今回はそこを見ていきましょう。

DeletionPolicy: Retain

DeletionPolicy: Retainを使って、Stack管理下から除外できます。

CloudFormation は、スタックを削除する際に、リソースやコンテンツを削除せず保持します。この削除ポリシーは、あらゆるリソースタイプに追加することができます。

docs.aws.amazon.com

というわけでCloudFormationですでに作成されいているStackを編集します。 なんの方法でも良いですが、テンプレートを編集します。今回はクリップボードでコピペしてローカルで編集して再アップロードする方法にします。

CloudFormation - テンプレート

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 - リソース

付与したCloudFormationテンプレートをアップロードし、更新します。

CloudFormation - スタック - スタック名 - スタックの更新

更新されれば、あとはStackを削除してもリソースは削除されずDELETE_SKIPPEDが表示されて完了します。

参考文献

repost.aws