Gerando Tokens de Service Principals

Anselmo Borges
Rescue Point
Published in
5 min readAug 2, 2024
Compartilhando e guardando pro futuro

Alguns artigos que faço são meio que pra guardar um procedimento que não faço muitas vezes, esse é um deles. Precisei gerar tokens de acesso para o DBT, o de usuário é simples dá pra fazer via UI, mas a parte do Job onde rola um deploy em ambientes é recomendado que seja feito com uma conexão de service principal.

Alias é uma pratica recomendada em muitos cenários, vai que você configura com seu usuário nominal e sai da empresa, eles deletam seu usuário do AD e seus processos…

Incêndio rolando e vc de rescisão rs

Pra evitar esse caos pros seus amigos (a não ser que você queira causa-lo mesmo, rs) recomenda-se o uso de services principals, no Databricks podemos trabalhar com 2 tipos:

No Unity Catalog temos a opção de criar um service principal, via UI vamos na opção User Management e lá tem a opção Service Principals

Administração de usuários e grupos no Unity

Entrando na opção de service principals clicando em add service principalde cara da pra ver os 2 tipos possíveis:

  • Databricks Managed: Você cria o service principal sem vinculo nenhum com o Microsoft Entra (AD) e gerencia ele pelo Databricks.
  • Microsoft Entra ID managed: Você cria o App Registration lá na Azure no Microsoft Entra (AD) e cadastra ele aqui, para cadastra-lo, vai precisar do APP ID e atribuir um nome pra ele aqui.
Estou simulando a criação do service principal gerenciado pelo Databricks srv_teste

Criei um SP (Service principal) chamado srv_teste , o processo tanto com um SP Databricks Managed como Microsoft Entra ID managed são os mesmos para chegarmos até o Token, mas pra SPs tem um pulo do gato, diferente dos tokens PAF (Personal Access Token), voltados para usuários.

Service principal criado

Esse service principal deve ser atribuido a um workspace, no caso vou adicionar a um de teste aqui.

Vou no Workspace, clico em permissions e clico em add permissions.

Agora adiciono a principal no Workspace, no meu caso vou colocar com privilégios de user simples.

Adicionando o srv_teste ao Workspace

vamos parar a criação só pra eu mostrar a diferença da criação de um Token PAF para a criação de um Token com Service Principal

Criação de token PAF

A criação do Token pra usuário, caso você que logue no Workspace e quer criar um token (pra acesso de um PowerBI via SQL Warehouse por exemplo), primeiro você precisa ter privilégios para a criação do Token dados por admin, coisa pra outro artigo, mas é bem simples.

Vamos supor que você tem esse privilégio, o caminho é o do gif abaixo:

Clica na lateral > Settings > Developer > Access Token

Simples assim, mas no caso de Service principals o rolê é diferente.

Criando Token de Service Principal

O Token de service principal não é criado via UI, mas nessas versões mais novas de Databricks eu preciso criar uma secret OAUTH 2, que será necessária pra que eu rode o comando via API (sim ele é gerado via API e não via interface).

Vamos naquela mesma tela de service principal, que pode ser tanto do Unity Catalog (Administrativo) como do Workspace (Admin do Workspace), para gerar, se liga no gif abaixo (nesse caso vou gerar pelo workspace):

Gerando um secret pro service principal

Anotei o client ID e o Secret pois vamos precisar dos 2 para o próximo passo

Criando o Token via API

Agora que temos um client id e um secret, vou explicar uma coisa antes. Eu tenho como gerar tokens de 2 niveis:

  • Token nível Administrativo: Quando crio esse client id e o secret lá pelo Unity Catalog, voltado para tarefas num ambito completamente administrativo com acesso aos workspaces.
  • Token nível Workspace: Respectivamente quanfo crio o client id e o secret no Workspace, todo seu poder fica restrito ao Workspace criado, igual criamos agora.

O comando muda de acordo com o nível, no caso do administrativo uso uma url voltada para o Unity catalog para o outro caso uma url voltada para o Workspace.

Criando Token para o Workspace

Via CURL em um prompt de comando você vai editar o comando abaixo conforme as suas chaves e URLs

export URL_DATABRICKS_WORKSPACE = "URL_DO_WORKSPACE"
export CLIENT_ID = "CLIENT_ID_QUE_VOCE_GEROU"
export SECRET = "SECRET_QUE_VOCE_GEROU"

## Gerando um token a nivel de Workspace
curl --request POST \
--url $URL_DATABRICKS_WORKSPACE/oidc/v1/token \
--user "$CLIENT_ID:$SECRET" \
--data 'grant_type=client_credentials&scope=all-apis'

Criando Token para o Account

Para esse caso você vai precisar do ACCOUNT_ID também que você vai pegar lá no Unity Catalog.

export URL_UNITY = "URL_DO_UNITY_CATALOG" ## No meu caso https://accounts.azuredatabricks.net
export CLIENT_ID = "CLIENT_ID_QUE_VOCE_GEROU"
export SECRET = "SECRET_QUE_VOCE_GEROU"
export ACCOUNT_ID = "PEGAR_ACCOUNT_ID_NO_UNITY"

## Gerando um token a nivel de Workspace
## Gerando um token no nivel de account
curl --request POST \
--url $URL_UNITY/oidc/accounts/$ACCOUNT_ID/v1/token \
--user "$CLIENT_ID:$SECRET" \
--data 'grant_type=client_credentials&scope=all-apis'

Ambos os comandos gerarão uma saída assim:’

{"access_token":"eyJraWQiOiIyMDdhN2JlMDhmMjBjNDBkNmUwZmU2ZWY3MzY5YTgxNjMxYjFlNDliMTg1M2VlNWFjMDhmM2NmNzlmZWUxNWYyIiwidHlwIjoiYXQrand0IiwiYWxnIjoiUlMyNTYifQ.eyJjbGllbnRfaWQiOiJjNTJkMmQ1ZC02NzIyLTQzMjEtODI3Ny0zMGM0MWMxN2JjN2QiLCJzY29wZSI6ImFsbC1hcGlzIiwiaXNzIjoiaHR0cHM6Ly9hZGItMzM1MDc4ODMzNDE1MzQ0NS41LmF6dXJlZGF0YWJyaWNrcy5uZXQvb2lkYyIsImF1ZCI6IjMzNTA3ODgzMzQxNTM0NDUiLCJzdWIiOiJjNTJkMmQ1ZC02NzIyLTQzMjEtODI3Ny0zMGM0MWMxN2JjN2QiLCJpYXQiOjE3MjI2MzQ5NDAsImV4cCI6MTcyMjYzODU0MCwianRpIjoiZjM0Njg4M2EtZTY2NC00YjJhLWI5OTMtYzExZjFkOWJjYWE2In0.qlF3UjBbHcMW3ghfuurA4axZh3MIyFeMwdopDkpTa6m6wqZczKw2F5BR-_SzAkzAbBn4lTnwHjk4swZbbvM2W_j5HOr9cXeB4O-5N7OUl_ulnPQD3lpherMpAew3QfjCIAs6enjoYSzBMKklxkRo0R7Vhi2JTy6MFSyUG-8p6VOs_m2INwDJ-6eqJPrmCfWZ0-s17JdcI_vkEafPV7Z15AF1cwObS9Wsh4Jvh7ms6w_pl_-G929cDKBpdjiYcXeOrOJxCpfTfr3TftPpzeUk9iiuexT9HibsVGioHu6nxQQwmv_LoexsA9go2LmK-664z5XFkLuggrVWoB7pFSZNmQ","scope":"all-apis","token_type":"Bearer","expires_in":3600}

Sendo o conteúdo de access_token o token pra esse cara.

No post de hoje era isso, ajudei quem precisa e tenho esse material como referencia.

Espero que Ajude!
Anselmo Borge

--

--

Anselmo Borges
Rescue Point

Bigdata Engineer, Cloud Architect, Nerd, Alcoholic, Brazilian Jiujitsu Black belt and hide and seek World champion.