#azure #azure-data-factory #http-status-code-403 #azure-keyvault #azure-databricks
#azure #azure-data-factory #http-status-code-403 #azure-keyvault #azure-databricks
Вопрос:
У меня есть экземпляр Databricks, который выполняет некоторую работу. Задания запускаются с фабрики данных Azure. Существует несколько сред, и каждая из них имеет свое собственное хранилище ключей для хранения секретов.
Пока я сохранял токен доступа — скажем, «жестко закодированный» — в конфигурации службы, связанной с Databricks, все работало нормально. Но мне нужно соблюдать стандарты безопасности, поэтому хранить его в формате JSON, который где-то лежит, не вариант — на данный момент это было нормально.
Хранилище ключей для токена аварийного доступа к хранилищу данных создается через API и хранится в хранилище ключей, теперь я хотел использовать хранилище ключей как связанную службу в связанной службе Databricks для заполнения токена доступа, и вот сюрприз — он не работает.
Я не могу отладить конвейер, я не могу его запустить, я даже не могу протестировать соединение, оно всегда завершается ошибкой с 403 недопустимым токеном доступа:
JSON для этой связанной службы:
{
"name": "ls_databricks",
"type": "Microsoft.DataFactory/factories/linkedservices",
"properties": {
"annotations": [],
"type": "AzureDatabricks",
"typeProperties": {
"domain": "https://**************.azuredatabricks.net",
"accessToken": {
"type": "AzureKeyVaultSecret",
"store": {
"referenceName": "ls_keyVault",
"type": "LinkedServiceReference"
},
"secretName": "DatabricksAccessToken"
},
"existingClusterId": "*********"
}
}
}
В то время как с помощью Postman я могу легко получить доступ к API Databricks, используя тот же токен доступа:
Сама служба, связанная с хранилищем ключей, работает нормально, и проверка соединения проходит:
Я настроил другую связанную службу для подключения к ADL с использованием хранилища ключей, и она работает, как ожидалось:
У кого-нибудь есть идеи, что здесь не так? Он просто сломан или я делаю что-то не так?
p.s. Извиняюсь за то, что залил вас всеми этими скриншотами
Я использую https://docs.databricks.com/dev-tools/api/latest/scim/scim-sp.html SCIM API для присвоения моему участнику службы соответствующей группы в экземпляре Databricks.
Ответ №1:
Настроили ли вы соответствующую политику доступа в хранилище ключей? Предпочтительной методологией было бы включить управляемую идентификацию для фабрики данных, а затем добавить идентификатор фабрики данных в политику доступа к хранилищу ключей
Хранилище ключей имеет отдельный уровень доступа к секретам, который необходимо настроить для фабрики данных, поскольку фабрика данных пытается получить к ней доступ, и ей необходимо предоставить доступ к секретам.
Комментарии:
1. Да, мой конвейер подготовки инфраструктуры настраивает политики доступа для ADF в хранилище ключей, как я упоминал в своем посте, сама служба, связанная с хранилищем ключей, работает, служба, связанная с ADLS, также работает, используя хранилище ключей для получения секрета, кстати. если политика доступа отсутствует, ошибка при тестировании соединения будет выглядеть примерно так: «Политика доступа ADF не найдена в хранилище ключей бла-бла-бла» вместо «403 Недопустимый токен доступа»
Ответ №2:
Наконец, я смог решить эту проблему с помощью расширений командной строки Databricks.
Рабочее решение (интересно, как долго, это экспериментальное расширение):
az extension add --name datafactory
$lsDatabricks = @{
"type" = "AzureDatabricks"
"typeProperties" = @{
"domain" = "https://***********.azuredatabricks.net"
"existingClusterId" = "************-vale**"
"accessToken" = @{
"type" = "SecureString"
"value" = "dapi******************************"
}
}
}
$lsJson = $lsDatabricks | ConvertTo-Json -Compress
$lsJson = $lsJson -Replace '"', '"'
az datafactory linked-service create --factory-name "yourAdf" --name "yourDatabricksLinkckedService" --resource-group "yourGroup" --properties "$lsJson"
Я прошел очень ухабистую дорогу только для настройки глупой связанной службы. Кстати, я пытался сделать это с помощью параметризованного шаблона, например:
"AzureDatabricks": {
"properties": {
"typeProperties": {
"domain": "=",
"existingClusterId": "=",
"accessToken": "=:accessToken:secureString"
}
}
К сожалению, какое бы значение я ни переопределял при развертывании шаблона ARM, конечное значение не изменилось.