Terraform AzAPI Provider OIDC认证失败:Identity not found问题求助
核心原因分析
AzAPI Provider与Azurerm Provider在OIDC认证的处理逻辑上存在差异,导致前者无法自动继承GitHub Actions的OIDC登录上下文,具体可能的触发点包括:
1. AzAPI需要显式指定OIDC客户端ID
Azurerm Provider会自动读取GitHub Actions登录后生成的环境变量或上下文凭证,但AzAPI Provider在配置use_oidc=true时,必须显式指定client_id参数。如果缺失该参数,它会尝试从Azure实例元数据服务(IMDS)获取身份,而GitHub Actions运行环境并非Azure虚拟机,因此会返回"Identity not found"错误。
2. AzAPI Provider版本未指定或过旧
未指定版本的AzAPI Provider可能使用了对OIDC支持不完善的旧版本,导致无法正确处理GitHub Actions的OIDC凭证。
3. 目标订阅(Subscription ID 2)权限缺失
用于OIDC认证的服务主体可能未被授予订阅2的访问权限——虽然Azurerm在订阅1运行正常,但跨订阅的权限需要单独配置。
具体解决步骤
步骤1:完善AzAPI Provider配置,添加client_id
将Azure中注册的GitHub OIDC服务主体的客户端ID填入AzAPI Provider配置:
provider "azapi" { alias = "alias1" tenant_id = "<Tenant ID>" subscription_id = <Subscription ID 2> use_oidc = true client_id = "<GitHub OIDC服务主体Client ID>" # 新增该行 }
步骤2:指定AzAPI Provider的稳定版本
在required_providers中添加AzAPI的版本约束,确保使用支持OIDC的新版本:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "3.43.0" } azapi = { source = "azure/azapi" version = ">=1.9.0" # 新增版本约束 } } }
步骤3:验证订阅2的服务主体权限
确认用于OIDC的服务主体在订阅2中拥有至少Contributor(或部署配额告警所需的最小权限)角色:
- 登录Azure门户,进入订阅2
- 依次点击「访问控制(IAM)」→「角色分配」
- 检查是否存在该服务主体的对应角色分配,若没有则添加
步骤4:确保GitHub Actions登录上下文覆盖跨订阅权限
如果使用azure/login动作,只需确保服务主体拥有多订阅权限即可,Terraform会通过Provider配置的subscription_id自动切换目标订阅,无需额外操作。
内容的提问来源于stack exchange,提问作者simpleCoder

