🐙

Terraform Moduleを使う

2023/05/19に公開

Moduleで得られる効果

  • terraformの構成を整理出来る
  • 再利用の容易さ
  • ベストプラクティスの共有

https://developer.hashicorp.com/terraform/tutorials/modules/module?in=terraform%2Fmodules

試しに一つs3を作成する

ディレクトリ構成

.
├── main.tf
├── modules
│   └── s3_bucket
│       ├── main.tf
│       └── variable.tf
└── terraform.tfstate # 実行後に生成

modules/s3_bucket/main.tf

modules/s3_bucket/main.tf
resource "aws_s3_bucket" "example" {
  bucket = var.bucket_name

  tags = {
    Name = "Example Bucket"
  }
}

modules/s3_bucket/variable.tf

modules/s3_bucket/variable.tf
variable "bucket_name" {
  description = "The name of the S3 bucket"
  type        = string
}

main.tf

main.tf
provider "aws" {
  region = "ap-northeast-1"
}

module "example_bucket" {
  source      = "./modules/s3_bucket"
  bucket_name = "example-bucket-20230519"
}

moduleでパスの先のモジュールを呼んでいます。

2つs3を作成する

なんとmoduleを増やすだけ!簡単!

main.tf
provider "aws" {
  region = "ap-northeast-1"
}

module "example_bucket" {
  source      = "./modules/s3_bucket"
  bucket_name = "example-bucket-20230519"
}

module "example_bucket2" {
  source      = "./modules/s3_bucket"
  bucket_name = "example-bucket-20230519-2"
}

Dev、Prod環境で分割する

参考のDevelopersIOさんの記事がわかりやすかったため、参考にします。

ディレクトリ構成

.
├── environments
│   ├── dev
│   │   └── main.tf
│   └── prod
│       └── main.tf
└── modules
    └── s3_bucket
        ├── main.tf
        └── variable.tf

モジュール

modules/s3_bucket/main.tf
resource "aws_s3_bucket" "example" {
  bucket = "${var.bucket_name}-${var.environment}"

  tags = {
    Name        = "${var.bucket_name}-${var.environment}"
    Environment = var.environment
  }
}
modules/s3_bucket/variable.tf
variable "bucket_name" {
  type        = string
}

variable "environment" {
  type        = string
  default     = "dev"
}

環境別

共通で使用するモジュールを用意したら、環境別にバケット名、環境を渡すtfファイルを用意する

provider "aws" {
  region = "ap-northeast-1"
}

module "prod_bucket" {
  source      = "../../modules/s3_bucket"
  bucket_name = "example-bucket-20230519"
  environment = "dev"
}

Prod

environments/prod/main.tf
provider "aws" {
  region = "ap-northeast-1"
}

module "dev_bucket" {
  source      = "../../modules/s3_bucket"
  bucket_name = "example-bucket-20230519"
  environment = "prod"
}

立ち上げるときには、
環境ごとのmain.tfのあるディレクトリでterraform init、terraform applyでOKです。
実行後2つ異なるS3バケットができればOKです。

参考

https://cloud.google.com/docs/terraform/best-practices-for-terraform?hl=ja#module-structure
https://dev.classmethod.jp/articles/terraform-bset-practice-jp/
https://zenn.dev/sasakiki/articles/f4b2692f2331fd

Discussion