Terraformerで既存のさくらのクラウド環境からリバースTerraformする

UPDATE: 2022-06 コメントでご指摘いただいたtypoを修正(from: resource= to resources=)

既に存在するリソースの情報からTerraformのコード(tfファイル + tfstateファイル)を生成できるterraformerというツールがあります。

github.com

このTerraformerをフォークしてさくらのクラウド対応を行ったものをリリースしました。

github.com

これを使えばさくらのクラウド上に存在するサーバやディスクなどのリソースからTerraformのコードを生成できます。

Terraformerとは

Terraformerとは前述の通り既存のリソースからTerraformのコードを生成してくれるツールです。
様々なプラットフォームに対応しており、現時点での最新版(0.7.9)では以下のようなものに対応しています。

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の次のバージョンから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/--secretAPIトークン/シークレットを指定します。

$ 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ファイルを書くより楽になると思いますので利用できる場面では便利にご利用いただけると思います。

ぜひ使ってみてください!

以上です。