メインコンテンツまでスキップ

Databricks でのクラウドオブジェクトストレージのマウント

important

マウントは、従来のアクセス パターンです。 Databricks では、すべてのデータ アクセスの管理に Unity Catalog を使用することをお勧めします。 「Unity Catalog を使用してクラウド オブジェクト ストレージとサービスに接続する」を参照してください。

Databricksを使用すると、ユーザーはクラウドオブジェクトストレージをDatabricksファイルシステム(DBFS)にマウントできます。これにより、クラウドの概念に慣れていないユーザーにとってもデータアクセスパターンが簡単なものになります。マウントされたデータはUnity Catalogでは機能しないため、Databricksではマウントの使用から移行し、代わりにUnity Catalogを使用してデータガバナンスを管理することをお勧めします。

Databricks はクラウドオブジェクトストレージをどのようにマウントしますか?

Databricks マウントは、ワークスペースとクラウドオブジェクトストレージの間にリンクを作成します。これにより、Databricks ファイル システムを基準としたわかりやすいファイル パスを使用して、クラウドオブジェクトストレージを操作できるようになります。マウントは、/mnt ディレクトリの下に、次の情報が格納されたローカルエイリアスを作成することによって機能します。

  • クラウドオブジェクトストレージの場所。
  • ストレージアカウントまたはコンテナーに接続するためのドライバー仕様。
  • データにアクセスするために必要なセキュリティ資格情報。

ストレージをマウントするための構文は何ですか?

sourceは、オブジェクトストレージの URI を指定します(オプションでセキュリティ資格情報をエンコードすることもできます)。mount_pointは、/mntディレクトリのローカルパスを指定します。一部のオブジェクトストレージソースは、オプションのencryption_type引数をサポートしています。一部のアクセスパターンでは、追加の構成仕様を辞書としてextra_configsに渡すことができます。

注記

Databricksでは、extra_configs を使用してマウント固有のSparkとHadoopの設定をオプションとして設定することを推奨しています。これにより、設定がクラスターやセッションではなくマウントに関連付けられます。

Python
dbutils.fs.mount(
source: str,
mount_point: str,
encryption_type: Optional[str] = "",
extra_configs: Optional[dict[str:str]] = None
)

設定が不適切な場合、ワークスペース内のすべてのユーザーに提供されるアクセスが安全でなくなる可能性があるため、データマウントの設定や変更の前に、ワークスペースおよびクラウドの管理者に確認してください。

注記

この記事で説明する方法に加えて、 Databricks Terraform プロバイダーdatabricks_mount を使用してバケットのマウントを自動化できます。

マウントポイントのアンマウント

マウントポイントをアンマウントするには、次のコマンドを使用します。

Python
dbutils.fs.unmount("/mnt/<mount-name>")
警告

エラーを回避するには、他のジョブがマウント・ポイントを読み取ったり書き込んだりしている間は、マウント・ポイントを変更しないでください。 マウントを変更した後は、常に他のすべての稼働中のクラスターで dbutils.fs.refreshMounts() を実行して、マウントの更新を伝搬します。 refreshMounts コマンド (dbutils.fs.refreshMounts)を参照してください。

S3 バケットの取り付け

S3 バケットは、 DBFS とはを使用してマウントできます。 マウントは S3 の場所へのポインターであるため、データがローカルで同期されることはありません。

クラスターからマウントポイントが作成されると、そのクラスターのユーザーはすぐにそのマウントポイントにアクセスできます。稼働中の別のクラスターでマウントポイントを使用するには、その稼働中のクラスターで dbutils.fs.refreshMounts() を実行して、新しく作成したマウントポイントを使用できるようにする必要があります。

S3 バケットをマウントする方法として、次のようなものがあります。

AWS インスタンスプロファイルを使用したバケットのマウント

AWS インスタンスプロファイルを使用して、S3 バケットの認証と承認を管理できます。 バケット内のオブジェクトへのアクセスは、インスタンスプロファイルに付与されたアクセス許可によって決まります。 ロールに書き込みアクセス権がある場合、マウントポイントのユーザーはバケットにオブジェクトを書き込むことができます。 ロールに読み取りアクセス権がある場合、マウントポイントのユーザーはバケット内のオブジェクトを読み取ることができます。

  1. インスタンスプロファイルを使用してクラスターを設定します。

  2. バケットをマウントします。

Python
aws_bucket_name = "<aws-bucket-name>"
mount_name = "<mount-name>"
dbutils.fs.mount(f"s3a://{aws_bucket_name}", f"/mnt/{mount_name}")
display(dbutils.fs.ls(f"/mnt/{mount_name}"))

AWS キーを使用してバケットをマウントする

AWSキーを使用してバケットをマウントできます。

important

キーを使用してS3バケットをマウントすると、 すべてのユーザー に、S3バケット内の すべてのオブジェクト への読み取りと書き込みのアクセス権が付与されます。

次の例では、Databricks シークレット を使用してキーを格納します。 シークレットキーを URLエスケープする必要があります

Python
access_key = dbutils.secrets.get(scope = "aws", key = "aws-access-key")
secret_key = dbutils.secrets.get(scope = "aws", key = "aws-secret-key")
encoded_secret_key = secret_key.replace("/", "%2F")
aws_bucket_name = "<aws-bucket-name>"
mount_name = "<mount-name>"

dbutils.fs.mount(f"s3a://{access_key}:{encoded_secret_key}@{aws_bucket_name}", f"/mnt/{mount_name}")
display(dbutils.fs.ls(f"/mnt/{mount_name}"))

AssumeRoleポリシーでインスタンスプロファイルを使用してバケットをマウントする

まず、 AssumeRole ポリシーを使用して Access クロスアカウント S3 バケットを設定する必要があります。

extraConfigsでS3オプションを設定しながらバケットをマウントします。

Python
dbutils.fs.mount("s3a://<s3-bucket-name>", "/mnt/<s3-bucket-name>",
extra_configs = {
"fs.s3a.credentialsType": "AssumeRole",
"fs.s3a.stsAssumeRole.arn": "arn:aws:iam::<bucket-owner-acct-id>:role/MyRoleB",
"fs.s3a.canned.acl": "BucketOwnerFullControl",
"fs.s3a.acl.default": "BucketOwnerFullControl"
}
)

S3バケット内のデータを暗号化する

Databricksは、サーバー側の暗号化を使用したデータの暗号化をサポートしています。このセクションでは、DBFS経由でS3にファイルを書き込むときにサーバー側の暗号化を使用する方法について説明します。Databricksは、Amazon S3で管理される暗号化キー(SSE-S3)AWS KMSで管理される暗号化キー(SSE-KMS)をサポートしています。

SSE-S3を使ってファイルを書き込む

  1. SSE-S3を使用してS3バケットをマウントするには、次のコマンドを実行します。

    Scala
    dbutils.fs.mount(s"s3a://$AccessKey:$SecretKey@$AwsBucketName", s"/mnt/$MountName", "sse-s3")
  2. SSE-S3を使用して対応するS3バケットにファイルを書き込むには、次のコマンドを実行します。

    Scala
    dbutils.fs.put(s"/mnt/$MountName", "<file content>")

SSE-KMSを使用してファイルを書き込む

  1. 暗号化タイプとしてsse-kmsまたはsse-kms:$KmsKeyを渡し、ソースディレクトリをマウントします。

    • デフォルトのKMSマスターキーを使用してSSE-KMSでS3バケットをマウントするには、次のコマンドを実行します。

      Scala
      dbutils.fs.mount(s"s3a://$AccessKey:$SecretKey@$AwsBucketName", s"/mnt/$MountName", "sse-kms")
    • 特定のKMSキーを使用してSSE-KMSでS3バケットをマウントするには、次のコマンドを実行します。

      Scala
      dbutils.fs.mount(s"s3a://$AccessKey:$SecretKey@$AwsBucketName", s"/mnt/$MountName", "sse-kms:$KmsKey")
  2. SSE-KMS を使用して S3 バケットにファイルを書き込むには、次のコマンドを実行します。

    Scala
    dbutils.fs.put(s"/mnt/$MountName", "<file content>")

Databricks コミットサービスを使用した S3 バケットのマウント

S3に格納された特定のテーブルに、複数のクラスターまたはワークロードから同時に書き込む予定の場合は、DatabricksDatabricks S3 コミット サービスを構成することをお勧めします。ノートブック・コードでは、バケットをマウントし、 AssumeRole 構成を追加する必要があります。 この手順は、DBFS DBFSマウントにのみ必要であり、ワークスペースのルートS3 バケット内の ルート ストレージにアクセスする必要はありません。次の例では Python を使用しています。

Python

# If other code has already mounted the bucket without using the new role, unmount it first
dbutils.fs.unmount("/mnt/<mount-name>")

# mount the bucket and assume the new role
dbutils.fs.mount("s3a://<bucket-name>/", "/mnt/<mount-name>", extra_configs = {
"fs.s3a.credentialsType": "AssumeRole",
"fs.s3a.stsAssumeRole.arn": "<role-arn>"
})

ABFS を使用した ADLS または Blob Storage のマウント

認証に Entra ID Azureアプリケーション サービスプリンシパルを使用して、 ストレージ アカウントにデータをマウントできます。Microsoft詳細については、「 サービスプリンシパル & Microsoft Entra ID(Azure Active Directory) を使用したストレージへのアクセス」を参照してください。

important
  • Databricks ワークスペース内のすべてのユーザーは、マウントされた ADLS アカウントにアクセスできます。ADLSアカウントへのアクセスに使用するサービスプリンシパルは、そのADLSアカウントにのみアクセス権を付与する必要があります。他のAzureリソースへのアクセスを許可しないでください。
  • クラスターを介してマウントポイントを作成すると、クラスターユーザーはすぐにそのマウントポイントにアクセスできます。実行中の別のクラスターでマウントポイントを使用するには、その実行中のクラスターでdbutils.fs.refreshMounts()を実行して、新しく作成したマウントポイントを使用できるようにする必要があります。
  • ジョブの実行中にマウントポイントをアンマウントすると、エラーが発生する可能性があります。本番運用ジョブが処理の一環としてストレージをアンマウントしないことを確認してください。
  • シークレットを使用するマウントポイントは自動的には更新されません。マウントされたストレージが、ローテーション、期限切れ、または削除されたシークレットに依存している場合、401 Unauthorized などのエラーが発生する可能性があります。 このようなエラーを解決するには、ストレージをアンマウントして再マウントする必要があります。
  • ABFS エンドポイントを使用して Azure データレイク Storage ストレージ アカウントを正常にマウントするには、階層型名前空間 (HNS) を有効にする必要があります。

ノートブックで以下を実行して認証し、マウントポイントを作成します。

Python
configs = {"fs.azure.account.auth.type": "OAuth",
"fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
"fs.azure.account.oauth2.client.id": "<application-id>",
"fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
"fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<directory-id>/oauth2/token"}

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
mount_point = "/mnt/<mount-name>",
extra_configs = configs)
Scala
val configs = Map(
"fs.azure.account.auth.type" -> "OAuth",
"fs.azure.account.oauth.provider.type" -> "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
"fs.azure.account.oauth2.client.id" -> "<application-id>",
"fs.azure.account.oauth2.client.secret" -> dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
"fs.azure.account.oauth2.client.endpoint" -> "https://login.microsoftonline.com/<directory-id>/oauth2/token")
// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
mountPoint = "/mnt/<mount-name>",
extraConfigs = configs)

置き換え

  • <application-id> を、Azure Active Directoryアプリケーションの アプリケーション (クライアント) ID に置き換えます。
  • <scope-name> をDatabricksシークレットスコープ名に置き換えます。
  • <service-credential-key-name> をクライアントシークレットを含むキーの名前に置き換えます。
  • <directory-id> を、Azure Active Directoryアプリケーションの ディレクトリ (テナント) ID に置き換えます。
  • <container-name> を ADLS ストレージ アカウント内のコンテナーの名前に置き換えます。
  • <storage-account-name> を ADLS ストレージ アカウント名に置き換えます。
  • <mount-name> を、DBFS 内の目的のマウントポイントの名前に置き換えます。