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:
- Gerenciar o acesso ao serviço de nuvem externo usando credenciais de serviço.
- serviço gerenciado de credenciamento
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.
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
.
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)
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.
serverless compute e SQL warehouse não suportam variável de ambiente e, portanto, não suportam default serviço credentials.
-
Abra a página de edição do clustering.
Veja gerenciar compute.
-
Clique em Advanced (Avançado ) na parte inferior da página e vá para a seção Spark tab.
-
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
:
- Python
- Scala
If you are using a default service credential, you don’t need to specify credentials as an argument:
publisher = pubsub_v1.PublisherClient()
Compare this to the example in Python example, which does not import DefaultAzureCredential
and adds the credential specification:
credentials = dbutils.credentials.getServiceCredentialsProvider(cred_name)
publisher = pubsub_v1.PublisherClient(credentials=credentials)
For Scala, you replace the service credential name with null
.
val gcpCredentials = dbutils.credentials.getServiceCredentialsProvider(null).asInstanceOf[GoogleCredentials]