この記事は公開されてから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 モジュールを紹介しました。一貫した命名、タグ付けをしたい場合は採用するのもありかと思います。