🗺️

terraformerを使って既存システムからIaCファイル作成

2022/03/07に公開

はじめに

terraformを扱うようになって半年。

terraformを使ってインフラコードを管理しているのですが、まだ1からソースコードを書いて、想定したインフラにならないことがあります。

勉強の為にも
https://registry.terraform.io/providers/hashicorp/google/latest/docs
から色んなリソース見てはどのバラメータがどういう制御をしているのかを確認しますが、applyとdestoryを繰り返して時間がかかっているのが現状です。

画面からポチポチとボタンを押して作ったものが正解なんだけど、ソースコード内のタグの設定やパラメータ設定などの足りないこともしばしばあったりします。

既に稼働しているインフラがソースコード管理されてない事もあるかと思います。
手動でポチポチ設定変更だとヒューマンエラーが発生したり、会社によってはインフラ作る手順書を画面をキャプチャしてExcelに貼り付けて管理しているかもしれません。

ソースファイル化する事でのメリットとして

  • 別環境にて同じ構成を形成する事が可能
  • ソースコードを読む事でシステム構成を共有する事ができる
    などがあります。

そこでterraformerという既存システムからIaCをエクスポートできるツールを使ってみました。

Terraformer、その前に

terraformのコマンドをインストールする必要があるのですが、その前にtfenvをインストールします。
terraformのバージョンが環境によって異なったりするので、その為にインストールする事が
多いのですが今回はterraformerコマンドを使用する際に、古いterraformのバージョンを使用する必要があります。

私の使用環境がMacなので、その前提で記載します。

tfenv

tfenv インストール

brew install tfenv

tfenvでインストールできるバージョン一覧

tfenv list-remote

tfenvによるterraformのバージョンを指定してインストール

tfenv install <version number>
tfenv install latest

tfenvでローカルにインストールしているバージョン一覧

tfenv list

ローカルで使用するバージョンを選択する

tfenv use <version number>

Terraformer

github/Terraformer

まずはインストールします。

brew install terraformer

そしてtfenvのローカルのバージョンを公式ドキュメントに記載されてある  
Support terraform 0.13 (for terraform 0.11 use v0.7.9).
に合わせます。2022年3月時点で0.13系で最新は0.13.7でした。

tfenv install 0.13.7
tfenv use 0.13.7

既存システムからインフラコード取得

クラウドはGoogle Cloud Platform(GCP)を前提に記載します。

アカウント確認

gcloud info
gcloud config list

各種設定

gcloud set account <your account>
gcloud config set project <project name>
gcloud config set compute/zone <zone>

アカウントおよびプロジェクト等の設定を確認し、インフラコードを抽出します。

terraformer import google --resources=<resource> --projects=<your project> --regions=<your project region>

取得できるリソース一覧は以下になります。

https://github.com/GoogleCloudPlatform/terraformer/blob/master/docs/gcp.md

resourcesはカンマ区切りにすることで複数入力可能です。

証明書を含むロードバランサのIaCを取得する場合

terraformer import google --resources=globalForwardingRules,targetHttpsProxies,sslCertificates ...

みたいな形で必要なリソースに合わせて取得していきましょう。

プロジェクト内の全てのIaCが欲しい

大きなプロジェクトになるとリソースを個々で指定するのが面倒だと思います。
その時は以下のコマンドで一括で取得できます。

gcloud beta resource-config bulk-export --on-error=continue \
    --resource-format=terraform \
    --project=(project id) > (output file name)

terraformerコマンドではないですねw
terraformerコマンドより少し時間はかかりますが、生成したファイルからterraform planなどで確認してみて下さい。

Discussion