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:

Antes de começar

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.

    SQL não são suportados.

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

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.{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)

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

If you are using a default service credential, you don’t need to specify credentials as an argument:

Python
publisher = pubsub_v1.PublisherClient()

Compare this to the example in Python example, which does not import DefaultAzureCredential and adds the credential specification:

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