BioErrorLog Tech Blog

試行錯誤の記録

TerraformでAWSリージョンを取得する

TerraformでAWSリージョンを取得する方法の備忘録です。

はじめに

TerraformでAWSリソースを書いていると、ARNの指定などでアカウントidやリージョン名を取得したくなるときがあります。

以前、TerraformでAWSアカウントidを取得する方法を書きましたが、リージョンを取得する方法はいつも都度ググっていたので、備忘録を残します。

TerraformでAWSリージョンを取得する

やり方

aws_regionのdata sourceを使って、AWSリージョン名を取得できます。

data "aws_region" "current" {}

このようにdata sourceを定義したら、

data.aws_region.current.name

の形式でリージョン名を取得できます。

# 使用例
source_arn = "arn:aws:events:${data.aws_region.current.name}:123456789012:rule/RunDaily"


必要に応じてリージョン名をlocal変数に格納しておくのも、可読性と変更容易性が上がるのでおすすめです。

locals {
  region = data.aws_region.current.name
}

おまけ: Terraformソースコードを読む

せっかくなので、このaws_region data sourceの実装をソースコードから読んでみます。

まず場所としては、下記のコードがaws_region data sourceを実装してそうです。

github.com

この中のRead関数で、aws_region data sourceの実態が実装されています。

プロバイダの現在のリージョンを取得する部分のコードを抜粋します。

   // Default to provider current region if no other filters matched
    if region == nil {
        matchingRegion, err := FindRegionByName(d.Meta().Region)

        if err != nil {
            response.Diagnostics.AddError("finding Region by name", err.Error())

            return
        }

        region = matchingRegion
    }

aws_region data sourceの引数に何も指定がない場合、メタデータからproviderの現在のリージョンが取得されているのがわかります。

おわりに

以上、TerraformでAWSリージョンを取得する方法の備忘録をまとめて、ついでにソースコードを読んでみました。

どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Terraform Registry

terraform-provider-aws/internal/service/meta at be9d5ac322736b8c599459a755cb3d63be051e6c · hashicorp/terraform-provider-aws · GitHub

terraform-provider-aws/internal/service/meta/region_data_source.go at be9d5ac322736b8c599459a755cb3d63be051e6c · hashicorp/terraform-provider-aws · GitHub

terraform-provider-aws/internal/service/meta/region_data_source_test.go at be9d5ac322736b8c599459a755cb3d63be051e6c · hashicorp/terraform-provider-aws · GitHub

Retrieve instance metadata - Amazon Elastic Compute Cloud