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"
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関連が定義されている場所を探します。
ここ↓ですね。
その中でも一番それっぽいところを抜粋します。
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 }
AWS ClientのSTS接続からGetCallerIdentityを叩いて、そこからCallerのaccount_id
, arn
, user_id
が取得されてます。
おわりに
以上、Terraformで現在のAWSアカウントIDを取得する方法をメモしました。
Terraformは(CloudFormationと違って)AWS APIに基づいているので、この類の実装も直感的に辿れるのが良いですね。
[関連記事]