0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CDKTFのconfig-driven importでAWSリソースのIaC化

Last updated at Posted at 2024-11-25

はじめに

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に反映させるまで、各環境ごとに大体以下の流れで進めました。

  1. generateConfigForImport でコードを出力
  2. 必要に応じて generateConfigForImport で出力されたコードを修正
  3. importFrom を追加し cdktf plan、問題なければローカル開発環境から cdktf apply
  4. AWSコンソールからリソースの状態を確認
  5. 念の為アプリケーションの挙動に問題ないか動作確認
  6. 対象の環境において一通りのAWSリソースのCDKTFへの取り込みが完了したらgithub actionsのworkflowを作成し、自動デプロイ等ができるようにする

つまずいた際にお世話になったのが

まとめ

複数環境でこちらのIaC化作業を行いました。何度かつまずくことがあり思ったより時間がかかりましたが、最初の環境が終わった頃にはある程度慣れていたので、他環境は割とスムーズに進んだ印象です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?