TerraformのAWSプロバイダーのドキュメントを見ると、左のメニューにFunctionsという項目が増えています。
今回は、この関数について紹介します。
Terraform1.8新機能:プロバイダー定義関数
2024年4月にリリースされたTerraform 1.8には、新機能であるプロバイダー定義関数が含まれていました。
以前から、Terraformには多くの組み込み関数が存在し、Terraformテンプレート内のあらゆる場所で呼び出すことが可能です。
この関数には、文字列の置き換えや切り抜き等の基本的な文字列操作はもちろん、ハッシュ値の算出やファイルの読み込みも用意されています。
これらは、Terraformテンプレートを書く上で非常に強力なツールの1つです。
ただし、Terraformで利用できる関数は種類も多く強力ですが、これまで利用できる関数は組み込み関数のみでした。
Terraform 1.8で追加されたプロバイダー定義関数は、プロバイダーによって関数を追加できるようにするものです。
プロバイダーはTerraformのプラグイン機能のようなもので、Terraformテンプレートのresourceやdataソースはすべてプロバイダーとして定義/実装されています。
これにより、Terraformはあらゆるクラウドサービス等に対応しています。
ここに関数の定義ができるようになったことで、クラウドサービス固有の関数が定義できるようになりました。
プロバイダー定義関数の利用
プロバイダー定義関数を利用するためには、required_providers
で対象プロバイダーを定義しておく必要があります。
(resource等はrequired_providers
に無くても動作しますが、関数の場合は必須なので注意が必要です)
terraform { required_version = ">= 1.8" required_providers { aws = { source = "hashicorp/aws" version = ">= 5.44" } } }
上記の例では、プロバイダー定義関数を利用できるTerraformやプロバイダーのバージョンも指定しています。
実際に関数を呼び出すときはprovider::<プロバイダー名>::<関数名>(引数)
という書式です。
たとえば、awsプロバイダーのarn_build関数を呼び出す場合は以下のようになります。
my_bucket_arn = provider::aws::arn_build("aws","s3","","","my-bucket")
awsプロバイダーの関数
awsプロバイダーでは、さっそく3つの関数が定義されています。
以下の関数はawsプロバイダー5.54.1で確認しています。
arn_build
arn_build関数はARNを構築する関数です。
terraform console
で確認すると以下のような動作になります。
> provider::aws::arn_build("aws", "iam", "", "444455556666", "role/my-example") "arn:aws:iam::444455556666:role/my-example"
Terraformのstringはテンプレートもありますし、そちらで定義した方がスッキリする気もします。
利用するシーンが思い浮かびませんでした。
arn_parse
arn_parse関数はARNをパーツに分解する関数です。
terraform console
で確認すると以下のような動作になります。
> provider::aws::arn_parse("arn:aws:iam::444455556666:role/my-example") { "account_id" = "444455556666" "partition" = "aws" "region" = "" "resource" = "role/my-example" "service" = "iam" }
ARNからリソース名を取得したい場合等は、split関数等を利用するよりコードが読みやすくなるかもしれません。
> provider::aws::arn_parse("arn:aws:iam::444455556666:role/my-example")["resource"] "role/my-example" > split(":", "arn:aws:iam::444455556666:role/my-example")[5] "role/my-example"
リソース名がARNの何番目か数えなくてよくなりました。
trim_iam_role_path
trim_iam_role_path関数はIAMロールのARNからパスプレフィックスを削除する関数です。
terraform console
で確認すると以下のような動作になります。
> provider::aws::trim_iam_role_path("arn:aws:iam::444455556666:role/my/rolepath/my-example") "arn:aws:iam::444455556666:role/my-example"
my/rolepath
というパス名が省略され、パスのないロール名だけとなったARNが結果として返されています。
ちなみに、IAMユーザのARNを指定するとエラーになります。IAMロール専用の関数です。
パスなしのロールARNを渡す必要がある場合に利用できます。
EKS等で必要となる場面があるようです。
最後に
今あるawsプロバイダーの関数を利用することはほとんどないかもしれません。
しかし、プロバイダー定義関数はまだ実装されたばかりの機能です。
今後さらに便利になっていくことを期待したいと思います。