🕵️

【コードリーディング】Terraformerの仕組みを覗いてみたメモ

2022/11/06に公開

Terraformer とは

Terraformの tf ファイル(ユーザーが記述するインフラの定義ファイル)と tfstate(実環境の構成を記録しておくファイル。Terraformで自動生成される) ファイルを環境から自動で生成してくれるツール
https://github.com/GoogleCloudPlatform/terraformer

  • Disclaimer: This is not an official Google product
  • Created by: Waze SRE
  • Terraform v0.12.13 に依存
  • terraformer-aws import aws -r=acm --regions=ap-northeast-1

    • のように打つと acm の tfファイルと tfstate ファイルができあがる(SUGEEEEE)
  • Terraformでサポートされている全部のリソースが対応しているわけでは無い

疑問だったこと(今回のモチベーション)

  • Terraformerはどうやって .tf ファイルを生成しているのか?
    • Terraformer が(例えばAWSとかの)APIを叩いて自力でパースしている?
      • ただ、だとすると、APIのレスポンスから tf や tfstate に変換する処理を全部Terraformerが行っている?それはかなり大変そうなので実際は何かしらうまくやっているのか?

分かったこと(仕組みの大まかな流れ)

①Terraformerが対象サービスのAPIを実行し、リソースのIDを取得する
②「①」で得たIDからTerraformのプロバイダを用いてtfstateを生成する
③「②」で得たtfstate から tf ファイルへコンバートして出力する

ソースコードとの対応(AWSのACMの例)

①Terraformerが対象サービスのAPIを実行し、リソースのIDを取得する

ここはTerraformrが自力で。

https://github.com/GoogleCloudPlatform/terraformer/blob/master/providers/aws/acm.go#L35-L61

②「①」で得たIDからTerraformのプロバイダを用いてtfstateを生成する

https://github.com/GoogleCloudPlatform/terraformer/blob/master/terraformutils/providerwrapper/provider.go#L171-L175

👆からTerraform~Terraformプロバイダに処理が移っていく。

https://github.com/hashicorp/terraform/blob/v0.12.31/plugin/grpc_provider.go#L318-L354

「②」で得たtfstate から tf ファイルへコンバートして出力する

以下コード部の ktfstateattributes のキーが入る。ここで tf ファイルに必要な項目だけを抜き出している。
命名規則やスキーマ等の条件から抽出しているらしい。

https://github.com/GoogleCloudPlatform/terraformer/blob/master/terraformutils/flatmap.go#L97-L155

感想

仕組みが分かると楽しい。

関連

大まかな流れの解説がある
https://speakerdeck.com/int_tt/terraformerfalseohanasi?slide=4

試しにTerraformerに欲しかったリソース(lambda permission)のPR出してみた。上述の通り、Terraformの仕組みを使ってほとんどの処理は自動化されているので、Terraformerとしてリソースの追加に必要なのは①のIDの取得部分のみ。
https://github.com/GoogleCloudPlatform/terraformer/pull/1499

Discussion