使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 HCL 语法允许你指定云提供商(如 Azure)和构成云基础结构的元素。 创建配置文件后,请创建一个执行计划,利用该计划,可在部署基础结构更改之前先预览这些更改。 验证更改后,应用执行计划来部署基础结构。
Terraform state 用于协调已部署的资源与 Terraform 配置。 状态允许 Terraform 知道要添加、更新或删除哪些 Azure 资源。
默认情况下,Terraform 状态存储在本地,这并不理想,原因如下:
- 地方状态在团队或协作环境中效果不佳。
- Terraform 状态可以包含敏感信息。
- 在本地存储状态会增加意外删除的可能性。
在这篇文章中,你将学会如何:
- 创建 Azure 存储帐户
- 使用 Azure 存储存储远程 Terraform 状态。
- 了解状态锁定
- 了解 静态加密
1.配置环境
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建 一个免费帐户 。
配置 Terraform:如果尚未执行此操作,请使用以下选项之一配置 Terraform:
2. 配置远程状态存储帐户
在使用 Azure 存储作为后端之前,必须创建一个存储帐户。
运行以下命令或配置以创建 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 存储帐户的名称。
- container_name:blob 容器的名称。
- key:需要创建的 state store 文件的名称。
- 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 存储帐户访问密钥,请将其存储在 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 存储帐户的名称。
执行以下命令初始化配置。
terraform init
执行以下命令,执行配置。
terraform apply
现在可以在 Azure 存储 blob 中找到状态文件。
4. 了解状态锁定
Azure 存储 blob 在写入状态的任何作之前会自动锁定。 此模式可防止并发状态作,这可能会导致损坏。
有关更多信息,请参阅 Terraform 文档中的状态 锁定 。
通过 Azure 门户或其他 Azure 管理工具检查 blob 时,可以看到锁。
5. 了解静态加密
存储在 Azure blob 中的数据在持久保存之前会进行加密。 需要时,Terraform 会从后端检索状态并将其存储在本地内存中。 如果使用此模式,则 state 永远不会写入本地磁盘。
有关 Azure 存储加密的详细信息,请参阅 静态数据的 Azure 存储服务加密。
Azure 上的 Terraform 故障排除
排查在 Azure 上使用 Terraform 时遇到的常见问题