1
1
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Terraformで開発環境 / 本番環境を分けてリソースを管理したい

Last updated at Posted at 2024-07-16

要約

最終的なソースコード全体は以下のリンクからご確認いただけます。

関連記事

Terraformの開発環境を整理したのを備忘録も兼ねて複数の記事にしています。この記事はそのうちの1本目として、「Terraformで開発環境と本番環境を分けて実行する」ことについてまとめます。

背景

普段アプリなどの開発をしていると、開発環境 / ステージング環境 / 本番環境などのように複数の環境を用意して開発を進めるということが多いかと思います。Terraformを用いてクラウドを利用した開発を行うときも、例えばインフラ構成を変えたいような時に、一度開発環境でterraform applyを実施してみて問題ないことを確認してから、本番環境でも適用したいなんてときがあります。

そこで、このような環境を分けてTerraformを実行する方法についてこの記事にまとめたいと思います。また、環境ごとにリソースの名前を変えたりといったこともしてみたいと思います。

実装

今回Terraformで管理する内容は、シンプルにAWSのVPCを1つ作るというものにしたいと思います。それを開発環境(dev)と本番環境(prod)のそれぞれで作っていきます。

環境を分ける方法としては公式のドキュメントにも以下のようなディレクトリ構成が紹介されています。./environmentsの下に環境ごと固有のファイルを配置し、共通するファイルは./modulesの下に配置するといった構成です。

ディレクトリ構成
.
├── .gitignore
├── environments
│   ├── dev
│   │   ├── .terraform.lock.hcl
│   │   ├── main.tf
│   │   └── terraform.tfstate
│   └── prod
│       ├── .terraform.lock.hcl
│       ├── main.tf
│       └── terraform.tfstate
└── modules
    ├── main.tf
    ├── variables.tf
    └── vpc.tf

共通するリソースの定義

まずは共通する部分を見ておきます。

./modules/vpc.tfでVPCの設定を記述しています。VPCのNameタグは{環境}-test_vpcというフォーマットにしており、環境ごとに名前の異なるVPCが作成されることを期待しています。たとえば開発環境ならdevelop-test_vpcという名前がついて欲しいです。

この環境の情報は/modules/variables.tfの中で宣言している変数envに入っています。変数の値は環境ごとに変わるものなので、後述の通り環境ごとに渡します。

/modules/main.tf
terraform {
  required_version = ">=1.7"

  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}
/modules/vpc.tf
resource "aws_vpc" "test_vpc" {
  cidr_block = "10.1.0.0/16"

  tags = {
    Name = "${var.env}-test_vpc"
  }
}
/modules/variables.tf
variable "env" {
  type = string
}

各環境固有のファイルを作成する

以上のような共通部分ができたら、今度は環境ごとのファイルを以下のように作成します。先述の通り、環境ごとのファイルは/environmentsの下の環境名のフォルダにそれぞれ用意します。例えば開発環境なら/environments/devの下に、本番環境なら/environments/prodの下にファイルを置きます。

開発環境のエントリーポイントとなるファイルは次のようにしました。modules "app"のブロックで先ほどの共通部分のパスを設定して、変数env"develop"という値を設定しています。

./environments/dev/main.tf
module "app" {
  source = "../../modules"
  env = "develop"
}

本番環境についても同様に./environments/prod以下にmain.tfを作ります。今回、開発環境と本番環境で違うのはenv変数の内容だけですので、/environments/dev/main.tfとの差分もそこだけになります。

./environments/prod/main.tf
module "app" {
  source = "../../modules"
- env = "develop"
+ env = "prod"
}

terraform applyの実行

terraform applyのコマンドを実行するときは、各環境のフォルダに移動してからこれを実行します。例えば開発環境ならcd ./environments/dev && terraform applyのような形です。また、terraform initも各フォルダでそれぞれ実行する必要があります

そうすれば、それぞれの環境でのコンフリクトなどがなく、以下のようにVPCを2つ作成できたかと思います。

terraform_env_separate-1.png

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1