Unity Catalog サービスの資格情報を使用して外部クラウド サービスに接続する

この記事では、 Unity Catalog でサービス資格情報を使用して外部クラウド サービスに接続する方法について説明します。 Unity Catalog のサービス資格情報オブジェクトは、ユーザーが Databricks から接続する必要がある外部クラウド サービスへのアクセスを提供する長期的なクラウド資格情報をカプセル化します。

関連項目は次を参照してください。

始める前に

サービス資格情報を使用して外部クラウド サービスに接続するには、次のものが必要です。

  • Unity Catalog に対して有効になっている Databricks ワークスペース。

  • Databricks Runtime 16.2 以降にあるコンピュート リソース。

    SQLウェアハウスはサポートされていません。

  • Unity Catalog メタストアで作成された、クラウド サービスへのアクセスを許可するサービス資格情報。

  • サービス資格情報に対する ACCESS 権限またはサービス資格情報の所有権。

コードでサービス資格情報を使用する

このセクションでは、ノートブックでサービス資格情報を使用する例を示します。 プレースホルダー値を置き換える。 これらの例は、アクセスするクライアントサービスに依存する必要なライブラリのインストールを必ずしも示しているわけではありません。

Python の例

この例では、サービス認証情報を使用して、Python SDK を使用して Google Pub/Sub へのアクセスを提供します。 この例には、コンピュートを実行するためにコンピュートにインストールする必要があるパッケージのインストールは含まれていません。

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}")

Scalaの例:

この例では、サービス認証情報を使用して、Scala SDK を使用して Google Pub/Sub へのアクセスを提供します。 この例には、コンピュートで実行するために必要な Maven ライブラリのインストールは含まれていません。 これには、 google-oauth-clientgoogle-auth-library-oauth2-http、および google-cloud-pubsubが含まれます。

注:

Google Cloud SDK Maven の依存関係の場合は、影付きのバージョンの 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)

コンピュート リソースのデフォルト サービス資格情報を指定します

オプションで、環境変数を設定することで、all-purpose クラスターまたはジョブ コンピュート クラスターのデフォルト サービス資格情報を指定できます。 デフォルトでは、認証が提供されていない場合、SDK はそのサービス資格情報を使用します。 ユーザーは、外部クラウド サービスに接続するために、そのサービス資格情報に ACCESS する必要があります。 Databricks では、コードでサービス資格情報に名前を付けるよりもコードの移植性が低くなるため、このアプローチはお勧めしません。

注:

サーバレス コンピュート と SQLウェアハウスは環境変数をサポートしていないため、デフォルト サービスの資格情報をサポートしていません。

  1. クラスターの編集ページを開きます。

    「コンピュートの管理」を参照してください。

  2. ページの下部にある [詳細設定 ] をクリックし、[ Spark ] タブに移動します。

  3. [環境変数] に次のエントリを追加し、<your-service-credential>を置き換えます。

    DATABRICKS_DEFAULT_SERVICE_CREDENTIAL_NAME=<your-service-credential>

次のコード サンプルでは、サービス資格情報は指定されていません。 代わりに、 DATABRICKS_DEFAULT_SERVICE_CREDENTIAL_NAME 環境変数で指定されたサービス資格情報を使用します。

デフォルトのサービス資格情報を使用している場合は、引数として資格情報を指定する必要はありません。

publisher = pubsub_v1.PublisherClient()

これを、DefaultAzureCredential をインポートせず、資格情報の指定を追加する Python の例と比較します。

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

Scala の場合は、サービス資格情報の名前を nullに置き換えます。

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