terraformに対応していないクラウドリソースを local-exec
を用いてterraform化してみます。
今回はBigQueryのユーザー定義関数(UDF)でやってみます。
実装
さて早速。
|
|
解説
#1
執筆時点では google
provderはBigQueryのUDFに対応していないため、 null_resource
として定義します。
https://www.terraform.io/docs/provisioners/null_resource.html
#2
リソースの本体です。この部分が変更されるとresource updateとして扱われます。 https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource#argument-reference
#3
リソースのcreate時の挙動をlocal-exec
provisionerとして定義します。
https://www.terraform.io/docs/provisioners/local-exec.html
#4
実際に実行するコマンドを定義します。
今回の例では command
にSQL自身を、interpreter
にはSQLを実行するための bq
コマンドを記述します。
https://www.terraform.io/docs/provisioners/local-exec.html#argument-reference
#5
コマンドの失敗時の挙動 (terraformコマンド自体を失敗させるかどうか) を設定します。 https://www.terraform.io/docs/provisioners/index.html#failure-behavior
#6
when = destroyを宣言するとリソース削除時に実行するコマンドを定義できます。 https://www.terraform.io/docs/provisioners/index.html#destroy-time-provisioners
#7
terraformとは関係ありませんが、リソース削除時はDDLから関数名を正規表現で抽出してDROPするようにしてみました。
複数のUDFを管理する場合はprovisioner
の定義が冗長になるので、query
をvariableに定義してfor_each
を使う実装になるかと思います。
CI/CDパイプライン等のterraformコマンドの実行環境にbq
コマンドを用意しなければならないデメリットがあるため、リソースをterraform管理にするメリットがそのコストを上回ると判断される場合には有用かと思います。