2021-07-04 Azure , Others , Terraform
terraform.tfstateをAzureストレージアカウント(Blobコンテナー)に保管する設定手順です。
マイクロソフト社のチュートリアルを参考に確認しています。
チュートリアル:Terraform 状態を Azure Storage に格納する
Terraformは、terraform.tfstateファイルで構成情報を管理しています。
このファイルをローカルに保管した場合、ユーザー間で構成情報の共有ができません。
別のユーザーがTerraformを使って更新した場合、自分の構成情報は更新されず、正しい構成情報が保管されていない状態になります。
この状態でTerraformを使ってAzureリソースを操作すると、意図しないリソースの更新が発生する可能性があります。
terraform.tfstateをAzureストレージに保管することで、ユーザー間でTerraformが管理する構成情報を共有することができます。
今回は、terraform.tfstateをAzureストレージアカウント(Blobコンテナー)に保管する手順を確認します。。
その他のTerraformに関連する記事は、こちらで紹介しています。
Terraformの記事一覧
terraform.tfstateをAzureストレージアカウントに保存
ストレージアカウントを作成
事前準備として、terraform.tfstateを保管するためのストレージアカウントを作成します。
チュートリアルと同様に、リソースグループの作成、ストレージアカウントの作成、Blobコンテナーの作成を行います。
Azure CLI(Linux環境)を使用して作成しています。
チュートリアル:Terraform 状態を Azure Storage に格納する
ストレージアカウント作成
作成条件
リソースグループ名は、terraformtest01とする
ストレージアカウント名は、tstate+ランダムの数字とする
Blobコンテナー名はtstateとする
ロケーションはeastus2(米国東部2)とする
echoコマンドでストレージアカウント名やアクセスキーを出力する
Azure CLI(Linux環境で実行)
#!/bin/bash
RESOURCE_GROUP_NAME=terraformtest01
STORAGE_ACCOUNT_NAME=tstate$RANDOM
CONTAINER_NAME=tstate
# Create resource group
az group create –name $RESOURCE_GROUP_NAME –location eastus2
# Create storage account
az storage account create –resource-group $RESOURCE_GROUP_NAME –name $STORAGE_ACCOUNT_NAME –sku Standard_LRS –encryption-services blob
# Get storage account key
ACCOUNT_KEY=$(az storage account keys list –resource-group $RESOURCE_GROUP_NAME –account-name $STORAGE_ACCOUNT_NAME –query '[0].value’ -o tsv)
# Create blob container
az storage container create –name $CONTAINER_NAME –account-name $STORAGE_ACCOUNT_NAME –account-key $ACCOUNT_KEY
echo “storage_account_name: $STORAGE_ACCOUNT_NAME"
echo “container_name: $CONTAINER_NAME"
echo “access_key: $ACCOUNT_KEY “
作成したリソースを確認します。
リソースグループやストレージアカウント(コンテナーを含む)が作成されていることを確認できます。
【Azure CLI】
storage_account_name: tstate9158
container_name: tstate
access_key: ji0/0qhk9xSphFHl(~中略~)N==
【Azure Portal】
※今回は検証用のため、ストレージアカウントでアクセス制限などは実施していません。実環境では、アクセス元のIP制限などを設定し、十分にセキュリティにご留意ください。
main.tfファイルにBlobコンテナーの情報を記載
こちらで使用したファイルを利用して進めます。
main.tfにはバックエンドの情報を記載します。
指定内容
ストレージアカウントのリソースグループ名
ストレージアカウント名
BLOBコンテナー名
保管するtfstateファイル名
アクセスキー
この情報はterraformブロックに記載します。Terraformのチュートリアルを参考に、Azureストレージアカウントのaccess_keyを明示してアクセスしています。
チュートリアル:Terraform 状態を Azure Storage に格納する
※今回は検証の都合上、access_keyを直接記載しています。これはセキュリティ上好ましくないため、キーコンテナー(KeyVault)を利用するなどの対応を行います。
設定ファイルを編集
作成条件
main.tfファイルにbackend “azurerm"{}を追加
Access Keyを利用してストレージアカウントへアクセス
【main.tf】
terraform {
required_providers {
azurerm = {
source = “hashicorp/azurerm"
version = “=2.46.0"
}
}
backend “azurerm" {
resource_group_name = “terraformtest01"
storage_account_name = “tstate9158"
container_name = “tstate"
key = “terraform.tfstate"
access_key = “ji0/0qhk9xSphFHl(~中略~)N=="
}
}
terraformブロック変更後にterraform initを実行
ファイルの設定を変更した後、terraform initを実行します。
バックエンドの情報を変更したため、再度terraform initを実行する必要があります。
今回は、ローカルに保存しているterraform.tfstateを、ストレージアカウントに移行して利用しています。
Backend Initialization
その場合、バックエンド構成を更新する必要があります。
-migrate-stateオプションを利用すると、既存の状態を新しいバックエンドにコピーします。
terraform initを実行
バックエンド構成更新後、terraform initを実行するとエラーになります。
PS C:\terraform>
terraform init
Initializing the backend…
╷
│ Error: Backend configuration changed
│
│ A change in the backend configuration has been detected, which may require migrating existing state.
│
│ If you wish to attempt automatic migration of the state, use “terraform init -migrate-state".
│ If you wish to store the current configuration with no changes to the state, use “terraform init -reconfigure"
-migrate-stateオプションをつけてterraform initを実行します。
成功していることが確認できます。
PS C:\terraform> terraform init -migrate-state
Initializing the backend…
Backend configuration changed!
Terraform has detected that the configuration specified for the backend
has changed. Terraform will now check for existing state in the backends.
Successfully configured the backend “azurerm"! Terraform will automatically
use this backend unless the backend configuration changes.
Initializing provider plugins…
– Reusing previous version of hashicorp/azurerm from the dependency lock file
– Using previously-installed hashicorp/azurerm v2.46.0
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running “terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
ストレージアカウントのBlobコンテナー内にterraform.tfstateファイルが生成されていることが確認できます。
terraform applyを実行しterraform.tfstateロック状態を確認
terraform applyを実行した際のterraform.tfstateファイルのロック状態を確認します。
terraform applyを実行
terraform applyを実行してメッセージを確認します。
terraform.tfstateがロックされていることが分かります。
PS C:\terraform> terraform apply
Acquiring state lock. This may take a few moments…
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
terraform applyの実行中にファイルのステータスを確認すると、ロック状態になっていることが確認できます。
terraform apply実行後にterraform.tfstateの内容を確認
terraform applyの実行前後でterraform.tfstateを確認し、更新されていることを確認します。
ストレージアカウントに配置した、terraform.tfstateが更新されていることが確認できます。
terraform.tfstateの比較
terraform apply実行前
{
“version": 4,
“terraform_version": “1.0.1",
“serial": 0,
“lineage": “XXXXXXXXXXXXXXXXXXXXX",
“outputs": {},
“resources": []
}.
“version": 4,
“terraform_version": “1.0.1",
“serial": 2,
(~中略~
{
“mode": “managed",
“type": “azurerm_linux_virtual_machine",
“name": “VM-01",
“provider": “provider[\"registry.terraform.io/hashicorp/azurerm\"]",
“instances": [
(~以下略~) 【】
—広告—
最後に
Terraformブロックのbackendを使用することで、terraform.tfstateファイルをAzureストレージアカウントに保管することができました。
Azureストレージアカウントに置いたterraform.tfstateファイルの更新やロックについても確認できました。
これにより、複数のユーザーでterraform.tfstateファイルを共有しながら作業できる環境が構築できることが分かりました。
今後もTerraformについて、いろいろなことを試していきたいと思います。
Terraform関連の記事は、こちらにまとめております。
Terraformの記事一覧