排查在 Azure 上使用 Terraform 时遇到的常见问题
本文列出了在 Azure 上使用 Terraform 时的常见问题和可能的解决方案。
如果遇到特定于 Terraform 的问题,请使用 HashiCorp 的社区支持渠道之一。
HashiCorp Terraform 特定支持渠道
- 问题、用例和有用模式: HashiCorp 社区门户的 Terraform 部分
- 提供程序相关问题: HashiCorp 社区门户的 Terraform Providers 部分
无法列出提供程序注册状态
错误消息:
错误:无法列出提供程序注册状态,这可能是由于凭据无效,或者服务主体无权使用 资源管理器 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_ID
和 ARM_TENANT_ID
环境变量。 因此,如果环境变量引用的服务主体不具有对当前 Azure 订阅的权限,则任何 Terraform 操作都会失败。
获取状态锁时出错
错误消息:
错误:获取状态锁时出错;错误消息:发生 2 个错误:
* 状态 Blob 已锁定
* blob 元数据“terraformlockid”为空
Terraform 获取状态锁,以保护多个用户同时写入状态。 请解决上述问题,然后重试。 对于大多数命令,可以使用“-lock=false”标志禁用锁定,但不建议这样做。
背景:如果针对 Terraform 状态文件运行 Terraform 命令,并且此错误是唯一出现的消息,则以下原因可能适用。 适用于本地和远程状态文件。
原因:对于此错误有两种可能原因。 第一种是 Terraform 命令已针对状态文件运行,并且已强制锁定文件,因此没有任何中断。 第二个可能原因是运行命令时,状态文件和 CLI 之间发生连接中断。 这种中断最常发生在使用远程状态文件时。
解决方法:首先,请确保未针对状态文件运行任何命令。 如果使用本地状态文件,请检查是否有运行正在任何命令的终端。 或者,检查部署管道,查看正在运行的项目是否可能正在使用状态文件。 如果这无法解决问题,则可能是第二个原因触发了错误。 对于存储在 Azure 存储帐户容器的远程状态文件,可以找到该文件,并使用“中断租约”按钮。
如果使用其他后端来存储状态文件,有关建议,请参阅 HashiCorp 文档。
VPN 错误
有关如何解决 VPN 错误的信息,请参阅排查混合 VPN 连接问题一文。