Terraformerでクラウド構成をエクスポート

Terraformerは、稼働中のクラウドからterraform向けの構成ファイルをエクスポートできるCLIツールです。

インストール

GitHubの ReleasesページからCLIバイナリそのものをダウンロードできます。
操作対象クラウドとクライアントOS別に多数のビルドがあるため、目的に合わせて適切なファイルをダウンロードします。

基本的にはPATHのとおった場所に置くだけで動作します。必要に応じてchmod +xで実行属性を追加し、ファイル名をterraformerに変更します。

実行の準備(GCP向け)

terraformerにくわえて、terraformが対象クラウドを操作できる環境も必要です。
GCPの場合、ワーキングディレクトリに以下のようなmain.tfファイルを置きます。

provider "google" {
  project     = "my-project-id"
  region      = "us-central1"
}

projectとregionは実際の構成に合わせます。terraform initを実行するとGCP用のProviderをインストールします。
また、クラウドアクセスのための認証も必要になります。 Google Provider Configuration Referenceを参照して、用途にあった認証を実行しておきます。

前提となるterraformの設定に不備があると、terraformer実行時にアクセス拒否や404エラーの挙動になります。

GCP以外のクラウドについては、各terraform Providerのセットアップに従います。

構成エクスポート

terraformer import google --resources "*"コマンドにより、全リソースをエクスポートします。

対象リソースを限定する場合には、--resourcesオプションに個別のリソース名をカンマ区切りで列挙します。
リソース名はterraformer import google list --projects <project_name>で一覧表示できます。

全リソースをエクスポートした場合、設定のない空のリソースもエクスポートされます。
これらはtfstateファイルに空のデータが出力されています。

リソースの分割

terraformは、全構成のうち任意のサブリソース単位で分割管理できます。
たとえばプロキシの例では、targetTcpProxy, forwardingRules, backendServices, healthChecksといったセットになります。

結論としては、terraformerを運用プロセスに組み込む場合にはリソース単位の分割が自然でしょう。terraformer --resources targetTcpProxyといったエクスポートになります。
terraformer --filterオプションで論理的に抽出する機能はあるのですが、依存リソースにはフィルタがかからないため、ツールで意味のあるまとまりをエクスポートするには難があります。

複数のリソースをアトミックに変更しなくてはならないケースも考えにくく、実用上は各リソースを切り分けても支障はないでしょう。

導入当初はエクスポート対象の特定のため、全リソースをエクスポートして分析することが推奨です。

リージョン指定

GCPの構成オブジェクトは、地理的にグローバルに属すものと、特定リージョンに属すものがあります。
たとえば、グローバル外部HTTPSロードバランサの設定はグローバルオブジェクトで、GCEインスタンスなどはリージョナルなオブジェクトです。

terraformerはデフォルトでグローバルのオブジェクトをエクスポートするため、リージョンオブジェクトをエクスポートするには--regions <target_region>オプションを指定して実行します。

現行terraformバージョンへのマイグレーション

terraformer v0.8.21はterraform v0.13向けのフォーマットを出力します。
Migration state versionの説明のとおり、terraformで現行バージョン向けに変換しておく必要があります。

terraform state replace-provider -auto-approve "registry.terraform.io/-/google" "hashicorp/google"
中馬崇尋
Chuma Takahiro