AWS/Terraform

【Terraform】tfstateファイルをAWSのS3・DynamoDBで管理する

今回は、Terraformのtfstateファイル(以下stateファイル)をAWSのS3・DynamoDBで管理する方法をご紹介します。

stateファイルをAWSで管理するメリット

stateファイルをAWSのS3・DynamoDBで管理するメリットは大きく2点あります。

  1. S3バケットでstateファイルを共用管理することで、複数の作業者間でstateファイルの整合性を確保する。
  2. DynamoDBの項目を利用した排他制御(state lock)によって、IaCの競合・デプロイエラーを回避する。

stateファイル・その排他制御については、以下の記事で詳しく解説しています。

Terraformのstate lock(ロック)を詳しく解説してみた今回は、AWSでS3をバックエンドに設定したTerraformのstate lockについて詳しく解説していきます。 state lo...

前提

stateファイルをS3バケット・DynamoDBでバックエンドに設定するための前提は以下です。

  • AWSアカウントを作成済み。
  • Terraformの実行環境にTerraform・Git・AWS CLIがインストール済み(AWSのアクセスキーが設定済み)。

stateファイルをAWSで管理する手順

TerraformのstateファイルをAWSのS3バケット・DynamonDBで管理する設定手順をご説明していきます。
※今回は、作業環境に設定しているAWSのアクセスキーと同じ環境にバックエンドリソースを構築します。

S3バケットの作成

AWSマネジメントコンソールでの作業です。

  • S3の画面に移動して、「バケットを作成」をクリックする。
  • 任意のバケット名を入力する。
  • バケットのバージョニング」を有効化する。※stateファイルを世代管理するため。
    デフォルトの暗号化」を有効化する。
  • バケットを作成」をクリックする。※その他はデフォルトの設定値のままとする。
  • 作成されたS3バケットをクリックして、「管理」タブをクリックする。
    ライフサイクルルールを作成する」をクリックする。
  • 任意のライフサイクルール名を入力する。
    バケット内のすべてのオブジェクトに適用」を選択し、「バケット内のすべてのオブジェクトに適用」のチェックボックスをオンにする。
  • オブジェクトの非現行バージョンを完全に削除」のチェックボックスをオンにする。
    stateファイルが現行バージョンでなくなってから削除する日数・指定した日数を超えても削除しないバージョン数を入力する。
    ※添付画像ではstateファイルの世代管理数を最低5世代としている。
    ルールの作成」をクリックする。

DynamoDBの作成

  • DynamonDBの画面へ移動して、「テーブルの作成」をクリックする。
  • 任意のテーブル名を入力する。
    バーティションキーに「LockID」と入力する。
    設定はデフォルト設定のままとする。
  • テーブルの作成」をクリックする。

設定ファイルの作成

作業環境にTerraformの設定ファイルを作成します。
作業環境のディレクトリ・ファイル階層は以下です。

terraform(Terraform実行ディレクトリ)
├── main.tf(デプロイ用のリソース記述)
└── terraform-config.tf(バージョン・バックエンド設定)

今回は「terraform-config.tf」で、S3とDynamonDBでstateファイルを管理する設定(バックエンド設定)を記述します。
※Terraformを実行する階層かつtfファイルであれば、ファイル名は何でもOKです。

▼terraform-config.tf
※Terraformの実行対象は、バックエンド用に作成したS3・DynamonDBと同じAWS環境としています。

############################################################################
# プロバイダ設定
############################################################################
provider "aws" {
  region = "ap-northeast-1"
}

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

############################################################################
# バックエンド設定
############################################################################
terraform {
  backend "s3" {
    bucket         = "<バックエンドに使用するS3バケット名>" # 作成したS3バケット名に書き換える
    key            = "state/terraform.tfstate"
    encrypt        = true
    region         = "ap-northeast-1"
    dynamodb_table = "<バックエンドに使用するS3バケット名>" # 作成したDynamonDBテーブル名に書き換える
  }
}

main.tfについては、S3・DynamonDBの設定に関わらず、記述方法は変わらないため省略します。

初期化コマンドの実行

Terraform実行用ディレクトリ「terraform」へ移動して以下コマンドを実行します。

terraform init

このコマンドによって、terraform-config.tfで指定したS3バケットとDynamonDBが、stateファイルのバックエンドに設定されます。
また、この時クラウドプロバイダ(今回であればAWS)のプラグインが作業環境にインストールされます。

手順は以上です。

まとめ

今回は、Terraformの状態管理ファイルであるstateファイルをAWSのS3・DynamoDBで管理する方法をご紹介しました。

AWS以外のクラウドプロバイダに使用しているtfstateファイルについても、AWS上のS3・DynamoDBで管理することができます。
その場合は、作業環境にてクラウドプロバイダ用とは別途S3・DynamonDBを構築するAWSへの資格情報(アクセスキー)を準備する必要があります。
※Terraformの実行環境がAWS上にある(EC2やECS)の場合は、永続的なアクセスキーではなく資格情報がローテーションされるIAMロールの利用を推奨します。

この記事を通して、少しでもTerraform学習・活用のお役に立てれば幸いです。