はじめに
Terraformがv1.4のリリースおめでとうございます。Terraform連載2023 の2リソース目の記事です。
v1.4リリースとは関係ないですが、TerraCurlというツールが面白そうだったので触ってみました。TerraCurlは以下の2023.2.22 のHashiCorpさんのブログで紹介されています。
リポジトリはdevops-rob/terraform-provider-terracurlです。
TerraCurlの使いどころ
AWS、Google Cloud、Azureなど、日進月歩で新しいサービス、新機能が追加されています。例えば以下は ITmediaさんのページ から引用した、AWSの機能追加の推移ですがその勢いは加速しています。
クラウドベンダー、SaaSサービス側の機能追加に合わせて、Terraform Provider側の開発が進むので、新しい機能を利用しようとしても、まだ対応していない、といった場面がまれに発生します。Provider側へPull Requestを出しOSSコントリビュートして推進に関与するというのがあるべきアプローチの1つだと思いますが、業務スケジュール上、できるだけ急ぎで対応したいということが多いでしょう。
こういった場面で役立つのが今回紹介するTerraCurlです。
local-exec
従来、Providerが対応していないとか、そもそもProviderが存在しないリソースを管理したい時、頼りにしていたのは local-exec Provisioner でした。Provisionerというのは、Terraform側が用意した脱出ハッチのような仕組みで、任意のスクリプトをTerraformコマンド経由で呼び出せる機能です1。ドキュメントにも a Last Resort(最終手段)と書いてある奥の手です。
通常は terraform apply
で呼ばれるスクリプトを定義できますが、 when=destory
と合わせると terraform destroy
に対応させることもできます。さらにがんばるなら null_resource
のtriggers
で実行スクリプトなどのハッシュ値を管理しておくことで、実行スクリプトに更新をトリガーにすることもできます(もちろん、実行スクリプトは冪等に作る必要があります)。書き出してみると複雑に見えますが、大部分は local-exec
で初期作成時に呼び出すスクリプトを作れば事足りることが多いため、こだわらず簡易的にリソースをTerraform管理下に置くときは、よく使われると思います。
resource "null_resource" "my_custom_resource" { |
私の観測上、よく見るやり方としては、local-exec
で一時的にしのぎ(AWSであればawscli
をラップしたシェルスクリプトを用意して)、Providerが新機能の追加されたタイミングで local-exec
から Providerが提供する機能に置き換えていくというものです。GUIや個別のスクリプトを用意する方法と違い、 terraform apply
で書く環境にリリースできるため、CI/CD定義もシンプルに、オペミスも減らせるということでした。
今回紹介するTerraCurlも、上記で説明した脱出ハッチ的な local-exec
の使い方と似たようなユースケースになります。ネイティブのProviderではサポートされていないけど、サービス側のAPIではサポートされている場合に利用します。Provider側ですでにリソース作成が提供されていればTerraCurlを使う必要はありません。
TerraCurlでAPI呼び出し
TerraCurlドキュメントのExcample を元に、Qiita APIを用いてダミーの記事を作成しています。Qiita記事をTerraform管理する対象したいユースケースは皆無だと思います。TerraCurlを使うという1点のみが理由です。
利用しているトークンはアクセストークンの発行ページから取得します。write_qiita
のスコープも必要です。
取得したQiitaトークンは環境変数にセットして参照できるようにしておきます。
export TF_VAR_qiita_token=xxxxxxxxxxxxxxx |
terraform { |
実行すると最後に output の内容が表示されます。
$ terraform apply |
限定公開で記事を作成したのでブラウザで確認します。URLのIDが出力された値と一致していることがわかります。
※URLまでキャプチャに載せていますが、テスト投稿した記事は削除済みです
Destoryする時どうするの?
Qiita APIの記事投稿に関して、IDは公開後に分かります(APIで指定すれば固定できるかも知れませんが)。そのため、以下のような output
で取得した値を、destory_url
に指定できると良いのですが、これは terraform apply
に決定する値ですので、循環参照となり指定できません。このあたりはどうするか一工夫が必要そうです。
resource "terracurl_request" "qiita_article" { |
TerraCurl所感
ドキュメントを見ると、相互TLS認証やリトライなど作り込みが良さそうな部分が見られ、フィットするのであれば非常に有用そうでした。
一方で、ことAWSに関しては、 awscli
が対応していない部分を探すのが難しく、awscli
がサポートしているなら若干の移植性は下がるものの、 local-exec
経由でawscli
を利用するほうが保守性が高まりそうだなと思いました。一方で、プラットフォーム側が意図的にサポートしない機能(ブログではVault Providerはあえて、クラスタのunsealコマンドをサポートしていないとある)の場合は、有用だなと思いました。
また、前章のDestoryにも書きましたが作成時のレスポンスに含まれる値を保持したいときの取り扱いは面倒そうと思います。Createだけの限定された条件とか、Destory時のURLやパラメータが apply する前に分かるのであれば便利そうだという印象です。
もし、上記に一致するような条件で、従来 local-exec
で実行していたけど、内部的には curl
コマンドだけだった場合には、 tf
ファイルで完結するので素晴らしいツールだと思います。スクリプトを別途用意しなくてよいのは開発、保守的にも嬉しいと思います。
まとめ
TerraCurlを使ってみました。ツールの命名が素晴らしくcurlで済ませられるようなリソースに関してはシンデレラフィットしそうなProviderです。
作成時のレスポンスの値を、Destory時などに使いまわしたい場合などは少し取り回しが難しそうなので、取り扱いに注意して導入したいと思います。
- 1.他にも
file
やremote-exec
のProvisionerがあります。過去にはChef、Habitat、Puppet、Salt Masterless のProvisionerがあったようですが、 Terraform v0.15.0で削除されたようです。 ↩