今回は、Terraformのtfstateファイル(以下stateファイル)をAWSのS3・DynamoDBで管理する方法をご紹介します。
stateファイルをAWSで管理するメリット
stateファイルをAWSのS3・DynamoDBで管理するメリットは大きく2点あります。
- S3バケットでstateファイルを共用管理することで、複数の作業者間でstateファイルの整合性を確保する。
- DynamoDBの項目を利用した排他制御(state lock)によって、IaCの競合・デプロイエラーを回避する。
stateファイル・その排他制御については、以下の記事で詳しく解説しています。
前提
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学習・活用のお役に立てれば幸いです。