Databricks S3 コミット サービス関連の設定を構成する
Databricks 複数のクラスターから Amazon S3 への書き込みを調整するコミット サービスを実行します。 このサービスは、Databricks コントロール プレーンで実行されます。セキュリティを強化するために、「 直接アップロードの最適化を無効にする」で説明されているように、サービスの直接アップロードの最適化を無効にすることができます。S3 バケットへのアクセスをさらに制限するには、「 特定の IP アドレスへのアクセスを制限する」を参照してください。
S3 コミットサービスに関連する AWS GuardDuty アラートを受け取った場合は、「 S3 コミットサービスに関連する AWS GuardDuty アラート」を参照してください。
コミットサービスについて
S3 コミット サービスは、特定のケースで 1 つのテーブルに対する複数のクラスター間で書き込みの一貫性を保証するのに役立ちます。たとえば、コミット サービスはDelta LakeがACID トランザクションを実装するのに役立ちます。
デフォルトの設定では、Databricks AWSはコンピュート プレーンからコミット サービス コールのコントロール プレーンに一時的なAPI 認証情報を送信します。インスタンスプロファイルの認証情報は 6 時間有効です。
コンピュート プレーンはデータを直接 S3に書き込み、コントロール プレーンの S3 コミット サービスは、コミット ログのアップロードを完了する (以下で説明するマルチパート アップロードを完了する) ことで同時実行制御を提供します。 コミットサービスは S3 からデータを読み取らない。 新しいファイルが存在しない場合は、S3 に新しいファイルを配置します。
Databricks コミット サービスによって S3 に書き込まれる最も一般的なデータは Delta ログであり、列の最小値や最大値など、データからの統計集計が含まれています。ほとんどの Delta ログデータは、Amazon S3 マルチパートアップロード を使用してコントロールプレーン から S3 に送信されます。
クラスターによってマルチパート データがステージングされ、Delta ログがS3 に書き込まれた後、Databricksコントロール プレーンのS3コミット サービスは、S3マルチパート アップロードが完了したことをS3に知らせることで、 マルチパートアップロードを完了します。非常に小さな更新のパフォーマンス最適化として、デフォルトでは、コミットサービスは小さな更新をコントロールプレーンから直接 S3 にプッシュすることがあります。 この直接更新の最適化は無効にすることができます。 直接アップロードの最適化を無効にするを参照してください。
Delta Lakeに加え、次のDatabricks機能も同じS3コミットサービスを使用します。
コミットサービスが必要なのは、Amazon では、オブジェクトがまだ存在しない場合にのみオブジェクトを配置するオペレーションを提供していないためです。Amazon S3 は分散システムです。S3 が同じオブジェクトに対して複数の書き込みリクエストを同時に受信すると、最後に書き込まれたオブジェクトを除くすべてのオブジェクトが上書きされます。コミットを一元的に検証する機能がないと、異なるクラスタリングから同時にコミットすると、テーブルが破損します。
AWS GuardDuty の S3 コミットサービスに関連するアラート
Unity Catalog によって管理されるテーブルへのコミットは、GuardDuty アラートをトリガーしません。
AWS GuardDutyを使用し、 AWS IAMインスタンスプロファイルを使用してデータにアクセスする場合、GuardDutyは、Delta Lake、構造化ストリーミング、Auto Loader、または COPY INTO
に関連するデフォルト Databricksの動作に対してアラートを作成する場合があります。これらのアラートは、デフォルトで有効になっているインスタンス認証情報の流出検出に関連しています。 これらのアラートには、タイトル UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS
が含まれます。
元のS3データアクセス用IAMロールを引き受けるAWSインスタンスプロファイルを作成することで、S3コミットサービスに関連するGuardDutyアラートに対応するためにDatabricksデプロイメントを設定することができます。
インスタンスプロファイルの資格情報を使用する代わりに、この新しいインスタンスプロファイルは、短い期間のトークンでロールを引き受けるようにクラスターを構成できます。 この機能は、最近のすべての Databricks Runtime バージョンにすでに存在しており、 クラスターポリシーを介してグローバルに適用できます。
-
まだ作成していない場合は、S3 データにアクセスするための通常の インスタンスプロファイル を作成します。 このインスタンスプロファイルは、インスタンスプロファイルの認証情報を使用して S3 データに直接アクセスします。
このセクションでは、このインスタンスプロファイルのロールARNを
<data-role-arn>
と呼びます。 -
トークンを使用し、データに直接アクセスするインスタンスプロファイルを参照する新しいインスタンスプロファイルを作成します。 クラスターは、この新しいトークンベースのインスタンスプロファイルを参照します。 「 チュートリアル: インスタンスプロファイルを使用した S3 アクセスの設定」を参照してください。
このインスタンスプロファイルには、S3への直接アクセスは必要ありません。代わりに、データアクセスに使用するIAMロールを引き受けるためのアクセス許可のみが必要です。このセクションでは、このインスタンスプロファイルのロールARNを
<cluster-role-arn>
と呼びます。-
新しいクラスターインスタンスプロファイルのIAMロール(
<cluster-role-arn>
)にアタッチされたIAMポリシーを追加します。次のポリシーステートメントを新しいクラスターインスタンスプロファイルのIAMロールに追加し、<data-role-arn>
をバケットにアクセスする元のインスタンスプロファイルのARNに置き換えます。JSON{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "<data-role-arn>"
} -
既存のデータアクセスIAMロールに信頼ポリシーステートメントを追加し、
<cluster-role-arn>
をバケットにアクセスする元のインスタンスプロファイルのARNに置き換えます。JSON{
"Effect": "Allow",
"Principal": {
"AWS": "<cluster-role-arn>"
},
"Action": "sts:AssumeRole"
}
-
-
DBFSを使用せずにS3に直接接続するノートブックコードを使用するには、新しいトークンベースのインスタンスプロファイルを使用し、データアクセスロールを引き受けるようにクラスターを構成します。
-
すべてのバケットへのアクセス S3 ためのクラスタリングを設定します。 クラスタリングの Spark 構成に以下を追加します。
inifs.s3a.credentialsType AssumeRole
fs.s3a.stsAssumeRole.arn <data-role-arn> -
これは、特定のバケットに対して構成できます。
inifs.s3a.bucket.<bucket-name>.aws.credentials.provider org.apache.hadoop.fs.s3a.auth.AssumedRoleCredentialProvider
fs.s3a.bucket.<bucket-name>.assumed.role.arn <data-role-arn>
-
直接アップロードの最適化を無効にする
非常に小さな更新のパフォーマンス最適化として、デフォルトでは、コミットサービスは小さな更新をコントロールプレーンから直接 S3 にプッシュすることがあります。この最適化を無効にするには、Spark パラメーター spark.hadoop.fs.s3a.databricks.s3commit.directPutFileSizeThreshold
を 0
に設定します。この設定は、クラスタリングの Spark 構成で適用することも、クラスターポリシーを使用して設定することもできます。
この機能を無効にすると、小さな更新が常に行われるリアルタイムの構造化ストリーミングクエリーのパフォーマンスに若干影響する可能性があります。本番環境でこの機能を無効にする前に、データを使ってパフォーマンスへの影響をテストすることを検討してください。
特定の IP アドレスへのアクセスを制限する
特定の S3 バケットを、特定の IP アドレスからのみアクセスできるように制限できます。 たとえば、自分の環境と Databricks コントロール プレーン (S3 コミット サービスを含む) の IP アドレスのみにアクセスを制限できます。 これにより、資格情報が他の場所から使用されるリスクが軽減されます。 「(オプション) S3 バケットへのアクセスを制限する」を参照してください。