LoginSignup
14
10

Terraformにおけるmain.tfやtfstateファイルの作成および運用方法について

Last updated at Posted at 2023-01-08

概要

今回はTerraformを使って

  • main.tf
  • 変数を格納するvariables.tf

の作成と運用方法について解説したいと思います

前提

  • 東京リージョンを使用
  • AWSを使用
  • S3バケットとDynamoDBの作成方法について理解している

コンテナ経由でTerraformを使用すると複数ブロジェクトで使用する際にバージョンによる違いを意識せずに済みます
コンテナを使用したい方はこちらの記事も参考にしてみてください

ディレクトリ構成

構成は以下の通りです

├── main.tf
└── variables.tf
  • variables.tf
  • main.tf

の順に作成していきましょう

variables.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のバージョン制約

などを記載していきます

main.tf
# ------------------------------
# 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バケットを作成した後はバケット名を記載してください

バケットを作成する際は非公開にしましょう

スクリーンショット 2023-01-08 8.10.49.png

プロパティからバージョニングを有効にすると古いtfstateファイルを復旧できるので便利です
スクリーンショット 2023-01-08 8.12.23.png

DynamoDB

複数人が同時にterraformを実行しtfstateを更新してコンフリクトを起こすことを避けるため、
DynamoDBによって状態にロックをかけることができます
今回はテーブル名をterraform-playground-tf-state-lock
プライマリーキーをLockIDにします

スクリーンショット 2023-01-08 8.21.29.png

  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で作成したタグをつけると見やすくなります
スクリーンショット 2023-01-08 9.43.34.png

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使って複数人で開発する際に色々準備しないといけないので思ってたより覚えることが多くて大変でした
本記事をチートシートとして使っていただければと思います

参考

14
10
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
14
10