Use as credenciais do serviço Unity Catalog para se conectar ao serviço externo cloud

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

Veja também:

Antes de começar

Antes de poder usar uma credencial de serviço para se conectar a um serviço externo cloud, 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.

    SQL não são suportados.

  • Uma credencial de serviço criada em seu metastore Unity Catalog que dá acesso ao serviço cloud.

  • 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.

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.

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.

Observação

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

import com.google.cloud.pubsub.v1.Publisher
import com.google.pubsub.v1.{ProjectTopicName, ProjectSubscriptionName, PubsubMessage}
import com.google.auth.oauth2.GoogleCredentials
import com.google.pubsub.v1.PullRequest
import com.google.pubsub.v1.PullResponse
import com.google.pubsub.v1.ReceivedMessage
import com.google.pubsub.v1.SubscriptionName
import com.google.pubsub.v1.TopicName
import com.google.pubsub.v1.PubsubMessage
import com.google.protobuf.ByteString
import scala.collection.JavaConverters._
import java.util.concurrent.TimeUnit
import com.google.api.gax.core.FixedCredentialsProvider

// 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 subscriptionId = "your-subscription"
val topicName = TopicName.of(projectId, topicId)

// Version 1: Glean AI gave me this one, not sure lambda would work
val publisher = Publisher
  .newBuilder(topicName)
  .setCredentialsProvider(() => gcpCredentials)
  .build()

// Stack overflow instead uses FixedCredentialsProvider
val publisher = Publisher
  .newBuilder(topicName)
  .setCredentialsProvider(
    FixedCredentialsProvider.create(gcpCredentials))
  .build()

try {
val data = "Oh, Hi, Mark!".getBytes("UTF-8")
val pubsubMessage = PubsubMessage.newBuilder().setData(ByteString.copyFrom(data)).build()
val messageIdFuture = publisher.publish(pubsubMessage)

Especificar uma credencial de serviço padrão para um recurso de computação

Opcionalmente, o senhor pode especificar uma credencial de serviço default para um compute cluster multifuncional ou de trabalho, 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 externo cloud. 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.

Observação

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 cluster.

    Veja gerenciar 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:

publisher = pubsub_v1.PublisherClient()

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

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

No Scala, o senhor substitui o nome da credencial do serviço por null.

val gcpCredentials = dbutils.credentials.getServiceCredentialsProvider(null).asInstanceOf[GoogleCredentials]