terraformer使ってみた

サービスリライアビリティ部の今福です。
今回は複数プロダクト・環境が内包されている AWS アカウントに対して、特定のプロダクト環境を抜き出して別アカウントに移行する案件で terraformerというツールを使用したので、その使用感をお伝えします。先に結論を言うと 生成AIと組み合わせればかなり実用的 でした。

terraformerとは

既存クラウドリソースをリバースエンジニアリングして .tf / .tfstate を生成する OSS CLI です。AWS だけでなく GCP や Azure など複数のクラウドプロバイダをサポートしています。
インストール方法は公式 README を参照してください。
GoogleCloudPlatform/terraformer: CLI tool to generate terraform files from existing infrastructure (reverse Terraform). Infrastructure to Code

自分は Windows PC を利用しているため、バイナリをダウンロードして設定しました。

terraformerを動かすための前準備

terraformer は単体では動かず、AWS CLI と Terraform が利用できる状態が必要です。

1. AWS CLI の認証設定

aws configure で認証情報をセットアップするか、~/.aws/credentials にプロファイルを定義します。

[hoge]
aws_access_key_id = XXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXX
region = ap-northeast-1

2. Terraform の provider 設定

provider.tf を用意して AWS プロバイダを定義しておきます。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 6.0"
    }
  }
}

3. 初期化

terraform init

これでterraformterraformerコマンドが実行できる状態になります。

実際に tf ファイルを生成してみる

準備が整ったら、terraformerコマンドを実行していきます。

terraformer import aws --resources=vpc --connect=true --profile=hoge --regions=ap-northeast-1

実行すると、カレントディレクトリに以下のような構成でファイルが生成されます。

generated/
  aws/
    vpc/
      terraform.tfstate
      vpc.tf
      outputs.tf
      provider.tf

主なオプション

  • resources : 取得対象のリソース(例: s3,iam,lambda
    • 取り込める対象の AWS リソースは以下から参照できます。
    https://github.com/GoogleCloudPlatform/terraformer/blob/master/docs/aws.md
  • profile : 利用する AWS CLI のプロファイル
  • regions : 対象リージョン(複数指定可)
  • filter : 特定リソース ID やタグを条件に抽出

filter オプションの例(タグ指定)

terraformer import aws --resources=s3 --profile=hoge --regions=ap-northeast-1 \\
  --filter="Name=tags.Product;Value=hoge"

この例では、Product=hoge というタグが付与されている S3 バケットのみを対象にしてます。

実際に使ってみてわかったこと

出力されるコードは生の状態

生成された .tf は「そのままのリソース定義」であり、命名規則や依存関係、例えばリソースに紐づくVPCやSubnet、Security Groupなどはハードコーディングされていました。
→生成AIにリファクタリングやモジュール化を依頼することで、手作業での命名規則統一やハードコードの置き換え、共通化の作業を大幅に削減できました。

リソースフィルタリングはタグ頼み

実際の案件では、同じアカウントに複数プロダクトのリソースが混在していたため、フィルタリングが必須でした。terraformer には filter オプションがありますが、リソース名の prefix/suffix でのフィルタリングは不可で、実際に有効な手段だったのはタグでのフィルタリングでした。幸いにも対象リソースには概ねタグが付与されていたため、スムーズに取り込みができました。ただしタグ管理が徹底されていない環境だとかなり苦労しそうだと感じました。

取り込めるリソースには制限がある

上述していますがterraformer は対応していない AWS リソースは取り込めません。主要なサービス(EC2, VPC, S3, IAM, RDS など)は対応しているものの、新しいサービスや一部のマイナーサービスはまだ未対応です。

どんなときに便利

  • レガシー環境を IaC 化したいとき
  • 他チームが作った AWS 環境を引き継ぐとき
  • 移行・分離案件で一部だけ抜き出したいとき

まとめ

terraformer は既存環境を一気にコード化できる強力なツールですが、そのままでは再利用しづらい印象です。ただし生成AIと組み合わせることで モジュール化や命名規則整備を効率化でき、実務でも十分活用可能だと感じました。
今回はタグでフィルタリングできたので助かりましたが、タグ運用が徹底されていない環境では意図していないリソースを取り込んでしまったり、逆にとりこぼしが発生する可能性があるので注意が必要です。