Pular para o conteúdo principal

Use as credenciais do serviço Unity Catalog para se conectar a um serviço de nuvem externo

Este artigo descreve como usar uma credencial de serviço em Unity Catalog para se conectar a um serviço de nuvem externo. Um objeto de credencial de serviço no Unity Catalog encapsula uma credencial de nuvem de longo prazo que fornece acesso a um serviço de nuvem externo ao qual os usuários precisam se conectar a partir do Databricks.

Veja também:

Requisitos​

Antes de poder usar uma credencial de serviço para se conectar a um serviço de nuvem externo, o senhor deve ter:

  • Um Databricks workspace que está habilitado para Unity Catalog.

  • Um recurso do compute que está no Databricks Runtime 16.2 ou acima.

    Os SQL warehouses não são suportados para o uso direto de credenciais de serviço. Consulte Usar uma credencial de serviço em um UDF do Python.

  • Uma credencial de serviço criada no metastore do Unity Catalog que dá acesso ao serviço de nuvem.

  • O privilégio ACCESS na credencial de serviço ou a propriedade da credencial de serviço.

Use uma credencial de serviço em seu código​

Esta seção fornece exemplos de uso de credenciais de serviço em um Notebook. Substitua os valores do espaço reservado. Esses exemplos não mostram necessariamente a instalação da biblioteca necessária, que depende do serviço do cliente que o senhor deseja acessar.

Somente Python e Scala são compatíveis.

Usar uma credencial de serviço em uma UDF Python​

Em UDFs, use databricks.service_credentials.getServiceCredentialsProvider() para acessar credenciais de serviço. A função dbutils.credentials.getServiceCredentialsProvider() usada em Notebooks não está disponível em contextos de execução de UDF.

Os requisitos dependem do tipo de UDF:

Tipo de UDF

Requisitos

UDF escalar do PySpark com escopo de sessão

Databricks Runtime 17.1 ou superior em compute clássico, ou uma versão de ambiente de execução de sessão de job ou notebook serverless 3 ou superior.

UDF Python do Unity Catalog em lotes

Databricks Runtime 16.3 ou superior em compute clássico; compute serverless; SQL warehouses pro e serverless. A versão 6 do ambiente não é obrigatória.

UDF Python escalar do Unity Catalog

Databricks Runtime 18.1 ou acima em compute clássico. No compute serverless e em SQL warehouses pro e serverless, defina explicitamente o environment_version do UDF como 6 ou acima. A omissão de toda a cláusula ENVIRONMENT ou a configuração de environment_version = 'None' não ativa esse recurso nesses tipos de compute. O compute clássico não requer a versão de ambiente 6.

Tipo de UDF

Requisitos

UDF escalar do PySpark com escopo de sessão

Databricks Runtime 17.1 ou superior em compute clássico, ou uma versão de ambiente de execução de sessão de job ou notebook serverless 3 ou superior.

UDF Python do Unity Catalog em lotes

Databricks Runtime 16.3 ou superior em compute clássico; compute serverless; SQL warehouses pro e serverless. A versão 6 do ambiente não é obrigatória.

UDF Python escalar do Unity Catalog

Databricks Runtime 18.1 ou acima em compute clássico. No compute serverless e em SQL warehouses pro e serverless, defina explicitamente o environment_version do UDF como 6 ou acima. A omissão de toda a cláusula ENVIRONMENT ou a configuração de environment_version = 'None' não ativa esse recurso nesses tipos de compute. O compute clássico não requer a versão de ambiente 6.

Para fazer chamadas de saída de um UDF Python do Unity Catalog escalar ou lotes em um SQL warehouse serverless, habilite a visualização pública Enable networking for isolated workloads in Serverless SQL Warehouses na página Previews do seu workspace. Os SQL warehouses Pro não exigem esta versão preliminar.

Para criar um UDF do Unity Catalog que declare uma credencial de serviço, o criador da função deve ter ACCESS na credencial. Em compute serverless, SQL warehouses pro e serverless, e compute em modo de acesso padrão, os chamadores precisam dos privilégios de função usual, incluindo EXECUTE, mas não precisam de ACCESS na credencial. Em compute com modo de acesso dedicado, os chamadores também devem ter ACCESS.

As UDFs com escopo de sessão do PySpark usam as permissões do chamador. O chamador deve ter ACCESS na credencial de serviço; em compute com modo de acesso dedicado, o chamador deve ter MANAGE.

Consulte versões do ambiente e requisitos de dependência personalizados.

Exemplo de Python​

Este exemplo usa uma credencial de serviço para fornecer acesso ao Google Pub/Sub usando o Python SDK. O exemplo não inclui a instalação do pacote que o senhor precisaria instalar no seu compute para executá-lo.

Python
from google.cloud import pubsub_v1

project_id = 'your-project'
topic_id = 'your-topic'

credentials = dbutils.credentials.getServiceCredentialsProvider(cred_name)

# Publish some messages
publisher = pubsub_v1.PublisherClient(credentials=credentials)
with publisher:
topic_path = publisher.topic_path(project_id, topic_id)
data = f"Oh, Hi, Mark!".encode('utf-8')
future = publisher.publish(topic_path, data)
print(f"Published {data} to {topic_path}")
print(f"Future result: {future.result(timeout=5)}")

# Read them out
subscriber = pubsub_v1.SubscriberClient(credentials=credentials)
with subscriber:
subscription_id = 'your-subscription'
subscription_path = subscriber.subscription_path(project_id, subscription_id)

# Print policy info
policy = subscriber.get_iam_policy(request={"resource": subscription_path})
print("\nPolicy for subscription {}:".format(subscription_path))
for binding in policy.bindings:
print("Role: {}, Members: {}".format(binding.role, binding.members))

# Retrieve messages from the subscription (up to 3 messages)
ack_ids = []
response = subscriber.pull(request={"subscription": subscription_path, "max_messages": 3})
for msg in response.received_messages:
print(f"Received: {msg.message.data.decode('utf-8')}")
ack_ids.append(msg.ack_id)

# Acknowledge receipt if there were any messages
if len(ack_ids) > 0:
subscriber.acknowledge(request={"subscription": subscription_path, "ack_ids": ack_ids})

print(f"Received {len(ack_ids)} messages from subscription {subscription_path}")

Exemplo de Scala:​

Este exemplo usa uma credencial de serviço para fornecer acesso ao Google Pub/Sub usando o Scala SDK. O exemplo não inclui a instalação da biblioteca Maven que o senhor precisaria ter no seu compute para executá-lo. Isso inclui google-oauth-client,google-auth-library-oauth2-http e google-cloud-pubsub.

nota

Para as dependências do Google Cloud SDK Maven, o senhor deve usar uma versão sombreada do Guava.

Scala
import com.google.cloud.pubsub.v1.Publisher
import com.google.pubsub.v1.TopicName
import com.google.pubsub.v1.PubsubMessage
import com.google.auth.oauth2.GoogleCredentials
import com.google.protobuf.ByteString
import com.google.api.gax.core.FixedCredentialsProvider
import java.util.concurrent.TimeUnit

// Set up credentials
val gcpCredentials = dbutils.credentials.getServiceCredentialsProvider("your-credential-name").asInstanceOf[GoogleCredentials]

// Project and topic details
val projectId = "your-project"
val topicId = "your-topic"
val topicName = TopicName.of(projectId, topicId)

// Create publisher with the service credential
val publisher = Publisher
.newBuilder(topicName)
.setCredentialsProvider(FixedCredentialsProvider.create(gcpCredentials))
.build()

try {
val data = ByteString.copyFromUtf8("Oh, Hi, Mark!")
val pubsubMessage = PubsubMessage.newBuilder().setData(data).build()
val messageIdFuture = publisher.publish(pubsubMessage)
println(s"Published message ID: ${messageIdFuture.get()}")
} finally {
publisher.shutdown()
publisher.awaitTermination(1, TimeUnit.MINUTES)
}

Especifique uma credencial de serviço default para um recurso compute.​

Opcionalmente, o senhor pode especificar uma credencial de serviço default para um clustering multifuncional ou do Job compute definindo uma variável de ambiente. Por default, o SDK usa essa credencial de serviço se nenhuma autenticação for fornecida. Os usuários ainda precisam de ACCESS nessa credencial de serviço para se conectar ao serviço de nuvem externo. A Databricks não recomenda essa abordagem, pois ela torna seu código menos portátil do que nomear a credencial de serviço em seu código.

nota

serverless compute e SQL warehouse não suportam variável de ambiente e, portanto, não suportam default serviço credentials.

  1. Abra a página de edição do clustering.

    Veja gerenciar classic compute.

  2. Clique em Advanced (Avançado ) na parte inferior da página e vá para a seção Spark tab.

  3. Adicione a seguinte entrada em variável de ambiente , substituindo <your-service-credential>:

    DATABRICKS_DEFAULT_SERVICE_CREDENTIAL_NAME=<your-service-credential>

Os exemplos de código a seguir não especificam uma credencial de serviço. Em vez disso, eles usam a credencial de serviço especificada na variável de ambiente DATABRICKS_DEFAULT_SERVICE_CREDENTIAL_NAME:

Se o senhor estiver usando uma credencial de serviço default, não precisará especificar as credenciais como um argumento:

Python
publisher = pubsub_v1.PublisherClient()

Compare isso com o exemplo em Python example, que não importa DefaultAzureCredential e adiciona a especificação da credencial:

Python
credentials = dbutils.credentials.getServiceCredentialsProvider(cred_name)
publisher = pubsub_v1.PublisherClient(credentials=credentials)