理系学生日記

おまえはいつまで学生気分なのか

AzureでTerraform Backendを構成する

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が保存されているようですね。

参考文献