Utilisez les identifiants de service Unity Catalog pour vous connecter aux services cloud externes.
Cet article décrit comment utiliser des informations d’identification de service dans Unity Catalog pour se connecter à des services cloud externes. Un objet d’informations d’identification de service dans Unity Catalog encapsule une information d’identification cloud à long terme qui donne accès à un service cloud externe que les utilisateurs doivent connecter à partir de Databricks.
Voir aussi :
Avant de commencer
Avant de pouvoir utiliser un identifiant de service pour vous connecter à un service cloud externe, vous devez avoir :
-
Un workspace Databricks activé pour Unity Catalog.
-
Une ressource de compute qui est sur Databricks Runtime 16.2 ou une version ultérieure.
Les SQL Warehouse ne sont pas pris en charge.
-
Un identifiant de service créé dans votre métastore Unity Catalog qui donne accès au service cloud.
-
Le privilège
ACCESSsur l’identifiant de service ou la propriété de l’identifiant de service.
Utilisez un identifiant de service dans votre code
Cette section fournit des exemples d'utilisation des informations d'identification de service dans un Notebook. Remplacez les valeurs d'espace réservé. Ces exemples ne montrent pas nécessairement l'installation des bibliothèques requises, qui dépendent du service client auquel vous souhaitez accéder. Seuls Python et Scala sont pris en charge.
API spécifique aux UDF pour les identifiants de service :
Dans les UDF, utilisez databricks.service_credentials.getServiceCredentialsProvider() pour accéder aux identifiants de service.
Cela diffère de la fonction dbutils.credentials.getServiceCredentialsProvider() utilisée dans les notebooks, qui n'est pas disponible dans les contextes d'exécution UDF.
- Informations d’identification du service dans les UDF Python scalaires pour les UDF Python scalaires
- Informations d'identification du service dans les UDF Python du Unity Catalog en mode Batch pour les UDF Python Batch
Exemple Python
Cet exemple utilise un identifiant de service pour fournir l'accès à Google Pub/Sub à l'aide du SDK Python. L'exemple n'inclut pas l'installation des packages que vous auriez besoin d'installer sur votre compute pour l'exécuter.
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}")
Exemple Scala :
Cet exemple utilise un identifiant de service pour fournir l'accès à Google Pub/Sub à l'aide du SDK Scala. L'exemple n'inclut pas l'installation des bibliothèques Maven dont vous auriez besoin sur votre compute pour l'exécuter. Ceci inclut google-oauth-client,google-auth-library-oauth2-http et google-cloud-pubsub.
Pour les dépendances Maven du SDK Google Cloud, vous devez utiliser une version ombrée de Guava.
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)
}
Spécifiez un identifiant de service par default pour une ressource compute
Vous pouvez éventuellement spécifier une authentification de service par default pour un cluster de calcul multifonction ou de Jobs en définissant une variable d’environnement. Par défaut, le SDK utilise ces informations d'identification de service si aucune authentification n'est fournie. Les utilisateurs ont toujours besoin de ACCESS sur cet identifiant de service pour se connecter au service cloud externe. Databricks ne recommande pas cette approche, car elle rend votre code moins portable que le fait de nommer l'identifiant de service dans votre code.
Les compute Serverless et les SQL Warehouse ne prennent pas en charge les variables d'environnement et, par conséquent, ils ne prennent pas en charge les informations d'identification de service par default.
-
Ouvrez la page de modification du cluster.
Consultez Gérer le compute classique.
-
Cliquez sur **Avancé** en bas de la page et accédez à l'onglet **Spark**.
-
Ajoutez l’entrée suivante dans les **Variables d’environnement**, en remplaçant
<your-service-credential>:DATABRICKS_DEFAULT_SERVICE_CREDENTIAL_NAME=<your-service-credential>
Les exemples de code suivants ne spécifient pas d'identifiant de service. Au lieu de cela, ils utilisent l'identifiant de service spécifié dans la variable d'environnement DATABRICKS_DEFAULT_SERVICE_CREDENTIAL_NAME :
- Python
- Scala
Si vous utilisez un identifiant de service default, vous n'avez pas besoin de spécifier les identifiants en tant qu'argument :
publisher = pubsub_v1.PublisherClient()
Comparez ceci à l'exemple dans exemple Python, qui n'importe pas DefaultAzureCredential et ajoute la spécification des informations d'identification :
credentials = dbutils.credentials.getServiceCredentialsProvider(cred_name)
publisher = pubsub_v1.PublisherClient(credentials=credentials)
Pour Scala, vous remplacez le nom de l'identifiant de service par null.
val gcpCredentials = dbutils.credentials.getServiceCredentialsProvider(null).asInstanceOf[GoogleCredentials]