🐙
Terraform Moduleを使う
Moduleで得られる効果
- terraformの構成を整理出来る
- 再利用の容易さ
- ベストプラクティスの共有
試しに一つ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です。
参考
Discussion