チュートリアル: インスタンスプロファイルを使用して S3 アクセスを設定する
注:
この記事では、Amazon S3 へのアクセスを設定するためのレガシーパターンについて説明します。 Databricks は、 Unity Catalog 外部ロケーションを使用して、クラウド オブジェクト ストレージに格納されているデータへのアクセスを管理することをお勧めします。 「Unity Catalog を使用してクラウド オブジェクト ストレージとサービスに接続する」を参照してください。
このチュートリアルでは、1 つの S3 バケットに対する読み取り、書き込み、更新、および削除のアクセス許可を持つインスタンスプロファイルを作成する方法について説明します。 1 つの IAMロールとインスタンスプロファイルを使用して、複数のバケットに対する権限を付与できます。 インスタンスプロファイルを使用して、S3 の読み取りと一覧表示のアクセス許可のみを付与することもできます。
管理者は、AWS で IAMロールを設定し、それらを Databricks ワークスペースにリンクし、インスタンスプロファイルをコンピュートに関連付けるためのアクセス権を特権ユーザーに付与します。 インスタンスプロファイルがアタッチされたコンピュートリソースにアクセスできるすべてのユーザーは、インスタンスプロファイルによって付与された権限を取得します。
始める前に
このチュートリアルは、ワークスペース管理者を対象としています。Databricksワークスペースを含むAWSアカウントに十分な権限があり、Databricksワークスペース管理者である必要があります。
このチュートリアルでは、以下の権限とアセットがあることを前提としています。
Databricksワークスペースのデプロイに使用されるIAMロールを編集する権限
AWSで新しいIAMロールを作成するための権限
S3バケットに対する権限を編集する権限
ステップ 1: AWS コンソールを使用してインスタンスプロファイルを作成する
AWSコンソールで、[IAM]サービスに移動します。
サイドバーの「ロール」タブをクリックします。
「ロールの作成」をクリックします。
( 信頼されたエンティティタイプ) で、[AWS service] ( AWS のサービス) を選択します。
[ ユースケース] で [EC2] を選択します。
「次へ」をクリックします。
ページの下部にある [ 次へ] をクリックします。
[ ロール名 ] フィールドに、ロール名を入力します。
「ロールの作成」をクリックします。
役割の一覧で、役割をクリックします。
ロールにインラインポリシーを追加します。 このポリシーは、S3 バケットへのアクセス権を付与します。
[アクセス許可] タブで、[ アクセス許可の追加] > [インライン ポリシーの作成] をクリックします。
[ JSON ] タブをクリックします。
このポリシーをコピーし、
<s3-bucket-name>
バケットの名前に設定します。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::<s3-bucket-name>" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::<s3-bucket-name>/*" ] } ] }
「ポリシーの確認」をクリックします。
[ 名前 ] フィールドに、ポリシー名を入力します。
「ポリシーの作成」をクリックします。
ロールの概要で、ロールARNをコピーします。
注:
S3 バケットの 暗号化 を有効にする場合は、設定で指定されている KMS キーの キーユーザー として IAMロールを追加する必要があります。 「 KMS を使用した S3 の暗号化の設定」を参照してください。
ステップ 2: サーバレスリソースに適用されるポリシーを有効化する
このステップにより、インスタンス適切な SQL ウェアハウスの構成にも確実に機能します。 「データ アクセス構成を有効にする」を参照してください。
ロールリストで、インスタンスプロファイルをクリックします。
[ 信頼関係 ] タブを選択します。
[信頼ポリシーの編集] をクリックします。
既存の
Statement
配列内で、次のJSONブロックを既存の信頼ポリシーの末尾に追加します。既存のポリシーを上書きしないようにしてください。{ "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::790110701330:role/serverless-customer-resource-role" ] }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": [ "databricks-serverless-<YOUR-WORKSPACE-ID1>", "databricks-serverless-<YOUR-WORKSPACE-ID2>" ] } } }
ステートメントで変更する必要があるのは、ワークスペース ID だけです。
YOUR_WORKSPACE-ID
を、このロールを使用するワークスペースの 1 つ以上の Databricks ワークスペース ID に置き換えます。注:
ワークスペース ID を取得するには、ワークスペースを使用しているときに URL を確認します。 たとえば、
https://<databricks-instance>/?o=6280049833385130
では、o=
の後の数字がワークスペース ID です。ポリシーの原則は編集しないでください 。
Principal.AWS
フィールドはarn:aws:iam::790110701330:role/serverless-customer-resource-role
値を持ち続ける必要があります。これは、Databricksが管理するサーバーレスのコンピューティング・ロールを指します。「ポリシーの確認」をクリックします。
[変更を保存]をクリックします。
ステップ 3: バケットポリシーを作成する
少なくとも、S3 ポリシーには、バケットへの読み取り専用アクセスを提供する ListBucket
アクションと GetObject
アクションを含める必要があります。 Delta Lake では、通常の操作中に DeleteObject
と PutObject
のアクセス許可が使用されます。 以下のポリシー例のアクセス許可は、データの読み取りと書き込みを行うクラスターに推奨されるデフォルトです。
注:
S3バケットにはユニバーサルに一意な名前があります。ユニバーサルな識別のためにアカウントIDは必要ありません。S3バケットを別のAWSアカウントのIAMロールやDatabricksワークスペースにリンクする場合は、S3バケットポリシーを設定する際にアカウントIDを指定する必要があります。
S3 コンソールに移動します。 「バケット 」 リストから、ポリシーを作成するバケットを選択します。
[ アクセス許可] をクリックします。
[ Bucket ポリシー] で [ Edit] をクリックします。
ポリシーを貼り付けます。 クロスアカウントバケットの IAM ポリシーの例は、
<aws-account-id-databricks>
を Databricks 環境がデプロイされている AWS アカウント ID に置き換え、<iam-role-for-s3-access>
をインスタンスプロファイルロールに置き換え、<s3-bucket-name>
をバケット名に置き換えます。{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<aws-account-id-databricks>:role/<iam-role-for-s3-access>" }, "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": "arn:aws:s3:::<s3-bucket-name>" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<aws-account-id-databricks>:role/<iam-role-for-s3-access>" }, "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::<s3-bucket-name>/*" } ] }
[保存]をクリックします。
ステップ 4: Databricks デプロイを作成した IAMロールを見つける
Databricksデプロイを作成したIAMロールがわからない場合は、次の手順を実行します:
アカウント管理者として、アカウントコンソールにログインします。
[ワークスペース]に移動し、ワークスペース名をクリックします。
[資格情報]ボックスで、[ロールARN]の末尾にあるロール名を書き留めます。
例えば、ロールARN arn:aws:iam::123456789123:role/finance-prod
では、ロール名はfinance-prod
です。
ステップ 5: EC2 ポリシーに S3 IAMロールを追加する
AWSコンソールで、[IAM]サービスに移動します。
サイドバーの「ロール」タブをクリックします。
Databricks配置を作成したロールをクリックします
[権限]タブで、ポリシーをクリックします。
[ポリシーの編集]をクリックします。
次のブロックを
Statement
配列の末尾に追加します。 既存のポリシーを上書きしないようにしてください。<iam-role-for-s3-access>
を、「チュートリアル: インスタンスプロファイルで S3 アクセスを設定する」で作成したロールに置き換えます。{ "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::<aws-account-id-databricks>:role/<iam-role-for-s3-access>" }
「ポリシーの確認」をクリックします。
[変更を保存]をクリックします。
ステップ 6: インスタンスプロファイルを Databricks に追加する
ワークスペース管理者として、 設定ページに移動します。
[ セキュリティ ] タブをクリックします。
[インスタンスプロファイル] の横にある [管理] をクリックします。
[ インスタンスプロファイルの追加] をクリックします。
インスタンスプロファイルの ARN を [Instance profile ARN] (インスタンスプロファイル ARN ) フィールドに貼り付けます。 ARN がない場合は、「 チュートリアル: インスタンスプロファイルを使用して S3 アクセスを設定する」を参照してください。
サーバーレス SQL がインスタンス準備と連携するには、IAMroll ARN フィールドでインスタンスに関連付けられたロール ARN を明示的に指定する必要がある場合があります。
これは、インスタンスプロファイルに関連付けられたロール名 (ロール ARN の最後のスラッシュの後のテキスト) とインスタンスプロファイル名 (インスタンスプロファイル ARN の最後のスラッシュの後のテキスト) が一致しない場合にのみ必要なステップです。 これが自分に当てはまるかどうかを確認するには、次の操作を行います。
AWS コンソールで、 IAM サービスの [Roles] (ロール) タブに移動します。 アカウントのIAMロールが一覧表示されます。
このセクションで先ほどご覧いただいた [インスタンスプロファイル] フィールドの [データセキュリティ] セクションにあるDatabricks SQL管理設定のインスタンスプロファイル名と一致する名前のロールをクリックします。
概要領域で、[ Role ARN ] フィールドと [インスタンスプロファイル ARNs ] フィールドを見つけて、それらが一致するかどうかを確認します。
一致しない場合は、ロール ARN を [IAMロール ARN ] フィールドに貼り付けます。 名前が一致する場合は、 IAMロール ARN フィールドを設定する必要はありません。
IAM 認証情報のパススルーを設定する場合にのみ、[Meta インスタンスプロファイル] プロパティを選択します。
Databricks は、インスタンスプロファイル ARN が構文的にも意味的にも正しいことを検証します。 セマンティックの正確性を検証するために、Databricks は、このインスタンスプロファイルを使用してクラスターを起動してリハーサルを行います。 このドライ実行で失敗すると、UI で検証エラーが発生します。 インスタンスプロファイルに
tag-enforcement
ポリシーが含まれている場合、インスタンスプロファイルの検証が失敗し、正当なインスタンスプロファイルを追加できないことがあります。 検証に失敗してもインスタンスプロファイルを追加する場合は、[ Skip Validation ] チェックボックスを選択します。「追加」をクリックします。
インスタンスプロファイルを管理する
ワークスペース管理者は、インスタンス プロファイルへのアクセスを管理し、更新することができます。 「 Databricksでインスタンスプロファイルを管理する」を参照してください。