Terraformerで既存のさくらのクラウド環境からリバースTerraformする
UPDATE: 2022-06 コメントでご指摘いただいたtypoを修正(from: resource=
to resources=
)
既に存在するリソースの情報からTerraformのコード(tfファイル + tfstateファイル
)を生成できるterraformer
というツールがあります。
このTerraformerをフォークしてさくらのクラウド対応を行ったものをリリースしました。
これを使えばさくらのクラウド上に存在するサーバやディスクなどのリソースからTerraformのコードを生成できます。
Terraformerとは
Terraformerとは前述の通り既存のリソースからTerraformのコードを生成してくれるツールです。
様々なプラットフォームに対応しており、現時点での最新版(0.7.9)では以下のようなものに対応しています。
- Google Cloud
- AWS
- OpenStack
- Kubernetes
- Github
- Datadog
- Cloudflare
- Logzio
- NewRelic
Terraformerの大まかな処理の流れは次の通りです。
- 1) 対象プラットフォームのAPIを呼ぶなどして実リソースの情報を取得
- 2) 取得したリソース毎にTerraformプロバイダーの
Refresh
(terraform refresh
コマンド相当の処理)を実行 - 3) 得られたtfstateの情報からtfファイルを生成
1)と3)がTerraformer側で実装されており、2)はgRPCなどでTerraformプロバイダーの実行ファイルを利用する形になっています。 また、1)は対象プラットフォーム毎にプロバイダーという仕組み(インターフェース)で拡張できるようになっており、さくらのクラウド対応はこれを実装して行いました。
さくらのクラウド対応版Terraformer
さくらのクラウド対応版Terraformerを利用するには
- ローカルマシンにインストールする方法
- Dockerを利用する方法(推奨)
の2つの方法があります。
ローカルマシンにインストールする場合
terraformer
コマンドとTerraform/Terraformプロバイダーそれぞれの実行ファイルをローカルマシンにダウンロードしておく必要があります。
それぞれバージョンに注意してダウンロードしてください。
- さくらのクラウド版
terraformer
コマンド: GitHubのリリースページからダウンロード - Terraform: v0.11.12以降、かつ非v0.12以上
- さくらのクラウドTerraformプロバイダー: v1.16.4以降をダウンロードし
~/.terraform.d/plugins/{darwin,linux}_amd64/
に配置
なおterraformer
の次のバージョンからTerraform v0.12対応される見込みです。
それまではTerraform v0.11系を利用しておくのが無難です(使えないこともないがエラーが出る箇所がいくつかある)。
バージョンに気をつけてダウンロードするのはなかなか大変なので次のDockerを利用する方法が推奨です。
Dockerを利用する場合(推奨)
さくらのクラウド対応版terraformer
とTerraform/TerraformプロバイダーをセットにしたDockerイメージを公開しています。
https://hub.docker.com/r/sacloud/terraformer
以下のように利用します。
$ docker run -it --rm -v $PWD:/work sacloud/terraformer
さくらのクラウドAPIキーの指定
APIキーはコマンドラインオプション、または環境変数で指定します。
コマンドラインオプションで指定する場合は--token
/--secret
でAPIトークン/シークレットを指定します。
$ terraformer import sakuracloud --token=APIトークン --secret=APIシークレット --resources=server,disk,icon
環境変数の場合はSAKURACLOUD_ACCESS_TOKEN
/SAKURACLOUD_ACCESS_TOKEN_SECRET
を指定します。
(UsacloudやTerraformなどと同じ環境変数です)
$ export SAKURACLOUD_ACCESS_TOKEN=APIトークン $ export SAKURACLOUD_ACCESS_TOKEN_SECRET=APIシークレット $ terraformer import sakuracloud --resources=server,disk,icon
Dockerの場合は以下のような感じで指定します。
$ docker run -it --rm -v $PWD:/work -e SAKURACLOUD_ACCESS_TOKEN=APIトークン -e SAKURACLOUD_ACCESS_TOKEN_SECRET=APIシークレット sacloud/terraformer
使い方
基本的な使い方
対象となるリソースの種別を指定してterraformer
コマンドを実行します。
例えばサーバを対象とする場合以下のように--resources
オプション(または-r
)を指定して実行します。
$ terraformer import sakuracloud --resources=server
複数のリソース種別を対象にする場合は以下のように--resources
オプションにカンマ区切りで指定します。
# サーバとディスクを対象にする場合 $ terraformer import sakuracloud --resources=server,disk
指定できるリソース種別はGitHubのREADME.mdを参照してください。
https://github.com/sacloud/terraformer#サポートしているリソース
またデフォルトではカレントディレクトリ配下にgenerated/sakuracloud/{リソース種別}/
というディレクトリがリソース種別毎に作成され、その中にtfファイル/tfstateファイルが生成されます。(オプションで変更可能)
例として、シンプル監視を対象にコード生成した場合、以下のようなコードが生成されます。
# シンプル監視を対象にコード生成 $ terraformer import sakuracloud --resources=simpleMonitor # 生成されたコードを確認 $ cat generated/sakuracloud/simpleMonitor/simple_monitor.tf resource "sakuracloud_simple_monitor" "simpleMonitor-000-example" { description = "example" enabled = true health_check { delay_loop = "1800" host_header = "example.usacloud.jp" path = "/status" protocol = "https" status = "200" } notify_email_enabled = false notify_email_html = false notify_slack_enabled = true notify_slack_webhook = "https://hooks.slack.com/services/xxx/xxxx/xxxx" target = "example.usacloud.jp" }
対象リソースを限定する場合
現在は対象リソースをIDで指定することでコード生成の対象リソースを限定できます。
--filter
オプションにTerraformでのリソース種別+リソースのIDをコロン区切りで指定するようになっています。
# IDがid1,id2,id4のリソースのみを対象とする場合 $ terraformer import sakuracloud --resources=server --filter=sakuracloud_server=id1:id2:id4
利用上の注意
残念ながら一部の項目は入力専用となっており、Terraformerから生成できません。例えばサーバの管理者パスワードなどです。
このため、これらの項目については生成されたコードを手作業で修正する必要があります。
出力されない項目はこちらに一覧がありますのでこれを参考に修正してください。
https://github.com/sacloud/terraformer#サポートしない項目
これ以外にもいくつか注意事項がありますのでREADME.mdの利用上の注意を読んだ上でご利用ください。
https://github.com/sacloud/terraformer#利用上の注意
運用上の注意
前述の利用上の注意の通り、出力されない項目がいくつかある問題があるため、DNSレコードの管理やVPCルータの設定を管理するといったシンプルな用途以外は出力されたコードをそのまま実運用するのはなかなか難しいと思います。
出力されたコードは参考程度と割り切って利用するというのも手だと思います。 1からtfファイルを手作業で記載するよりは楽だと思いますのであくまでも道具の一つとしての利用がオススメです。
まとめ
既存のリソースからTerraformのコード生成を行えるTerraformerのさくらのクラウド対応版を紹介しました。
バージョンの縛りがあるためDockerから利用するのがオススメです。
また、いくつか出力されない項目があるなど利用上の注意点が結構あり、出力されたコードをそのまま実運用するというのは難しいです。
とはいえ1からtfファイルを書くより楽になると思いますので利用できる場面では便利にご利用いただけると思います。
ぜひ使ってみてください!
以上です。