⛑️

AWS CDKのリソースを安全にTerraformに移行する

2024/02/05に公開

はじめに

レバテック開発部の基盤システムグループの南です。
レバテックではAWS CDKのv1のサポート終了に伴い、CDKで管理されていたリソースをterraformでの管理に移行しています。
今回は、CDKで管理されていたリソースを安全にTerraformに移管する方法を紹介します。

前提

Terraform v1.5以上

ゴール

  • CDKのコードが削除され、CDKで管理されていない状態になっている
  • CDKと同一のリソースが、Terraformで定義&管理されている状態になっている

サンプル

CDKで作成されたsnsトピックをTerraformに移行するとします。

sns.ts
const topic = new sns.Topic(this, projectName, {
  fifo: true,
  topicName: topicName
})

ざっくり手順

  1. importブロックでAWSリソースをterraformに取り込む
  2. CDKリソースにDeletionPolicyを設定する
  3. CDKのソースコードを削除する

importブロックでAWSリソースをterraformに取り込む

importブロックを使って既存のインフラリソースをTerraformにインポートし、Terraformの管理下におきます。
https://developer.hashicorp.com/terraform/language/import
似たような機能にterraform importというコマンドがありますが、importブロックを使うことでインポートを宣言的に実行することができるようになります。

importブロックを作成する

idにimport対象のawsリソースの識別子を指定します。識別子はawsリソースごとに異なるので注意が必要で、sns topicの場合はarnが識別子になります。
toは取り込むterraformモジュールを指定します。

import.tf
import {
  id = "arn:aws:sns:ap-northeast-1:${local.project_name}:${local.topic_name}.fifo" # リソースの識別子
  to = aws_sns_topic.topic                  # import 先
}

terraform planコマンドでtfファイルを自動生成する

importブロックを作成したらterraform plan -generate-config-out=ファイル名コマンドを使用し、tfファイルを自動生成します。

$ terraform plan -generate-config-out=sns.tf
sns.tf
# __generated__ by Terraform
# Please review these resources and move them into your main configuration files.

# __generated__ by Terraform
resource "aws_sns_topic" "topic" {
  fifo_topic                  = true
  name                        = "topic-name"
~~~
  content_based_deduplication = false
}

CDKリソースにDeletionPolicyを設定する

続いてCDKのリソース管理を外します。デフォルトで、CDKのソースコードを削除し、インフラに反映すると実リソースが削除されてしまいます。
そこでDeletionPolicyRetainに設定します。DeletionPolicyRetainに設定することでCDKのソースコード削除時に、実リソースを削除するのでなくCDKでのリソース管理を外すことができます。

sns.ts
const topic = new sns.Topic(this, projectName, {
  fifo: true,
  topicName: topicName
})
topic.applyRemovalPolicy(cdk.RemovalPolicy.RETAIN)
$ cdk diff XXX
~~~
Stack XXXXX
Resources
[~] AWS::SNS::Topic XXX XXXXXXXX 
 ├─ [+] DeletionPolicy
 │   └─ Retain
 └─ [+] UpdateReplacePolicy
     └─ Retain
~~~
$ cdk deploy XXX

CDKのソースコードを削除する

最後にソースコードを削除します。
diffを実行するとcdk管理下から外すSNSトピックにorphanという文字が表示されています。
これは、SNSトピックはスタックからは削除されるがリソース自体は削除されず残り続けるということです。
deployを実施する前は必ずorphanという文字列が表示されていることを確認してください。

$ cdk diff XXXX
~~~
Stack XXXXX
[-] AWS::SNS::Topic XXXX orphan
~~~

終わりに

AWS CDKで管理されているリソースを安全にTerraformに移管する方法を解説しました。
Terraformでリソースをモジュール化したい場合など、もう一手間必要ですが、大体今回紹介した手順で移行できると思います。

おしまい。

レバテック開発部

Discussion