AWSでインフラを構築するとAWSのリソースがたくさんできるので、どのリソースがどの環境・プロジェクトのリソースなのかがひと目ではわからなくなる。
例えばsubnetはどのVPCに紐づくか、どのルートテーブルを紐づけているかなどはIDを丁寧にたどっていけば確認できるが面倒。

AWSでは各リソースに対して自由にタグをつけられるので、一定のルールに従ってタグを付けておけばひと目で確認できるようになる。
例えばタグとして以下の様なタグを付ければ便利。

  • Environmentタグ: “production"や”staging”や”dev”などの環境名をつける
  • “Project"タグ: プロジェクト名をつける

しかしそれぞれのリソースに1つ1つタグ付けをしていては面倒かつ間違いの元となるので、1度の定義で同一タグを付けたい。
本記事ではTerraformのプロジェクトで作成するすべてのリソースに共通のタグを付けるためのdefault_tagsブロックについて書く。

default_tagsとは

default_tagsはTerraformの設定で使用できるリソースタグのデフォルト値を設定するための機能。
AWSプロバイダーに設定すると、そのプロバイダーで作成されるすべてのリソースに指定したタグをつけられる。

AWSのリソースのタグを見ればそれがどのTerraformプロジェクトで作成されたのか、どの環境のリソースなのかが判別できるようになる。

Configure Default Tags for AWS Resources | Terraform | HashiCorp Developer

default_tagsの設定方法

default_tagsはTerraformのproviderブロック内に指定する。以下の例では、AWSプロバイダーに対してdefault_tagsを設定している。

provider "aws" {
  region = "ap-northeast-1"
  default_tags {
    tags = {
      Environment = "production"
      Project     = "my-project"
    }
  }
}

上記の例ではAWSプロバイダーに対してEnvironmentタグにproductionを、Projectタグにmy-projectを指定している。
default_tagsを設定すると、このAWSプロバイダーで作成されるすべてのリソースに自動的にこのタグが付与される。

タグの上書き

それぞれのリソースでdefault_tagsを使って指定したタグ名と同じタグ名のタグを作成すればそちらのほうが優先される。

resource "aws_s3_bucket" "storage" {
  bucket = "some-bucket-name"
  tags = {
    Environment = "common"
  }
}

上記のコード例ではこのS3バケットのEnvironmentタグにはcommonという値を設定し、それ以外のタグはプロバイダーに設定されたdefault_tagsのタグが設定される。