Unity Catalog サービスの資格情報を使用して外部クラウド サービスに接続する
この記事では、 Unity Catalog でサービス資格情報を使用して外部クラウド サービスに接続する方法について説明します。 Unity Catalog のサービス資格情報オブジェクトは、ユーザーが Databricks から接続する必要がある外部クラウド サービスへのアクセスを提供する長期的なクラウド資格情報をカプセル化します。
関連項目は次を参照してください。
要件
サービス資格情報を使用して外部クラウド サービスに接続するには、次のものが必要です。
-
Unity Catalog に対して有効になっている Databricks ワークスペース。
-
Databricks Runtime 16.2 以降にあるコンピュート リソース。
SQLウェアハウスでは、サービス認証情報を直接使用することはサポートされていません。Python UDF でのサービス認証情報の使用を参照してください。
-
Unity Catalog メタストアで作成された、クラウド サービスへのアクセスを許可するサービス資格情報。
-
サービス資格情報に対する
ACCESS権限またはサービス資格情報の所有権。
コードでサービス資格情報を使用する
このセクションでは、ノートブックでサービス資格情報を使用する例を示します。プレースホルダー値を置き換える。これらの例は、アクセスするクライアントサービスに依存する必要なライブラリのインストールを必ずしも示しているわけではありません。
PythonとScalaのみがサポートされています。
Python UDF でのサービス認証情報の使用
UDFでサービス資格情報にアクセスするには、 databricks.service_credentials.getServiceCredentialsProvider() を使用します。ノートブックで使用される dbutils.credentials.getServiceCredentialsProvider() 関数は、UDF実行コンテキストでは使用できません。
要件は UDF の種類によって異なります:
UDF の種類 | 要件 |
|---|---|
クラシック コンピュート上の Databricks Runtime 17.1 以降、または環境バージョン 3 以降を実行しているServerless ノートブックまたはジョブ セッション実行環境。 | |
クラシックコンピュート上の Databricks Runtime 16.3 以降、Serverless コンピュート、Pro および Serverless SQL Warehouse。環境バージョン 6 は必要ありません。 | |
クラシックコンピュート上の Databricks Runtime 18.1 以降。サーバーレスコンピュート、ならびにProおよびServerless SQL Warehouseでは、UDFの |
サーバーレス SQL Warehouse 上のスカラーまたはバッチ Unity Catalog Python UDF からアウトバウンド呼び出しを行うには、ワークスペースのプレビューページ で Enable networking for isolated workloads in Serverless SQL Warehouses Public Preview を有効にします。Pro SQL ウェアハウスではこのプレビューは必要ありません。
サービス資格情報を宣言する Unity Catalog UDF を作成するには、関数作成者が資格情報に対する ACCESS を持っている必要があります。サーバレス コンピュート、Pro および Serverless SQLウェアハウス、標準アクセスモード コンピュートでは、呼び出し元に EXECUTE を含む通常の関数権限が必要ですが、資格情報に対する ACCESS は必要ありません。専用アクセスモード コンピュートでは、呼び出し元が ACCESS も持っている必要があります。
PySpark セッションスコープの UDF は、呼び出し元のアクセス許可を使用します。呼び出し元は、サービス資格情報に対する ACCESS を持っている必要があります。専用アクセス モードのコンピュートでは、呼び出し元が MANAGE を持っている必要があります。
環境バージョンおよびカスタム依存関係の要件を参照してください。
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-client、google-auth-library-oauth2-http、および google-cloud-pubsubが含まれます。
Google Cloud SDK Maven の依存関係の場合は、影付きのバージョンの 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)
}
コンピュート リソースのデフォルト サービス資格情報を指定する
オプションで、環境変数を設定することで、汎用 または ジョブ コンピュート クラスターのデフォルト サービス認証情報を指定できます。 デフォルトでは、認証が提供されていない場合、SDK はそのサービス資格情報を使用します。 ユーザーは、外部クラウド サービスに接続するために、そのサービス資格情報に ACCESS する必要があります。 Databricks では、コードでサービス資格情報に名前を付けるよりもコードの移植性が低くなるため、このアプローチはお勧めしません。
サーバレス コンピュート と SQLウェアハウスは環境変数をサポートしていないため、デフォルト サービスの資格情報をサポートしていません。
-
クラスターの編集ページを開きます。
クラシックコンピュートの管理を参照してください。
-
ページの下部にある [詳細設定 ] をクリックし、[ Spark ] タブに移動します。
-
[環境変数 ] に次のエントリを追加し、
<your-service-credential>を置き換えます。DATABRICKS_DEFAULT_SERVICE_CREDENTIAL_NAME=<your-service-credential>
次のコード サンプルでは、サービス資格情報は指定されていません。 代わりに、 DATABRICKS_DEFAULT_SERVICE_CREDENTIAL_NAME 環境変数で指定されたサービス資格情報を使用します。
- Python
- Scala
デフォルトのサービス資格情報を使用している場合は、引数として資格情報を指定する必要はありません。
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]