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
ファイルの変数定義も減らせてすっきりですね!