はじめに
IaCでコード管理がされていなかった既存のAWSリソースをCDK for Terraform(CDKTF)で管理できるよう、import作業を行った際のメモです。
config-driven import
config-driven import
のサポートにより、AWSリソースのID等を指定するだけでリソースをterraformの管理下に置くことができるようになりました。
実際のコードをTypescriptを例に見ていきます。
generateConfigForImport
メソッドを使うことで、cdktf plan
実行時にCDKTFのコードを生成することができます。ただし恐らくこの記事を執筆時にはまだ実験段階の機能だったようで、上手く生成できないことが何度かありました(その場合は importFrom
でリソースを指定した後に cdktf plan
でdiffを表示し、自分でコードに落とし込んでいきました)。
// xxxxx に実際のbucket名が入ります
S3Bucket.generateConfigForImport(this, "example_bucket", "xxxxx");
cdktf plan
するとコンソールのログに以下のコードが含まれるのでコピー。
new S3Bucket(this, "example_bucket", {
bucket: "xxxxx",
bucket_prefix: [null],
force_destroy: [null],
object_lock_enabled: false,
tags: {},
tags_all: [{}],
});
ソースコードを以下のように修正。
import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import { AwsProvider } from "@cdktf/provider-aws/lib/provider";
import { S3Bucket } from "@cdktf/provider-aws/lib/s3-bucket";
class MyStack extends TerraformStack {
constructor(scope: Construct, id: string) {
super(scope, id);
new AwsProvider(this, "AWS", {
region: "ap-northeast-1",
});
new S3Bucket(this, "example_bucket", {
bucket: "xxxxx",
objectLockEnabled: false,
}).importFrom("xxxxx");
}
}
const app = new App();
new MyStack(app, "config-driven-import");
app.synth();
cdktf plan
を実行すると以下のように出力されるので、問題なければ cdktf apply
を実行しapprove。
aws_s3_bucket.example_bucket (example_bucket) will be imported
# importのdiffがズラズラと出る
Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.
importFrom
をソースコードから消して cdktf plan
。以下のようにメッセージが出ればimportは完了。
No changes. Your infrastructure matches the configuration.
もし複数環境で同様の作業が発生する場合は、分かりやすい形で importFrom
をコメントアウトしておくと後で作業が楽になります。
...
// this.apiGatewayMethod.importFrom('Add REST-API-ID/RESOURCE-ID/HTTP-METHOD');
CDKTFによるIaC化までの流れ
AWSリソースの状態をCDKTFのコード落とし込み、tfstateに反映させるまで、各環境ごとに大体以下の流れで進めました。
-
generateConfigForImport
でコードを出力 - 必要に応じて
generateConfigForImport
で出力されたコードを修正 -
importFrom
を追加しcdktf plan
、問題なければローカル開発環境からcdktf apply
- AWSコンソールからリソースの状態を確認
- 念の為アプリケーションの挙動に問題ないか動作確認
- 対象の環境において一通りのAWSリソースのCDKTFへの取り込みが完了したらgithub actionsのworkflowを作成し、自動デプロイ等ができるようにする
つまずいた際にお世話になったのが
- cdktf-provider-awsのドキュメント(困ったら対象のリソースのreadmeを見つけるのが恐らく早い)
- CDKTFのドキュメント(特に概念だったり、ツールだったり記法的なところ)
- (もし周りにいれば)CDKTF詳しい方に聞く
まとめ
複数環境でこちらのIaC化作業を行いました。何度かつまずくことがあり思ったより時間がかかりましたが、最初の環境が終わった頃にはある程度慣れていたので、他環境は割とスムーズに進んだ印象です。