概要
業務でTerraformを組む機会があったため、
今回使いやすかったルール、次回terraformを組む際に適用したいルール
を備忘として記載する
ディレクトリ構成
- 環境差分パラメータはすべてenv配下のvariables.tfで定義する
- 環境固有のリソースはenv配下に定義する(例:ec2_fumidai.tf)
- 各環境共通となるリソースはmodules配下に定義する
- 使い回すリソースはterraform registry(すでに検証済みのモジュール)をコピペしてmodules配下に定義する
terraform/
├── docs/
│ ├── naming.md
│ └── doc.md
├── env/
│ ├── dev/
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ ├── variables.tf
│ │ ├── ec2_fumidai.tf //dev環境でのみ使用するリソース
│ │ └── README.md
│ └── stg/
│ ├── main.tf
│ ├── providers.tf
│ ├── variables.tf
│ └── README.md
├── modules/
│ ├── main/
│ │ ├── network.tf
│ │ ├── elb.tf
│ │ ├── acm.tf
│ │ ├── ssm.tf
│ │ ├── route53.tf
│ │ ├── ecs.tf
│ │ ├── ecr.tf
│ │ ├── rds.tf
│ │ ├── s3.tf
│ │ ├── variables.tf
│ │ ├── outputs.tf
│ │ └── README.md
│ └── moduleA/
│ ├── main.tf
│ ├── variables.tf
│ ├── outputs.tf
│ └── README.md
├── .gitignore
└── README.md
命名規則
//各パーツの定義
resource "リソースタイプ" "ローカル名" {
name = リソース名
tags = {
Name = リソース名
}
}
- 全体ルール
- 小文字を使用する
- セパレータにアンダースコア(_)を使用する
- AWSリソース名(nameやnameTag)はセパレータに(-)を使用する
- ローカル名
- モジュール内で単一となるリソースは「main」で統一する
- モジュール内に複数作成されるリソースは、直感的に意味のわかる名称とする
- リソースタイプを繰り返さない
- プロジェクト名、サービス名を使用しない
- リソース名
- prefixを使用する
- prefix-リソースタイプ形式で定義する
sample.tf
locals {
prefix = "${var.project}-${var.environment}"
}
resource "aws_route53_zone" "main" {
name = "${local.prefix}-route53"
}
resource "aws_subnet" "private_1a" {
tags = {
Name = "${local.prefix}-subnet-private-1a"
}
}
デフォルトタグ
リソースごとに定義するとtag付けが漏れるため、
デフォルトタグを指定する
provider "aws" {
region = "ap-northeast-1"
default_tags {
tags = {
env = "dev"
project = "sample_project"
}
}
}
variablesは型チェックし、使用するリソースごとにまとめる
変数は各所に散らばりやすいため、variables.tfで一元管理し、かつ使用する用途ごとにまとめて管理する
variable "ecs" {
type = list(
object({
name = string
cpu = number
memory = number
})
)
}
参考ページ