无客户端密钥时,Terraform Cloud中如何用az login登录Azure
解决Terraform Cloud中local-exec调用az login(无client-secret)的问题
以下是几种无需client-secret即可完成az login的方案,适配Terraform Cloud动态凭证场景:
方案1:直接利用Terraform Cloud注入的临时环境变量
Terraform Cloud的dynamic provider credentials会自动在运行环境中注入一组Azure临时凭证相关的环境变量,直接用这些变量完成登录:
resource "null_resource" "azure_cli_operation" { provisioner "local-exec" { command = <<EOT az login --service-principal \ -u $ARM_CLIENT_ID \ -t $ARM_TENANT_ID \ --federated-token $ARM_ACCESS_TOKEN EOT } }
- 变量说明:
ARM_CLIENT_ID是服务主体ID,ARM_TENANT_ID是租户ID,ARM_ACCESS_TOKEN是Terraform Cloud生成的临时联邦令牌,均由动态凭证机制自动注入。
方案2:通过AzureAD Provider获取自定义权限令牌
如果需要更精细的权限控制,可以用azuread_access_token数据源生成指定范围的令牌,再用于登录:
data "azuread_access_token" "management_scope" { application_id = var.azure_service_principal_id scope = ["https://management.azure.com/.default"] } resource "null_resource" "custom_cli_operation" { provisioner "local-exec" { command = <<EOT az login --service-principal \ -u ${var.azure_service_principal_id} \ -t ${var.azure_tenant_id} \ --federated-token ${data.azuread_access_token.management_scope.token} EOT } }
- 优势:可以自定义令牌的权限范围,适配不同操作的权限需求。
方案3:跳过显式login,直接用环境变量执行az命令
AZ CLI支持直接读取ARM系列环境变量完成认证,无需显式调用az login:
resource "null_resource" "direct_cli_call" { provisioner "local-exec" { command = "az vm list --subscription $ARM_SUBSCRIPTION_ID" # 若环境变量未自动注入,可手动传入 environment = { ARM_CLIENT_ID = var.azure_service_principal_id ARM_TENANT_ID = var.azure_tenant_id ARM_ACCESS_TOKEN = data.azuread_access_token.management_scope.token ARM_SUBSCRIPTION_ID = var.azure_subscription_id } } }
- 注意:确保服务主体拥有执行目标az命令所需的权限。
内容的提问来源于stack exchange,提问作者Jaimin Joshi
相关产品推荐
相关产品推荐

