
なにも作らないTerraform moduleを紹介します
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ちょっと変わったTerraform moduleを見つけたのでご紹介します。terraform-aws-labelです。
概要
このモジュールは何もリソースをプロビジョニングしません。 モジュール利用者が使うのはモジュールのアウトプットです。
このモジュールは名前の通り、ラベル、あとタグを提供します。このモジュールの用途は一貫したリソース命名やタグ付与の実現です。
使ってみた
以下のようにモジュールを呼んでみます。
data "aws_caller_identity" "current" {}
module "labels" {
  source = "github.com/aws-ia/terraform-aws-label?ref=v0.0.5"
  account   = data.aws_caller_identity.current.account_id
  env       = "dev"
  name      = "sample"
  namespace = "cm"
}
モジュールのアウトプットを確認してみましょう。
% terraform console
> module.labels
{
  "account" = "012345678901"
  "env" = "dev"
  "id" = "cm-012345678901-dev-sample"
  "name" = "sample"
  "namespace" = "cm"
  "tags" = [
    {
      "key" = "account"
      "value" = "012345678901"
    },
    {
      "key" = "env"
      "value" = "dev"
    },
    {
      "key" = "name"
      "value" = "sample"
    },
    {
      "key" = "namespace"
      "value" = "cm"
    },
  ]
  "tags_aws" = {
    "account" = "012345678901"
    "env" = "dev"
    "name" = "sample"
    "namespace" = "cm"
  }
}
id(ラベル)
出力されたアウトプットのうち、idに注目です。モジュールに与えたattributesを素に、それっぽい文字列が出来上がっています。あとはこの値をリソース作成時の命名にて参照しましょう。
resource "aws_s3_bucket" "sample" {
  bucket = "${module.labels.id}-bucket"
}
resource "aws_security_group" "sample" {
  name = "${module.labels.id}-sg"
}
id値を変えてみる
デフォルトではid値は上記のように
"${namespace}-${account}-${env}-${name}"になります。これは変更可能です。id_order attributeを指定します。例えば弊社城岸がおすすめするAWSリソースの命名規則を使うのであればこんな感じですね。
data "aws_caller_identity" "current" {}
module "labels" {
  source = "github.com/aws-ia/terraform-aws-label?ref=v0.0.5"
  id_order = ["name", "env"]
  name     = "systema"
  env      = "dev"
}
resource "aws_s3_bucket" "sample" {
  bucket = "${module.labels.id}-alblog-${data.aws_caller_identity.current.account_id}"
}
resource "aws_security_group" "sample" {
  name = "${module.labels.id}-app-sg"
}
タグ
このモジュールをタグ付与に使いたい場合はアウトプットの tagsやtags_awsを使いましょう。
AWS provider
AWS Providerでプロビジョニングするリソースにタグを付与したい場合は、tags_awsを使います。
resource "aws_s3_bucket" "samole" {
  bucket = "${module.labels.id}-alblog-${data.aws_caller_identity.current.account_id}"
  tags   = module.labels.tags_aws
}
resource "aws_security_group" "samole" {
  name = "${module.labels.id}-app-sg"
  tags = module.labels.tags_aws
}
全リソースに付与する方針であればdefault tagsを使うのが良いでしょう。
provider "aws" {
  region = "ap-northeast-1"
  default_tags {
    tags = module.labels.tags_aws
  }
}
awscc provider
awscc providerはクラウドコントロールAPI用のproviderです。このproviderを使う場合はtagsを使います。
resource "awscc_s3_bucket" "sample" {
  bucket_name = "${module.labels.id}-awscc-${data.aws_caller_identity.current.account_id}"
  tags        = module.labels.tags
}
まとめ
Terraformのterraform-aws-label モジュールを紹介しました。一貫した命名、タグ付けをしたい場合は採用するのもありかと思います。






