AWS CDKのリソースを安全にTerraformに移行する
はじめに
レバテック開発部の基盤システムグループの南です。
レバテックではAWS CDKのv1のサポート終了に伴い、CDKで管理されていたリソースをterraformでの管理に移行しています。
今回は、CDKで管理されていたリソースを安全にTerraformに移管する方法を紹介します。
前提
Terraform v1.5以上
ゴール
- CDKのコードが削除され、CDKで管理されていない状態になっている
- CDKと同一のリソースが、Terraformで定義&管理されている状態になっている
サンプル
CDKで作成されたsnsトピックをTerraformに移行するとします。
const topic = new sns.Topic(this, projectName, {
fifo: true,
topicName: topicName
})
ざっくり手順
- importブロックでAWSリソースをterraformに取り込む
- CDKリソースにDeletionPolicyを設定する
- CDKのソースコードを削除する
importブロックでAWSリソースをterraformに取り込む
import
ブロックを使って既存のインフラリソースをTerraformにインポートし、Terraformの管理下におきます。
似たような機能にterraform import
というコマンドがありますが、import
ブロックを使うことでインポートを宣言的に実行することができるようになります。
importブロックを作成する
id
にimport対象のawsリソースの識別子を指定します。識別子はawsリソースごとに異なるので注意が必要で、sns topic
の場合はarn
が識別子になります。
to
は取り込むterraform
モジュールを指定します。
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
# __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のソースコードを削除し、インフラに反映すると実リソースが削除されてしまいます。
そこでDeletionPolicy
をRetain
に設定します。DeletionPolicy
をRetain
に設定することでCDKのソースコード削除時に、実リソースを削除するのでなくCDKでのリソース管理を外すことができます。
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