BioErrorLog Tech Blog

試行錯誤の記録

TerraformでAWSアカウントIDを取得する

Terraformで現在のAWSアカウントIDを取得する方法の備忘録です。

はじめに

Terraformを書いているとき、arnの指定等でAWSアカウントIDを取得&設定したくなることがあります。

今回はそのやり方の備忘録を残しつつ、ついでに関連部分のソースコードも読んでみます。

TerraformでAWSアカウントIDを取得する

やり方

aws_caller_identityのdata sourceを使って、AWSアカウントIDを取得できます。

data "aws_caller_identity" "current" {}

# data.aws_caller_identity.current.account_id
# でアカウントIDを取得できる

使用例としては、例えば↓のようにして、arn内にアカウントIDを埋め込みできます。

source_arn = "arn:aws:events:eu-west-1:${data.aws_caller_identity.current.account_id}:rule/RunDaily"

※ 参考: terraform-aws-lambda/examples/complete/main.tf at master · terraform-aws-modules/terraform-aws-lambda · GitHub

data.aws_caller_identity.current.account_idは毎回アクセスするには変数名が長いので、必要に応じてlocal変数に格納しておくのもおすすめです。

locals {
  account_id = data.aws_caller_identity.current.account_id
}

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

せっかくなので、今回取り上げているaws_caller_identityのdata sourceが書かれてそうな部分のソースコードを覗いてみます。

aws_caller_identityはAWS STSのAPIを経由してるはずなので、terraform-provider-awsでSTS関連が定義されている場所を探します。

ここ↓ですね。

github.com

その中でも一番それっぽいところを抜粋します。

func dataSourceCallerIdentityRead(d *schema.ResourceData, meta interface{}) error {
    client := meta.(*conns.AWSClient).STSConn

    log.Printf("[DEBUG] Reading Caller Identity")
    res, err := client.GetCallerIdentity(&sts.GetCallerIdentityInput{})

    if err != nil {
        return fmt.Errorf("getting Caller Identity: %w", err)
    }

    log.Printf("[DEBUG] Received Caller Identity: %s", res)

    d.SetId(aws.StringValue(res.Account))
    d.Set("account_id", res.Account)
    d.Set("arn", res.Arn)
    d.Set("user_id", res.UserId)

    return nil
}

terraform-provider-aws/internal/service/sts/caller_identity_data_source.go at 41352c290416c86708236db2e62757bfebdb193d · hashicorp/terraform-provider-aws · GitHub

AWS ClientのSTS接続からGetCallerIdentityを叩いて、そこからCallerのaccount_id, arn, user_idが取得されてます。

おわりに

以上、Terraformで現在のAWSアカウントIDを取得する方法をメモしました。

Terraformは(CloudFormationと違って)AWS APIに基づいているので、この類の実装も直感的に辿れるのが良いですね。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Terraform Registry

GitHub - terraform-aws-modules/terraform-aws-lambda: Terraform module, which takes care of a lot of AWS Lambda/serverless tasks (build dependencies, packages, updates, deployments) in countless combinations 🇺🇦