Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

Terraformプロバイダー定義関数:AWSプロバイダーの関数

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プロバイダーの関数を利用することはほとんどないかもしれません。
しかし、プロバイダー定義関数はまだ実装されたばかりの機能です。
今後さらに便利になっていくことを期待したいと思います。