はじめに
個人で使うにはAWSお金かかりすぎますよね。格安VPSをお手軽に使えるようにTerraformで管理したいと思い調べたところ、ConoHA VPSとさくらのVPSが対応していると分かりました。でももっと安いVPS、WebARENA Indigoがあり、これをTerraformで何とか使いたいと思い、カスタムプロバイダを自作してみました(作ってみたものの結局、実用的かと言われると怪しい笑)。
Terraform Custom Provider
Terraformの説明はいまさらなので省略するとして、どうやらカスタムプロバイダが作れるようなので軽く調べてみました。Qiitaにもいくつか記事がありますが、バージョンが古かったりと結局は公式ドキュメントを参考にしました。
Terraform plugins
ざっくりまとめると、CRUDに対応したクラウドAPIを呼び出すプラグインをSDKを使って作成する模様。プラグインはGoを使って実装する。
公式ドキュメントで公開されているプラグインサンプル(terraform-provider-hashicups)があります。
WebARENA Indigo
ありがたいことにWebARENA IndigoはAPIを提供してくれている
(作り始めて分かったのですが、なかなか制約の多い、かつあまり整備されていないAPIで苦労しました)。
Indigo Client Go
APIを直接プラグインから呼び出すことも可能ですが、チュートリアルと同様(hashicups-client-go)にAPIのクライアントライブラリを作成するのが良さそうなので、WebARENA IndigoのGoクライアントライブラリを実装しました。
Goを全く書いたことがない初心者が書いたので、おかしな点があったら指摘してくれるとうれしいです。メンテするモチベはいまのところあまりないですが。。。
Terraform Provider Indigo
Indigo Client Goを使って、チュートリアル手順にしたがって実装したのが、Terraform Provider Indigoです。後述する制限があり、実用上はちょっと厳しいかなと思うので、ずっとα版のままかと思います。
苦労した点
- API呼び出しレート制限が厳しい
- APIは1回/秒以上はダメと返してくるけれど、実際にはもっと厳しくてよく分からない
- 必要なAPIが揃っていない
- "R"が不十分
- ドキュメントが不正確
- 仕様書にないレスポンスが多数
- APIの仕様がリソースごとにマチマチ
- 引数、レスポンス、パス、命名規則、型が揃ってない
- APIの仕様が同じリソースでもマチマチ
- 同じフィールドが、CreateとUpdateで変わる(intだったりstringだったり、日付のタイプ、フォーマットが異なったり)
今の実装でできること
- SSH Keyの登録/削除
- インスタンスの作成/状態変更/削除 (一部の種類のみ)
- スナップショットの作成/削除
- Firewallの作成/更新/削除
備考
インスタンスタイプやプランの仕様が見つけられなかったので、推測でほんの一部の構成をテストしただけです。少しずつドキュメント化していこうかなとは思ってます(公式ドキュメントが整備されないかな〜)。
おわりに
今回カスタムプロバイダを作ってみて、Terraformの裏側が少し見えた気がします。仕組みが分かると、Terraformでできることやトラブルの際にどうやったら解決できるかがより分かるようになる気がしました。ぜひTerraformを使いこなしたい方はチャレンジしてみてください〜(まだ使いこなせてないけれど汗)。