このチュートリアルでは、Terraform の状態を Cloud Storage バケットに保存する方法について説明します。
デフォルトでは、Terraform はローカルの terraform.tfstate
という名前のファイルに状態を保存します。複数のユーザーが Terraform を同時に実行していて、各マシンが現在のインフラストラクチャを独自に認識している場合は、このデフォルト構成が原因でチームでの Terraform の使用が難しくなる場合があります。
このページでは、このような問題を回避するために、Cloud Storage バケットを参照するリモート状態を構成する方法について説明します。リモート状態は Terraform バックエンドの機能です。
環境を準備する
Terraform サンプルを含む GitHub リポジトリのクローンを作成します。
git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
作業ディレクトリを変更します。
cd terraform-docs-samples/storage/remote_terraform_backend_template
Terraform ファイルを確認する
main.tf
ファイルを確認してみましょう。cat main.tf
出力は次のようになります。
このファイルでは、次のリソースを記述しています。
random_id
: Cloud Storage バケットの名前を一意にするために、Cloud Storage バケット名に追加されます。google_storage_bucket
: 状態ファイルを保存する Cloud Storage バケット。このバケットの構成では、次のプロパティが使用されています。- バケット内にオブジェクトが存在する場合にバケットが削除されないように、
force_destroy
はfalse
に設定されています。この設定により、バケット内の状態情報が誤って削除されることはありません。 - バケットの内容が誤って一般公開されないように、
public_access_prevention
はenforced
に設定されています。 - アクセス制御リストではなく IAM 権限を使用して、バケットとそのコンテンツへのアクセスを制御できるように、
uniform_bucket_level_access
はtrue
に設定されています。 - 以前のバージョンの状態がバケットに保持されるように、
versioning
は有効に設定されています。
- バケット内にオブジェクトが存在する場合にバケットが削除されないように、
local_file
: ローカル ファイル。このファイルの内容に従って、Terraform はバケット作成後に Cloud Storage バケットをリモート バックエンドとして使用します。
Cloud Storage バケットをプロビジョニングする
Terraform を初期化します。
terraform init
terraform init
を初めて実行する場合、main.tf
ファイルで指定した Cloud Storage バケットはまだ存在していません。そのため、Terraform は、状態をローカル ファイル システムに保存するために、ローカル バックエンドを初期化します。構成を適用して、
main.tf
ファイルに記述されているリソースをプロビジョニングします。terraform apply
プロンプトが表示されたら、「
yes
」と入力します。terraform apply
を初めて実行する場合、Terraform は状態を保存する Cloud Storage バケットをプロビジョニングします。また、ローカル ファイルも作成します。Terraform はこのファイルの内容に従って Cloud Storage バケットをリモート バックエンドとして使用し、状態を保存します。
状態を Cloud Storage バケットに移行する
Terraform の状態をリモートの Cloud Storage バックエンドに移行します。
terraform init -migrate-state
Terraform は状態ファイルがすでにローカルに存在することを検出し、状態を新しい Cloud Storage バケットに移行するように求めます。プロンプトが表示されたら、「
yes
」と入力します。
このコマンドを実行すると、Terraform の状態が Cloud Storage バケットに保存されます。Terraform は、コマンドを実行する前にこのバケットから最新の状態を pull し、コマンドを実行した後に最新の状態をバケットに push します。