なにも作らないTerraform moduleを紹介します

2022.11.07

ちょっと変わった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"
}

タグ

このモジュールをタグ付与に使いたい場合はアウトプットの tagstags_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 モジュールを紹介しました。一貫した命名、タグ付けをしたい場合は採用するのもありかと思います。