Terraform State の管理

2024.04.20
このエントリーをはてなブックマークに追加

Terraform でインフラを管理する際に、Terraform State の管理方法についてまとめる。

Terraform State とは

Terraform は、インフラの状態を管理するために、Terraform State というファイルを利用する。このファイルには、Terraform が管理しているリソースの情報が保存されており、Terraform がリソースの状態を管理するために利用される。

Terraform State の管理方法

Terraform State の管理方法には、ローカルに保存する方法とリモートに保存する方法がある。

ローカルに保存する方法

Terraform State をローカルに保存する方法は、Terraform が自動的に作成する terraform.tfstate ファイルを利用する。

リモートに保存する方法

Terraform State をリモートに保存する方法は、Azure Blob Storage や AWS S3 などのリモートストレージを利用する。

リモートに保存する方法は、以下の手順で行う。

  1. リモートストレージを作成する
  2. Terraform がリモートストレージを利用するように設定する

実例

Azureの場合

azure-cli を利用して、Azure Blob Storage を作成する。

## リソースグループを作成
az group create \
  --name $リソース名 \
  --location japaneast

## ストレージアカウントを作成
az storage account create \
  --resource-group $リソース名 \
  --name $ストレージアカウント名 \
  --sku Standard_LRS \
  --encryption-services blob

## コンテナーを作成
az storage container create \
  --name $コンテナ名 \
  --account-name $ストレージアカウント名

Terraform State をリモートストレージに保存するために、main.tf ファイルに以下の設定を追加する。

terraform {
  backend "azurerm" {
    resource_group_name   = "$リソース名"
    storage_account_name  = "$ストレージアカウント名"
    container_name        = "$コンテナ名"
    key                   = "$任意のファイルパス/terraform.tfstate"
  }
}

AWSの場合

AWS CLI を利用して、AWS S3 バケットを作成する。

## バケットを作成
aws s3api create-bucket \
  --bucket $バケット名 \
  --region $リージョン

state lockを有効にするためDynamoDBテーブルを作成する。

aws dynamodb create-table \
  --table-name $テーブル名 \
  --attribute-definitions AttributeName=LockID,AttributeType=S \
  --key-schema AttributeName=LockID,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

Terraform State をリモートストレージに保存するために、main.tf ファイルに以下の設定を追加する。

terraform {
  backend "s3" {
    bucket  = "$バケット名"
    key     = "terraform.tfstate"
    region  = "$リージョン"
    encrypt = true
    dynamodb_table = "$テーブル名"
  }
}

参考