AzureをTerraformを使って管理する上で、Terraform BackendもAzure上に構成してみます。
AzureにおけるTerraform Backend
TerraformのBackendをAWS上に構成する場合、S3+DynamoDBを用いるのが推奨でした。 一方でTerraform BackendをAzure上で構成する場合は、Azure Blob Storageを使うことになります。
Blob Storage
Blob Storageで制御されるリソースにはストレージアカウント、コンテナ、そしてBlobがあります。 Blob (オブジェクト) Storage の概要 - Azure Storage | Microsoft Docsから引用しますが、リソースの階層構造としては以下のような構成になります。
S3と対応させると、ストレージアカウントがBucket、コンテナがディレクトリ、Blogがオブジェクトということになるでしょう。
また、AWSでは同時並行したtfstateの更新防止はDynamo DBによって制御されていました。Azure StorageにおいてはBlobに関して「リース」という概念があり、こちらのLeaseによって同時並行した更新が防がれます。
ストレージアカウントの作成
それでは、まずはBlob Storageを作成してみましょう。Blob Storageを作るためには、まずリソースグループを作成し、その配下にストレージアカウントを作成するという手順になります。
ここでは、リソースグループとしてtfstate
としてみます。
$ az group create --name tfstate --location japaneast
次に、ストレージアカウントを作成しましょう。
Azure StorageのSKUタイプについてはSKUタイプに定義があります。 とはいえ、突然「ローカル冗長ストレージ」や「ゾーン冗長ストレージ」といった用語が出てきて面食らいます。 これらの定義についてはデータの冗長性 - Azure Storage | Microsoft Docsを見れば良いでしょう。
ここでは、最も安価なローカル冗長ストレージであるStandard_LRS
を選択します。
$ az storage account create --resource-group tfstate --name kiririmodestatestorage --sku Standard_LRS --encryption-services blob
これでストレージアカウントが作成できたので、ディレクトリにあたる「コンテナ」を作りましょう。
$ account_key=$(az storage account keys list --resource-group tfstate --account-name kiririmodestatestorage --query '[0].value' -o tsv) $ az storage container create --name tfstate --account-name kiririmodestatestorage --account-key $account_key $ az storage container list --account-name kiririmodestatestorage --account-key $account_key --output table Name Lease Status Last Modified ------- -------------- ------------------------- tfstate unlocked 2021-05-03T06:57:29+00:00
tfstate
というコンテナが作成できたようです。
実際にTerraformを実行してみる
それでは、実際にTerraformを実行してみます。
今回用意したのは以下のようなtfファイルです。backend
ブロックに、今回作成したAzure Storage周りの情報を設定しました。実行することは、単にリソースグループを作るだけです。
terraform { required_version = "0.15.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "=2.56.0" } } backend "azurerm" { resource_group_name = "tfstate" storage_account_name = "kiririmodestatestorage" container_name = "tfstate" key = "terraform.tfstate" } } provider "azurerm" { features {} } resource "azurerm_resource_group" "example" { name = "example" location = "japaneast" }
それでは実際にterraform applyを行ってみます。
$ az login $ terraform init $ terraform apply
実際にtfstateが作成されているか確認してみましょう。
$ az storage blob list --account-name kiririmodestatestorage --account-key $account_key --container-name tfstate --output table Name Blob Type Blob Tier Length Content Type Last Modified Snapshot ----------------- ----------- ----------- -------- ---------------- ------------------------- ---------- terraform.tfstate BlockBlob Hot 912 application/json 2021-05-03T07:15:33+00:00
Azureポータルから中身を確認してみましたが、きちんとstateが保存されているようですね。