Terraform Plan执行失败:Azure Resource Manager API授权构建失败
我来帮你分析下这个问题哈,你遇到的这个错误核心原因很明确:Terraform在尝试连接Azure资源管理器(ARM)的时候,找不到有效的身份认证会话。
你看错误日志里明确写了Please run 'az login' to setup account,在本地开发环境里我们可以手动执行az login完成登录,但GitHub Actions是无状态的CI/CD环境,每次运行都是全新的干净环境,根本没有预存的Azure登录状态,所以Terraform默认尝试用Azure CLI的本地登录信息时就直接失败了。
再看你的providers.tf配置,你设置了storage_use_azuread = true,但没有指定具体的Azure AD认证方式,Terraform就会 fallback 到尝试读取本地Azure CLI的登录会话,这在Actions环境里肯定行不通。
给你几个针对性的解决步骤,分场景来:
本地测试环境快速修复
如果是在本地跑terraform plan报错,直接在终端执行:
az login # 如果你有多个Azure订阅,还要指定默认订阅 az account set --subscription <你的订阅ID>
执行完再跑terraform plan就可以正常工作了。
GitHub Actions CI/CD环境的彻底解决
在CI/CD环境里我们不能手动登录,得用服务主体(Service Principal)来做自动化身份认证,步骤如下:
- 第一步:在Azure门户创建一个服务主体,给它分配对应资源组/订阅的权限(比如Contributor权限,或者更精细的最小权限),然后记录下这个服务主体的客户端ID、客户端密钥、租户ID,以及你的Azure订阅ID。
- 第二步:把这些敏感信息添加到GitHub仓库的Secrets里,比如命名为
AZURE_CLIENT_ID、AZURE_CLIENT_SECRET、AZURE_TENANT_ID、AZURE_SUBSCRIPTION_ID。 - 第三步:修改你的GitHub Actions workflow文件,在执行
terraform init/terraform plan之前,添加Azure登录的步骤,用官方的Azure/loginaction来完成自动化登录:
- name: 登录Azure uses: Azure/login@v1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
登录完成后,Azure的认证信息会自动注入到环境变量里,Terraform的azurerm provider会自动读取这些环境变量,不需要修改你现有的providers.tf配置就能正常工作。
另外补充一点:你的azurerm provider版本用的是4.4.0,完全支持Azure AD认证,版本没问题,不用升级或降级。
备注:内容来源于stack exchange,提问作者vikash sharma

