【Terraform】Terraform ~ 複数環境へデプロイすることを考える ~

■ はじめに

通常、複数環境(dev/stage/prod)へ Terraform を使って
デプロイすることを考える
そこで、複数環境へデプロイする際に使えそうなTipsをまとめる

目次

【1】Backend の切り替え
 1)サンプル
 2)補足:terraform init -migrate-state
【2】variable の切り替え
 1)サンプル
【3】Module
【4】Workspace
 1)使用上の注意
【5】ディレクトリ構成
 1)Moduleを使う場合

【1】Backend の切り替え

* variable に関しての詳細は、以下の関連記事を参照のこと

Terraform ~ tfstate / Backend ~
https://dk521123.hatenablog.com/entry/2023/05/05/004939

* 以下は、サンプルとは違う方法

https://dev.classmethod.jp/articles/multiple-provisionings-with-terraform-backend-config-option/

1)サンプル

# -backend-config=【環境】.tfbackendで指定
terraform init -backend-config=dev.tfbackend -migrate-state

backend.tf

terraform {
  backend "s3" {}
}

dev.tfbackend

bucket  = "your-s3-dev-bucket"
key     = "tf/dev/terraform.tfstate"
region  = "us-west-2"
encrypt = true

2)補足:terraform init -migrate-state

* 一度backendの設定をした後に変更する場合は
 -reconfigureも指定する必要がある

https://techblog.nhn-techorus.com/archives/29535
https://dev.classmethod.jp/articles/multiple-provisionings-with-terraform-backend-config-option/

【2】variable の切り替え

* variable に関しての詳細は、以下の関連記事を参照のこと

Terraform ~ local / variable ~
https://dk521123.hatenablog.com/entry/2023/12/24/173633

1)サンプル

# 環境ごとにファイル名を変えて実行していく
terraform plan -var-file=dev.tfvars

variables.tf

variable "env" {
  type = string
}

# その他変数。。。

dev.tfvars

env = "dev"

# その他、値。。。

prod.tfvars

env = "prod"

# その他、値。。。

【3】Module

* 各環境の共通処理をModule化する(ただ、なくても実現できる)
* Module に関しての詳細は、以下の関連記事を参照のこと

Terraform ~ 基本編 / Module ~
https://dk521123.hatenablog.com/entry/2023/05/19/113544

* 以下、参考になりそうなサイト

https://dev.classmethod.jp/articles/multiple-provisioning-with-terraform-module/

【4】Workspace

* Workspace に関しての詳細は、以下の関連記事を参照のこと

Terraform ~ Workspace ~
https://dk521123.hatenablog.com/entry/2024/06/01/144048

* 以下、参考になりそうなサイト

https://blog.gruntwork.io/how-to-manage-multiple-environments-with-terraform-using-workspaces-98680d89a03e

1)使用上の注意

* 関連記事にも書いたが、
 環境を切り替えても、tfstate保存先のS3バケットは同一のものが使用される

【5】ディレクトリ構成

1)Moduleを使う場合

ディレクトリ構成例

-- <project-name>/
   -- environments/
      -- dev/
         -- backend.tf
         -- providers.tf
         -- versions.tf
         -- main.tf # ここから各moduleを呼ぶ
      -- stage/
         -- backend.tf
         -- providers.tf
         -- versions.tf
         -- main.tf # ここから各moduleを呼ぶ
      -- prod/
         -- backend.tf
         -- providers.tf
         -- versions.tf
         -- main.tf # ここから各moduleを呼ぶ
   -- modules/
      -- <module-name>/
         -- main.tf
         -- variables.tf
         -- outputs.tf
         -- README.md
      -- (other modules/)

参考文献

https://zenn.dev/smartround_dev/articles/5e20fa7223f0fd

関連記事

Terraform ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/05/000224
Terraform ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/09/222057
Terraform ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/05/03/000000
Terraform ~ 基本編 / Module ~
https://dk521123.hatenablog.com/entry/2023/05/19/113544
Terraform ~ local / variable ~
https://dk521123.hatenablog.com/entry/2023/12/24/173633
Terraform ~ tfstate / Backend ~
https://dk521123.hatenablog.com/entry/2023/05/05/004939
Terraform ~ Workspace ~
https://dk521123.hatenablog.com/entry/2024/06/01/144048
Terraform ~ AWS S3 ~
https://dk521123.hatenablog.com/entry/2023/04/09/104204
Terraform ~ AWS IAM ~
https://dk521123.hatenablog.com/entry/2023/04/12/214311
Terraform ~ AWS Glue ~
https://dk521123.hatenablog.com/entry/2023/04/08/220411
Terraform ~ AWS Secrets Manager ~
https://dk521123.hatenablog.com/entry/2023/04/11/152801
Terraform ~ Docker ~
https://dk521123.hatenablog.com/entry/2023/04/10/193239
Terraform ~ 特定リソースのみデプロイする ~
https://dk521123.hatenablog.com/entry/2023/04/20/172823