Amazon S3に接続

注:

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

この記事では、DatabricksからAWS S3に接続する方法を説明します。

インスタンスプロファイルを使用して S3バケットにアクセスする

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

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

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

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

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

ワークスペースに Instance プロファイルを追加すると、ユーザー、グループ、または サービス プリンシパル に、Instance プロファイルを使用してクラスターを起動する権限を付与できます。 「 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から読み込むことができます。

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ファイルシステムの設定をサポートしています。グローバルプロパティとバケット単位のプロパティを設定できます。

グローバル構成

# 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設定に加えて、次のキーを使用して各バケットを個別に構成できます。

# 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設定に次の行を追加します。

spark.hadoop.fs.s3a.requester-pays.enabled true

注:

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

Databricksからのデータの保存とアクセスのための非推奨のパターン

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

重要

  • S3Aファイルシステムはデフォルトでキャッシュを有効にし、「FileSystem.close()」でリソースを解放します。他のスレッドがキャッシュされたファイルシステムへの参照を誤って使用しないようにするには、「FileSystem.close()」を明示的に使用しないでください。

  • S3Aファイルシステムは、出力ストリームを閉じるときにディレクトリマーカーを削除しません。HADOOP-13230を含まないHadoopバージョンに基づくレガシーアプリケーションは、内部にファイルがあっても、それらを空のディレクトリと誤って解釈する可能性があります。