使用Azure AD用户分配托管身份认证Terraform失败求排查指引
问题排查:Azure Functions中Terraform用户分配托管身份认证失效
在Azure Functions中运行极简Terraform代码创建Azure资源,计划通过用户分配托管身份完成Terraform认证。已按文档配置Terraform后端的use_msi、client_id、subscription_id、tenant_id等参数,且托管身份具备资源创建权限,但Terraform仍走CLI认证流程,要求输入用户凭证。
执行参数与报错信息
Terraform Init执行参数
Running terraform command: init with args: () kwargs: {'no_color': None, 'backend_config': {'container_name': 'xyz', 'key': 'terraform.tfstate', 'storage_account_name': 'xyz', 'use_msi': 'true', 'client_id': '***', 'subscription_id': '***', 'tenant_id': '***', 'msi_endpoint': 'http://a.b.c.d:8081/msi/token'}}
报错信息
ERROR Terraform init stderr: Error: Error building ARM Config: obtain subscription(***) from Azure CLI: parsing json result from the Azure CLI: waiting for the Azure CLI: exit status 1: ERROR: Please run 'az login' to setup account.
已验证:函数应用可正常访问MSI端点,运行Terraform前能通过托管身份获取令牌访问存储账户读取配置。
排查方向
- 检查Terraform版本:部分旧版本对MSI认证的支持存在bug,尤其是用户分配托管身份的场景,建议升级到最新稳定版(如1.5+)
- 确认后端配置优先级:确保没有环境变量覆盖MSI相关配置,比如
ARM_CLIENT_ID、ARM_SUBSCRIPTION_ID等环境变量若设置了非托管身份的值,会被Terraform优先读取 - 移除手动指定的MSI端点:Azure Functions中用户分配托管身份的MSI端点无需手动指定,尝试删除
msi_endpoint参数,让Terraform自动获取 - 验证托管身份权限范围:除资源创建权限外,确保托管身份对Terraform状态存储的存储账户拥有Storage Blob Data Contributor权限(仅Contributor权限可能不足)
- 检查Provider配置:若Terraform代码中显式指定Azure Provider的认证方式为
cli,会覆盖后端MSI配置,需确保Provider未强制CLI认证 - 清理CLI相关环境变量:Azure Functions环境中若存在
AZURE_CONFIG_DIR等指向CLI缓存的变量,可能导致Terraform优先尝试CLI认证,需清除或 unset 这类变量
Terraform中MSI认证的源码位置
Terraform AzureRM Provider的MSI认证核心逻辑分布在以下位置:
- MSI服务核心逻辑:
github.com/hashicorp/terraform-provider-azurerm/internal/services/msi目录下的相关文件 - ARM配置构建逻辑:
github.com/hashicorp/terraform-provider-azurerm/internal/clients/arm_client.go中负责构建ARM配置的代码段,会优先检查MSI参数,再尝试CLI认证 - 后端存储MSI认证:
github.com/hashicorp/terraform-provider-azurerm/internal/backend/azurerm目录下的代码,处理状态存储的MSI认证流程
内容的提问来源于stack exchange,提问作者Harsha Chittepu
相关产品推荐
相关产品推荐

