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

Amazon S3 への接続

注記

この記事では、S3 へのアクセスを設定するための従来のパターンについて説明します。Databricks では、Unity Catalog を使用して S3 とボリュームへのアクセスを構成し、ファイルを直接操作することをお勧めします。 「Unity Catalog を使用してクラウド オブジェクト ストレージとサービスに接続する」を参照してください。

この記事では、Databricks から Amazon S3 (S3) に接続する方法について説明します。

インスタンスプロファイルを使用した S3 バケットへのアクセス

IAMロールをインスタンスプロファイルとしてDatabricksにロードし、インスタンスプロファイルをクラスターにアタッチして、S3へのデータアクセスを制御できます。Databricks は、環境やワークロードでUnity Catalogが利用できない場合は、インスタンスプロファイルを使用することをお勧めします。Databricksでインスタンスプロファイルを使用するチュートリアルについては、「チュートリアル: インスタンスプロファイルを使用してS3アクセスを設定する」を参照してください。

IAMロールを作成するAWSユーザーは、次の要件を満たしている必要があります。

  • IAMロール、IAMポリシー、S3バケット、およびクロスアカウントの信頼関係を作成または更新する権限を持つAWSアカウントユーザーであること。

IAMロールをDatabricksのインスタンスプロファイルとして追加するDatabricksユーザーは、次の要件を満たしている必要があります。

  • ワークスペース管理者である

インスタンスプロファイルをワークスペースに追加すると、ユーザー、グループ、またはサービスプリンシパルに、インスタンスプロファイルを使用してクラスターを起動する権限を付与できます。 「Databricksのインスタンスプロファイルの管理」を参照してください。

クラスターアクセス制御とノートブックアクセス制御の両方を一緒に使用して、インスタンスプロファイルへのアクセスを保護します。 コンピュートの権限Databricksノートブックを使用した共同作業を参照してください。

URI と AWS キーを使用した S3 バケットへのアクセス

Spark プロパティを設定して、S3 にアクセスするための AWS キーを設定できます。

Databricks では、すべての資格情報の保存にシークレットスコープを使用することをお勧めします。 ワークスペース内のユーザー、サービスプリンシパル、およびグループに、シークレットスコープを読み取るためのアクセス権を付与できます。 これにより、AWS キーが保護され、ユーザーは S3 にアクセスできます。 シークレットスコープを作成するには、「 シークレットスコープの管理」を参照してください。

資格情報のスコープは、クラスターまたはノートブックのいずれかに設定できます。 クラスター アクセス制御とノートブック アクセス制御の両方を一緒に使用して、S3へのアクセスを保護します。コンピュートの権限Databricksノートブックを使用した共同作業を参照してください。

Sparkプロパティを設定するには、クラスターのSpark設定で次のスニペットを使用して、シークレットスコープに保存されているAWSキーを環境変数として設定します。

AWS_SECRET_ACCESS_KEY={{secrets/scope/aws_secret_access_key}}
AWS_ACCESS_KEY_ID={{secrets/scope/aws_access_key_id}}

その後、次のコマンドを使用してS3から読み込むことができます。

Python
aws_bucket_name = "my-s3-bucket"

df = spark.read.load(f"s3a://{aws_bucket_name}/flowers/delta/")
display(df)
dbutils.fs.ls(f"s3a://{aws_bucket_name}/")

オープンソースのHadoopオプションでS3にアクセス

Databricks Runtimeは、オープンソースのHadoopオプションを使用したS3Aファイルシステムの設定をサポートしています。グローバルプロパティとバケット単位のプロパティを設定できます。

グローバル設定

ini
# Global S3 configuration
spark.hadoop.fs.s3a.aws.credentials.provider <aws-credentials-provider-class>
spark.hadoop.fs.s3a.endpoint <aws-endpoint>
spark.hadoop.fs.s3a.server-side-encryption-algorithm SSE-KMS

バケットごとの設定

バケットごとのプロパティを設定するには、構文 spark.hadoop.fs.s3a.bucket.<bucket-name>.<configuration-key>を使用します。これにより、異なる資格情報やエンドポイントなどを使用してバケットを設定できます。

たとえば、グローバルS3設定に加えて、次のキーを使用して各バケットを個別に構成できます。

ini
# Set up authentication and endpoint for a specific bucket
spark.hadoop.fs.s3a.bucket.<bucket-name>.aws.credentials.provider <aws-credentials-provider-class>
spark.hadoop.fs.s3a.bucket.<bucket-name>.endpoint <aws-endpoint>

# Configure a different KMS encryption key for a specific bucket
spark.hadoop.fs.s3a.bucket.<bucket-name>.server-side-encryption.key <aws-kms-encryption-key>

リクエスターの支払バケットへのアクセス

Requester Paysバケットへのアクセスを有効にするには、クラスターのSpark設定に次の行を追加します。

ini
spark.hadoop.fs.s3a.requester-pays.enabled true
注記

Databricks は、Requester Pays バケットへの Delta Lake の書き込みをサポートしていません。

Databricks からのデータの保存とアクセスに関する非推奨のパターン

非推奨のストレージパターンを次に示します。

important
  • S3Aファイルシステムはデフォルトでキャッシュを有効にし、「FileSystem.close()」でリソースを解放します。他のスレッドがキャッシュされたファイルシステムへの参照を誤って使用しないようにするには、「FileSystem.close()」を明示的に使用しないでください。
  • S3Aファイルシステムは、出力ストリームを閉じるときにディレクトリマーカーを削除しません。HADOOP-13230を含まないHadoopバージョンに基づくレガシーアプリケーションは、内部にファイルがあっても、それらを空のディレクトリと誤って解釈する可能性があります。