Terraformで自身のAWSアカウント番号を取得するにはaws_caller_identityを使うと良い

Terraformで自身のAWSアカウント番号を取得するにはaws_caller_identityを使うと良い
目次

今回は Terraform の小ネタです。AWSアカウント番号を .tfvars ファイルに記載しない方法を紹介します。

.tfvars に記載しがちな情報

ってありますよね。 例えば、AWSアカウント番号がそうです。 Terraform Module を使って、それなりのサイズ感のシステムコンポーネント定義を書いていくと、モジュール毎の variables.tf ファイルに

1variable "account_id" {
2}

と定義した後、 .tfvars ファイルに

1account_id = "XXXXXXXXXXX"

という記載が増えて冗長に感じます。

定義された account_id という変数は、例えば、ポリシードキュメントの作成や、ARN指定、ECRリポジトリのドメイン名などに埋め込むことがあります。

こんな感じだったり、

 1data "aws_iam_policy_document" "xxxxx" {
 2    statement {
 3        effect = "Allow"
 4
 5        actions = [
 6            "s3:PutObject",
 7        ]
 8
 9        resources = [
10            "arn:aws:s3:::xxxxx/*"
11        ]
12
13        principals = {
14            type = "AWS"
15            identifiers = [
16                "${var.account_id}"
17            ]
18        }
19    }
20}

こんな感じで使ったりしていました。

1${var.account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxxxxxx:${var.image_tag},

aws_caller_identity を使う

最近知ったのですが、 aws_caller_identity のData Sourceを使うことで記述をすっきりさせることができることがわかりました。

aws_caller_identity は読んで字のごとく、 Terraform コマンドを実行している側の情報を取得できるのです。

以下のように data 定義をします。

1data "aws_caller_identity" "current" {}

aws_caller_identity から account_id の属性値が参照できるので、以下のようにアクセスできます。

1principals = {
2  type = "AWS"
3  identifiers = [
4    "${data.aws_caller_identity.current.account_id}"
5  ]
6}

こうすることで、 .tfvars ファイルの変数定義も減らせてすっきりですね!

参考にさせていただいたサイト