🏷

terraform の細かすぎて伝わらない小ネタ タグの命名規則と守り方

2024/11/01に公開1

tl;dr

  • クラウドリソースのタグの命名規則は大事
  • タグがついてないリソースは管理できていないのと大差ない
  • Terraform 等で IaC しているならしっかりタグ付けしよう
  • 詳しくはぐぐるか AI に聞こう
  • 主に AWS で使えるものとして書いている。Azure や Google Cloud その他では事情が異なるかもしれないことに注意する

タグの命名規則ガイドラインを作る

  • タグの命名規則ガイドラインというタイトルで ADR を書いておく
  • 一貫した命名規則と必須のタグをリストアップしておく
  • 定期的な見直しを実施するようガイドラインに含めておく

一貫した命名規則の例

  • タグキーは次のいずれかにする

    • アッパーキャメルケース
    • ローワーキャメルケース
    • アッパーケバブケース
    • ローワーケバブケース
    • アッパースネークケース
    • ローワースネークケース
    • 小文字のみ(区切りなし)
    • 大文字のみ(区切りなし)
  • 個人的には必須のキーは1単語のみとして小文字のみを勧める

  • 2単語以上が必要な場合はローワースネークケースを勧める

  • 理由はいくつかあるが、おおむね次のようなもの

    • タグキーを大文字や小文字に変換してくれてしまう SaaS サービスがある(ヤメテ)
    • すべて小文字に統一する、というルールさえわかっていれば迷いや混乱が少ない
    • 大文字やアンダーバーは通常 Shift キーと同時押しが必要で1ストロークずつ多く打たなければいけない
    • が、単純に Terraform のリソース命名規則がスネークケースなので、同じにしておく、というだけ
    • 同じコードを書いている中で、モノが違う(terraformとタグ)からといってわざわざ異なる命名規則を持ち込む必要はないので
    • プログラム言語のように const, func, variable で命名規則が違うほうがいい、というならそれで
  • タグ値はリソース毎の条件が異なる場合があるので注意する

  • タグ値の中身もタグキーと同じ規則にすること(コストエクスプローラー等を使用する人がイライラしないでいいようにするため)

必須のタグの例

  • 必須のタグは、コスト、セキュリティ、サービス(開発)、運用(自動化)等に分類してつける
  • cost はコストエクスプローラー等で支払い部署を特定する
  • role はアクセスコントロール用に使用する
  • brand は構築サービスのプロジェクトを特定する
  • 同様に servicesystem 等で補完する
  • environment は本番か否かの環境を分離するために使用する(アカウント等で分離ができているなら必要ない)
  • schedule は自動起動・停止などの運用に使用する
  • 運用向けのタグはリソースによって不要なものもあるので、ついていても無視するか、つけないように工夫する
  • repo は terraform のコードを置いているリポジトリを特定する
  • 同様に repo-pathworkspace などをつけてディレクトリを特定できるようにする

AWS では default_tags を活用する

  • ディレクトリ構造は例を以前書いた
  • 管理するリソース毎のまとまり(ここで出すのもアレだが)Azure で言えばリソースグループ単位にしておくのがよい
  • それらができていると、aws provider block に default_tags を書いて、対象のリソースに一度に適用できる
  • (ただし適用できないタグ値をもたせると面倒なことになるので使用リソース毎の制限に注意する)
provider "aws" {
  default_tags {
    tags = {
      cost  = "xxx"
      role  = "default"
      brand = "awesome service"
    }
  }
}
  • 先に書いたとおり、場合によっては全リソースにつけたいものとそうではないものがある
  • また、同じワーキングディレクトリでも異なる値が必要な場合もある
  • その場合は、default_tags のタグ値を FIXME などとして、上書きを促すようにできる
provider "aws" {
  default_tags {
    tags = {
      cost  = "FIXME" # 管理部署が違うリソースが混ざった
      role  = "default"
      brand = "awesome service"
      repo  = "awesome-repo-name" # 使用する文字がタグ付け制限にひっかからないように注意
    }
  }
}

locals = {
  tags = {
    cost     = "xxx",
    service  = "web",
    env      = "production"
  }
}

resource aws_xxx "sample" {
  // omit
  tags = local.tags
}

// merge() を使用して同じキーの値を上書き
resource aws_yyy "other_sample" {
  // omit
  tags = merge(local.tags, {
    cost     = "yyy",
    service  = "internal",
  })
}

命名規則や必須タグの守り方

  • default_tags のタグ値を FIXME にしておいて、各リソースが適切にタグ付けを行うように促すことができる
  • 必須でないタグは値を入れないようにすることで(タグキーだけにすることで)区別ができる
  • 汎用的にするならこんな感じにして、locals_required.tf のようにして各ディレクトリに配置すると楽できる
locals = {
  required_tags {
    // ここを充実させて ADR に記載しておくと楽、ということ
    cost  = "FIXME"
    role  = "FIXMEt"
    brand = "awesome service"
    repo  = "awesome-repo-name"
  }
}
  • tags = のような検索で tags = merge(local.required_tags, { のようになってなけいなければ、何かしら問題がある、と判断できる

雑なまとめ

  • タグは初期からちゃんとつける
  • 一貫した命名規則と適用ルールを大事にする
  • ADR を書いておく
  • 定期的な見直しを実施(AWSならタグエディターで必須タグがついていないものを検索すると楽)
terraform-jp

Discussion

rakiraki

書きそびれたんだけど、こんなタグつけてるぜ、とか教えてもらえるとうれしい