我的最终目标是将 ADLS gen2 容器安装到我的 Databricks 工作区中,作为在 Azure 服务主体的支持下由 Terraform 管理的部署的一部分。这是一个单一部署,创建所有 Azure 资源(网络、防火墙、存储帐户、Databricks 工作区等),然后使用 Databricks Terraform 提供程序配置 Databricks 工作区。
这个答案说我无法使用服务主体进行 AAD 直通安装,这意味着我必须使用 OAuth2 身份验证。为此,我需要 Databricks 中的 Azure Key Vault 支持的秘密范围。 Terraform 文档 说我只能通过基于用户的身份验证来执行此操作,而不能通过我的服务主体来执行此操作。
所以我想也许我可以实现一个 hack:在 Terraform 中创建一个 Databricks PAT(同样,始终作为服务主体),然后使用 Terraform
external
资源“shell out”到 Databricks CLI,使用此 PAT 进行身份验证。我手动尝试了此操作并收到此错误:
{
"error_code": "INVALID_PARAMETER_VALUE",
"message": "Scope with Azure KeyVault must have userAADToken defined!"
}
这是有道理的,因为 PAT 是为服务主体创建的。但是,作为替代方案,此答案建议使用 Azure AD 令牌身份验证,而不是 PAT。所以,我就钻进那个兔子洞了!
我可以按照 Microsoft 文档获取 Azure AD 令牌,然后使用它对 Databricks CLI 进行身份验证:
export ARM_TENANT_ID="..."
export ARM_CLIENT_ID="..."
export ARM_CLIENT_SECRET="..."
export DATABRICKS_AAD_TOKEN="$(curl -X POST \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d "client_id=${ARM_CLIENT_ID}" \
-d 'grant_type=client_credentials' \
-d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \
-d "client_secret=${ARM_CLIENT_SECRET}" \
https://login.microsoftonline.com/${ARM_TENANT_ID}/oauth2/v2.0/token \
| jq -r .access_token)"
databricks configure --aad-token --host https://my-databricks-host.com
此身份验证有效:我可以运行各种 CLI 命令(例如,
databricks tokens list
)来返回预期结果。但是,现在当我尝试创建秘密范围时,它给了我一个完全不同的错误:
databricks secrets create-scope --scope "test" \
--scope-backend-type AZURE_KEYVAULT \
--resource-id "/subscriptions/my/key/vault/resource/id" \
--dns-name "https://my-vault-name.vault.azure.net/"
Error: Your authentication information may be incorrect. Please reconfigure with ``dbfs configure``
我的第一个问题是:我的黑客技术还能发挥作用吗?如果是,我的 AAD 令牌身份验证哪里出了问题?如果它不起作用,我的最终目标是否可能实现,或者我是否必须在不同的 AAD 身份(服务主体和普通用户)下分阶段运行多个 Terraform 部署(每个部署都有自己的状态)?
2023 年 5 月更新:现在可以使用服务主体在 Azure KeyVault 之上创建秘密范围。
是的,您不能使用为服务主体颁发的 AAD 令牌来执行此操作 - 它仅适用于真实用户的 AAD 令牌。这是 Azure 众所周知且有据可查的限制,希望将来能够得到修复。
这是实现 Azure Databricks 工作区端到端自动配置的主要障碍之一
如果我可以在这里写一些东西,因为我遇到了同样的错误:
使用databricks cli登录到databricks
从资源获取了广告令牌:keyvault
运行命令:databricks Secrets create-scope --scope 'my_name' --scope-backend-type 'AZURE_KEYVAULT' --resource-id 'link_to_resource_id_keyvault' --dns-name 'URI_of_key_vault' --user-aad-token $token 失败:表达式或语句中出现意外的标记“databricks”。
使用相同的命令进行不同的尝试,但将json转换为字符串:databricks Secrets create-scope --json $tostr $secretscope= @ {scope =“connect-to-prod-ADLS”initial_manage_principal =“users”scope_backend_type =“AZURE_KEYVAULT” user_aad_token = 'token_in_plain_txt_shouldnt_be_really' backend_azure_keyvault= @ { resources_id = "resource_id of KeyVault" dns_name = "URI of Keyvault" } } 使用 azure cli 生成的 user_aad_token。错误:仍然无法创建秘密范围。这里真正的问题是什么?