排查在 Azure 上使用 Terraform 时遇到的常见问题

本文列出了在 Azure 上使用 Terraform 时的常见问题和可能的解决方案。

如果遇到特定于 Terraform 的问题,请使用 HashiCorp 的社区支持渠道之一。

HashiCorp Terraform 特定支持渠道

无法列出提供程序注册状态

错误消息

错误:无法列出提供程序注册状态,这可能是由于凭据无效,或者服务主体无权使用 资源管理器 API,Azure 错误:资源。ProvidersClient#List: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code=“AuthorizationFailed” Message=“client '0000000-0000-0000-0000-000000000000000' with object id '00000000-0000-0000-00000-000 00-000000000000 无权在范围”/subscriptions/000000-0000-0000-0000-0000-00000-000000000000“上执行操作”Microsoft.Resources/subscriptions/providers/read“或范围无效。 如果最近已授予访问权限,请刷新凭据。”

背景:如果从 Cloud Shell 运行 Terraform 命令,并且定义了某些 Terraform/Azure 环境变量,则有时可能会出现冲突。 下表列出了环境变量及其表示的 Azure 值:

环境变量 Azure 值
ARM_SUBSCRIPTION_ID Azure 订阅 ID
ARM_TENANT_ID Microsoft 帐户租户 ID
ARM_CLIENT_ID Azure 服务主体应用 ID
ARM_CLIENT_SECRET Azure 服务主体密码

原因:在撰写本文时,在 Cloud Shell 中运行的 Terraform 脚本会使用当前 Azure 订阅中的值覆盖 ARM_SUBSCRIPTION_IDARM_TENANT_ID 环境变量。 因此,如果环境变量引用的服务主体不具有对当前 Azure 订阅的权限,则任何 Terraform 操作都会失败。

获取状态锁时出错

错误消息

错误:获取状态锁时出错;错误消息:发生 2 个错误:
* 状态 Blob 已锁定
* blob 元数据“terraformlockid”为空
Terraform 获取状态锁,以保护多个用户同时写入状态。 请解决上述问题,然后重试。 对于大多数命令,可以使用“-lock=false”标志禁用锁定,但不建议这样做。

背景:如果针对 Terraform 状态文件运行 Terraform 命令,并且此错误是唯一出现的消息,则以下原因可能适用。 适用于本地和远程状态文件。

原因:对于此错误有两种可能原因。 第一种是 Terraform 命令已针对状态文件运行,并且已强制锁定文件,因此没有任何中断。 第二个可能原因是运行命令时,状态文件和 CLI 之间发生连接中断。 这种中断最常发生在使用远程状态文件时。

解决方法:首先,请确保未针对状态文件运行任何命令。 如果使用本地状态文件,请检查是否有运行正在任何命令的终端。 或者,检查部署管道,查看正在运行的项目是否可能正在使用状态文件。 如果这无法解决问题,则可能是第二个原因触发了错误。 对于存储在 Azure 存储帐户容器的远程状态文件,可以找到该文件,并使用“中断租约”按钮

Screenshot that shows the Azure Storage container Break lease button.

如果使用其他后端来存储状态文件,有关建议,请参阅 HashiCorp 文档

VPN 错误

有关如何解决 VPN 错误的信息,请参阅排查混合 VPN 连接问题一文。