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 に書き込まれた後、S3 コントロール プレーンの コミット サービスは、マルチパート アップロードが完了したことを に知らせることで、 マルチパートDatabricks S3S3アップロードを完了します。非常に小さな更新のパフォーマンス最適化として、デフォルトでは、コミットサービスは小さな更新をコントロールプレーンから直接 S3 にプッシュすることがあります。 この直接更新の最適化は無効にすることができます。 「直接アップロードの最適化を無効にする」を参照してください。
Delta Lakeに加え、次のDatabricks機能も同じS3コミットサービスを使用します。
Amazonは、オブジェクトがまだ存在しない場合にのみオブジェクトを配置する操作を提供していないため、コミットサービスが必要です。Amazon S3は分散システムです。S3が同じオブジェクトに対する複数の書き込みリクエストを同時に受信した場合、最後に書き込まれたオブジェクトを除くすべてのオブジェクトが上書きされます。コミットを一元的に検証する機能がなければ、異なるクラスターからの同時コミットによってテーブルが破損する可能性があります。
AWS GuardDuty の S3 コミットサービスに関連するアラート
Unity Catalog によって管理されるテーブルへのコミットは、GuardDuty アラートをトリガーしません。
AWSGuardDuty AWSIAMを使用し、 インスタンスプロファイルを使用してデータにアクセスする場合、GuardDutyDatabricks Delta Lakeは、 、構造化ストリーミング、Auto Loader 、または に関連するデフォルト の動作に対してアラートを作成する場合があります。COPY INTO
これらのアラートは、デフォルトで有効になっているインスタンス認証情報の流出検出に関連しています。 これらのアラートには、タイトル UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS
が含まれます。
コミット サービスに関連する DatabricksGuardDutyS3AWSアラートに対処するように デプロイを設定するには、元のS3 データ アクセスIAM ロールの役割を引き受ける インスタンスプロファイル を作成します。
インスタンスプロファイルの資格情報を使用する代わりに、この新しいインスタンスプロファイルは、短い期間のトークンでロールを引き受けるようにクラスターを構成できます。 この機能は、最近のすべての 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 バケットへのアクセスを制限する」を参照してください。