概要
今回はTerraformを使って
- main.tf
- 変数を格納するvariables.tf
の作成と運用方法について解説したいと思います
前提
- 東京リージョンを使用
- AWSを使用
- S3バケットとDynamoDBの作成方法について理解している
コンテナ経由でTerraformを使用すると複数ブロジェクトで使用する際にバージョンによる違いを意識せずに済みます
コンテナを使用したい方はこちらの記事も参考にしてみてください
ディレクトリ構成
構成は以下の通りです
├── main.tf
└── variables.tf
- variables.tf
- main.tf
の順に作成していきましょう
variables.tf
variables.tfに共通で使用する変数を記載していきます
# ------------------------------
# Variables
# ------------------------------
# プリフィックスを設定
variable "prefix" {
default = "tf-pg"
}
# プロジェクトを識別する一意の識別子を設定
variable "project" {
default = "terraform-playground"
}
# プロジェクトのオーナーを設定
variable "owner" {
default = "shun198"
}
main.tf
main.tfでは
- tfstateファイルの管理方法
- 使用するプロバイダ(今回はAWS)およびそのプロバイダのバージョン制約
- Terraformのバージョン制約
などを記載していきます
# ------------------------------
# Terraform configuration
# ------------------------------
terraform {
# tfstateファイルを管理するようbackend(s3)を設定
backend "s3" {
bucket = "terraform-playground-for-cicd"
key = "terrafrom-playground.tfstate"
region = "ap-northeast-1"
encrypt = true
dynamodb_table = "terraform-playground-tf-state-lock"
}
# プロバイダを設定
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
# Terraformのバージョン制約
required_version = ">= 1.2.0"
}
# ------------------------------
# Provider
# ------------------------------
# プロバイダ(AWS)を指定
provider "aws" {
region = "ap-northeast-1"
}
# ------------------------------
# Locals
# ------------------------------
locals {
# variables.tfから変数を取得
# terraformのworkspaceの一覧から該当するworkspace(dev,stg,prdなど)を取得
prefix = "${var.prefix}-${terraform.workspace}"
common_tags = {
Environmnet = terraform.workspace
Project = var.project
Owner = var.owner
ManagedBy = "Terraform"
}
}
# ------------------------------
# Current AWS Region(ap-northeast-1)
# ------------------------------
# 現在のAWS Regionの取得方法
data "aws_region" "current" {}
tfstateファイルの管理について
Terraformを使用する際はtfstateファイルを通じてインフラに関する情報を管理します
複数人で開発することが想定されるので
- S3バケット
- DynamoDB
を使ってチームで同じtfstateファイルを共有しながら開発するのが一般的です
S3バケット
今回はS3バケット内でtfstateファイルを管理します
私はバケット名をterraform-playground-for-cicd
にしました
バケット名は一意でなくてはならないのでこの名前以外のS3バケットを作成した後はバケット名を記載してください
バケットを作成する際は非公開にしましょう
プロパティからバージョニングを有効にすると古いtfstateファイルを復旧できるので便利です
DynamoDB
複数人が同時にterraformを実行しtfstateを更新してコンフリクトを起こすことを避けるため、
DynamoDBによって状態にロックをかけることができます
今回はテーブル名をterraform-playground-tf-state-lock
、
プライマリーキーをLockID
にします
backend "s3" {
bucket = "terraform-playground-for-cicd"
key = "terrafrom-playground.tfstate"
region = "ap-northeast-1"
encrypt = true
dynamodb_table = "terraform-playground-tf-state-lock"
}
locals
variables同様、変数の設定を行うことができます
localsはvariablesと違って下記のように複数の変数を組み合わせて使ったりすることができます
今回は全サービスで共通で使用できるタグを作成します
locals {
# variables.tfから変数を取得
# terraformのworkspaceの一覧から該当するworkspace(dev,stg,prdなど)を取得
prefix = "${var.prefix}-${terraform.workspace}"
common_tags = {
Environmnet = terraform.workspace
Project = var.project
Owner = var.owner
ManagedBy = "Terraform"
}
}
Nameに関しては私がパブリックサブネットに独自に追記したタグですがこのようにlocalsで作成したタグをつけると見やすくなります
workspace
Terraformでは同一AWSアカウント上で複数以上の環境を管理する際にworkspaceを使用します
今回はdev環境のworkspaceを作成します
terraform workspace new dev
でdevのworkspaceを作成します
workspaceが作成され、devに切り替わったことを確認します
terraform workspace list
default
* dev
現在のAWS Regionの取得方法について
公式ドキュメントに記載の通り
data "aws_region" "current" {}
と記載することで現在のAWS Regionである東京リージョンを取得できます
AZの設定等でハードコーディングしなくて済むので便利です
providerで指定してるregionについて
provider "aws" {
region = "ap-northeast-1"
}
regionをdata.aws_region.current
にすればいいじゃん!って思うかもしれませんが
Cycleエラー(双方向参照エラー)になってしまうため、ここは残念ながら
region = "ap-northeast-1"
とハードコーディングする必要があります
初期化
以上の設定を終えたら下記のコマンドを実行しましょう
terraform init
まとめ
Terraform使って複数人で開発する際に色々準備しないといけないので思ってたより覚えることが多くて大変でした
本記事をチートシートとして使っていただければと思います
参考