Terraformはクラウドインフラストラクチャの定義、プレビュー、そしてデプロイメントを可能にします。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダー (Azure など) とクラウド インフラストラクチャを構成する要素を指定できます。 あなたの設定ファイルを作成した後、実行計画を作成します。これにより、インフラストラクチャの変更をデプロイする前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。
Terraform の状態は、デプロイされたリソースと Terraform 構成を調整するために使用されます。 状態を使用すると、Terraform は追加、更新、または削除する Azure リソースを認識できます。
デフォルトでは、Terraform の状態はローカルに格納されますが、次の理由から理想的ではありません。
- 地方の州は、チームや共同作業の環境ではうまく機能しません。
- Terraform の状態には、機密情報が含まれる場合があります。
- 状態をローカルに格納すると、誤って削除される可能性が高くなります。
この記事では、次の方法について説明します。
- Azure Storage アカウントを作成する
- Azure ストレージを使用して、リモートの Terraform 状態を格納します。
- ステートロックを理解する
- 保存時の暗号化を理解する
1. 環境を構成する
- Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
Terraform の構成: まだ構成していない場合は、次のいずれかのオプションを使用して Terraform を構成します。
- Bash を使用して Azure Cloud Shell で Terraform を構成する
- PowerShell を使用して Azure Cloud Shell で Terraform を構成する
- Bash を使用して Windows で Terraform を構成する
- PowerShell を使用して Windows で Terraform を構成する
- Bash を使用して Azure Cloud Shell で Terraform を構成する
2. リモート状態ストレージ アカウントを構成する
Azure Storage をバックエンドとして使用する前に、ストレージ アカウントを作成する必要があります。
次のコマンドまたは構成を実行して、Azure ストレージ アカウントとコンテナーを作成します。
#!/bin/bash
RESOURCE_GROUP_NAME=tfstate
STORAGE_ACCOUNT_NAME=tfstate$RANDOM
CONTAINER_NAME=tfstate
# Create resource group
az group create --name $RESOURCE_GROUP_NAME --___location eastus
# Create storage account
az storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --sku Standard_LRS --encryption-services blob
# Create blob container
az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME
重要なポイント:
- Azure ストレージ アカウントには、グローバルに一意な名前が必要です。 ストレージ アカウント名のトラブルシューティングの詳細については、「 ストレージ アカウント名のエラーを解決する」を参照してください。
- Terraform の状態はプレーン テキストで格納され、シークレットが含まれている場合があります。 状態が誤って保護されている場合、システムへの不正アクセスやデータ損失が発生する可能性があります。
- この例では、Terraform はアクセス キーを使用して Azure ストレージ アカウントに対して認証を行います。 運用環境のデプロイでは、azurerm バックエンドでサポートされている使用可能な 認証オプション を評価し、ユース ケースに最も安全なオプションを使用することをお勧めします。
- この例では、この Azure ストレージ アカウントへのパブリック ネットワーク アクセスが許可されています。 運用環境のデプロイでは、 ストレージ ファイアウォール、サービス エンドポイント、またはプライベート エンドポイントを使用して、このストレージ アカウントへのアクセスを制限することをお勧めします。
3. terraform バックエンドの状態を構成する
バックエンドの状態を構成するには、次の Azure ストレージ情報が必要です。
- storage_account_name: Azure Storage アカウントの名前。
- container_name: BLOB コンテナーの名前。
- key: 作成するステートストアファイルの名前。
- access_key: ストレージ アクセス キー。
これらの各値は、Terraform 構成ファイルまたはコマンド ラインで指定できます。
access_key
値には環境変数を使用することをお勧めします。 環境変数を使用すると、キーがディスクに書き込まれなくなります。
次のコマンドを実行して、ストレージ アクセス キーを取得し、環境変数として格納します。
ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query '[0].value' -o tsv)
export ARM_ACCESS_KEY=$ACCOUNT_KEY
重要なポイント:
Azure Storage アカウントのアクセス キーをさらに保護するには、Azure Key Vault に格納します。 環境変数は、次のようなコマンドを使用して設定できます。 Azure Key Vault の詳細については、 Azure Key Vault のドキュメントを参照してください。
export ARM_ACCESS_KEY=$(az keyvault secret show --name terraform-backend-key --vault-name myKeyVault --query value -o tsv)
backend
構成ブロックを使用してTerraform構成を作成します。
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
backend "azurerm" {
resource_group_name = "tfstate"
storage_account_name = "<storage_account_name>"
container_name = "tfstate"
key = "terraform.tfstate"
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "state-demo-secure" {
name = "state-demo"
___location = "eastus"
}
<storage_account_name>
は、実際の Azure Storage アカウントの名前に置き換えてください。
次のコマンドを実行して、設定を初期化します。
terraform init
次のコマンドを実行して、設定を実行します。
terraform apply
これで、Azure Storage BLOB で状態ファイルを見つけることができます。
4. ステートロックを理解する
Azure Storage BLOB は、状態を書き込む操作の前に自動的にロックされます。 このパターンにより、破損の原因となる可能性のある同時状態操作が防止されます。
詳細については、Terraform ドキュメントの 「状態ロック 」を参照してください。
ロックは、Azure portal またはその他の Azure 管理ツールを使用して BLOB を調べることで確認できます。
5. 保存時の暗号化を理解する
Azure BLOB に格納されたデータは、永続化される前に暗号化されます。 必要に応じて、Terraform はバックエンドから状態を取得し、ローカル メモリに格納します。 このパターンを使用すると、状態がローカル ディスクに書き込まれることはありません。
Azure Storage の暗号化の詳細については、「 保存データの Azure Storage サービスの暗号化」を参照してください。
Azure での Terraform のトラブルシューティング
Azure で Terraform を使用する際の一般的な問題をトラブルシュートする