AWS S3 に接続するためのストレージ認証情報を作成する

この記事では、AWS S3 に接続するためにUnity Catalogでストレージ認証情報を作成する方法について説明します。

テーブルとボリュームを保持する基盤となるクラウド ストレージへのアクセスを管理するために、Unity Catalog は次のオブジェクト タイプを使用します。

  • ストレージ資格情報は、クラウドストレージにアクセスするための長期的なクラウド資格情報をカプセル化します。

  • 外部ロケーションには、ストレージ資格情報とクラウドストレージパスへの参照が格納されています。

詳細については、 Unity Catalogを使用してクラウド オブジェクト ストレージに接続する」を参照してください。

Unity Catalog は、 Databricks on AWSの 2 つのクラウド ストレージ オプション、AWS S3 バケットと Cloudflare R2 バケットをサポートしています。 Cloudflare R2は主に、データ下り料金を回避したいDelta Sharingユースケースを対象としています。 S3 は、他のほとんどのユースケースに適しています。 この記事では、S3 のストレージ認証情報の作成に焦点を当てます。 Cloudflare R2 については、「 Cloudflare R2 に接続するためのストレージ資格情報を作成する」を参照してください。

S3 バケットにアクセスするためのストレージ認証情報を作成するには、S3 バケット パスへのアクセス (読み取り、または読み取りと書き込み) を承認する IAM ロールを作成し、ストレージ認証情報定義でその IAM ロールを参照します。

要件

Databricks の場合:

  • Databricks ワークスペースがUnity Catalogに対して有効になっています。

  • CREATE STORAGE CREDENTIAL ワークスペースにアタッチされているUnity Catalogメタストアに対する権限。 アカウント管理者とメタストア管理者には、デフォルトでこの権限が与えられます。

AWS アカウントで:

  • データにアクセスするワークスペースと同じリージョンにある S3 バケット。

    バケット名にドット表記を含めることはできません(例:incorrect.bucket.name.notation)。バケットの命名方法の詳細については、「AWSバケットの命名規則」を参照してください。

  • IAMロールを作成する機能。

ステップ1:IAMロールを作成する

AWSで、ユーザーにアクセスを許可するS3バケットへのアクセスを許可するIAMロールを作成します。このIAMロールは、S3バケットと同じアカウントで定義する必要があります。

ヒント

このアクセスを許可するIAMロールを既に作成している場合は、このステップをスキップして、「 ステップ2:DatabricksにIAMロールの詳細を付与する」に進んで構いません。

  1. S3バケットへのアクセスを許可するIAMロールを作成します。

    ロールの作成は 2 段階のプロセスです。 このステップでは、ロールを作成し、 一時的な 信頼関係ポリシーとプレースホルダー外部 ID を追加し、Databricks でストレージ資格情報を作成した後に変更します。

    ロールは自己前提型である必要がある (つまり、ロール自体を信頼するように構成する必要がある) ため、ロールの作成 後に 信頼ポリシーを変更する必要があります。 したがって、自己仮定ステートメントを追加する前に、ロールが存在している必要があります。 自己仮定の役割については、この Amazonブログ記事を参照してください。

    ポリシーを作成するには、プレースホルダー外部 ID を使用する必要があります。 AWS リソースへのアクセス権をサードパーティーに付与するには、AWS で外部 ID が必要です。

    1. カスタム信頼ポリシーを使用してIAMロールを作成します。

    2. [ Custom Trust Policy ] フィールドに、次のポリシー JSON を貼り付けます。

      このポリシーは、アカウント間の信頼関係を確立し、Unity Catalog が Databricks ユーザーに代わってバケット内のデータにアクセスする役割を引き受けることができるようにします。 これは、 Principalセクションの ARN によって指定されます。 これは、Databricks によって作成されたロールを参照する静的な値です。 ポリシーでは、Databricks AWS アカウント ID 414351767826を使用します。 Databricks on AWS GovCloud で Databricksを使用している場合は、 Databricksアカウント ID 044793339203 を使用します。

      ポリシーは、プレースホルダーとして 0000 する外部 ID を設定します。 これは、後の手順でストレージ資格情報の外部 ID に更新します。

      {
        "Version": "2012-10-17",
        "Statement": [{
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL"
            ]
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "0000"
            }
          }
        }]
      }
      
    3. アクセス許可ポリシーの構成をスキップします。この構成は、後のステップで追加します。

    4. IAMロールを保存します。

  2. S3バケットと同じアカウントに次のIAMポリシーを作成し、次の値を置き換えます。

    • <BUCKET>:S3バケットの名前。

    • <KMS-KEY>:オプション。暗号化が有効になっている場合は、S3バケットの内容を暗号化するKMSキーの名前を指定します。暗号化が無効になっている場合は、IAMポリシーのKMSセクション全体を削除します。

    • <AWS-ACCOUNT-ID>:AWSアカウントのアカウントID(Databricksアカウントではありません)。

    • <AWS-IAM-ROLE-NAME>:前のステップで作成したAWS IAMロールの名前。

    この IAM ポリシーは、読み取りおよび書き込みアクセスを許可します。 また、読み取りアクセスのみを許可するポリシーを作成することもできます。 ただし、ストレージ認証情報を読み取り専用としてマークすることができ、このIAMロールによって付与された書き込みアクセスはすべて無視されるため、これは不要な場合があります。

    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Action": [
                  "s3:GetObject",
                  "s3:PutObject",
                  "s3:DeleteObject",
                  "s3:ListBucket",
                  "s3:GetBucketLocation"
              ],
              "Resource": [
                  "arn:aws:s3:::<BUCKET>/*",
                  "arn:aws:s3:::<BUCKET>"
              ],
              "Effect": "Allow"
          },
          {
              "Action": [
                  "kms:Decrypt",
                  "kms:Encrypt",
                  "kms:GenerateDataKey*"
              ],
              "Resource": [
                  "arn:aws:kms:<KMS-KEY>"
              ],
              "Effect": "Allow"
          },
          {
              "Action": [
                  "sts:AssumeRole"
              ],
              "Resource": [
                  "arn:aws:iam::<AWS-ACCOUNT-ID>:role/<AWS-IAM-ROLE-NAME>"
              ],
              "Effect": "Allow"
          }
        ]
    }
    

    注:

    Unity Catalog に対してより制限の厳しい IAM ポリシーが必要な場合は、Databricks アカウント チームにお問い合わせください。

  3. IAMポリシーをIAMロールにアタッチします。

    ロールの[アクセス許可]タブで、作成したIAMポリシーをアタッチします。

ステップ 2:IAMロールの詳細をDatabricksに渡す

  1. Databricksで、メタストアにリンクされているワークスペースにログインします。

    CREATE STORAGE CREDENTIAL 権限が必要です。メタストア管理者ロールとアカウント管理者ロールの両方に、この権限が含まれています。

  2. カタログ アイコン カタログ」 をクリックします

  3. [ + 追加 ] ボタンをクリックし、メニューから [ ストレージ資格情報の追加 ] を選択します。

    このオプションは、 CREATE STORAGE CREDENTIAL 権限がない場合には表示されません。

  4. AWS IAMロール認証情報の種類を選択します。

  5. 資格情報の名前、クラウドテナント上のストレージの場所へのアクセスをUnity Catalogに承認するIAMロールARN、およびコメント(オプション)を入力します。

    ヒント

    Databricks でインスタンスプロファイルを既に定義している場合は、[インスタンスプロファイル のコピー ] をクリックして、その インスタンスプロファイル の IAMロール ARN をコピーできます。インスタンスプロファイルの IAMロールには、Databricks ユーザーに代わってバケットにアクセスするために、Databricks がロールを引き受けることができるクロスアカウントの信頼関係が必要です。 IAMロールポリシーと信頼関係の要件の詳細については、「 ステップ 1: IAMロールを作成する」を参照してください。

  6. (オプション)このストレージ資格情報を使用する外部ロケーションへの読み取り専用アクセス権をユーザーに付与する場合は、[ 詳細オプション ] で [読み取り専用] を選択します。 詳細については、「 ストレージ資格情報を読み取り専用としてマークする」を参照してください。

  7. 作成」をクリックします。

  8. [ ストレージ資格情報が作成されました ] ダイアログで、 [外部 ID] をコピーします。

  9. [完了] をクリックします。

  10. このストレージ資格情報を参照する外部ロケーションを作成します

Databricks Terraformプロバイダーdatabricks_storage_credentialを使用して、ストレージ資格情報を作成することもできます。

ステップ 3: IAMロールポリシーを更新する

AWS で、信頼関係ポリシーを変更して、ストレージ認証情報の外部 ID を追加し、自己仮定にします。

  1. 保存したIAMロールに戻り、[信頼関係]タブに移動します。

  2. 信頼関係ポリシーを次のように編集します。

    次の ARN を「Allow」ステートメントに追加します。 <YOUR-AWS-ACCOUNT-ID><THIS-ROLE-NAME>を実際のアカウント ID と IAMroll の値に置き換えます。

    "arn:aws:iam::<YOUR-AWS-ACCOUNT-ID>:role/<THIS-ROLE-NAME>"
    

    "sts:AssumeRole" ステートメントで、プレースホルダーの外部 ID を、前の手順でコピーしたストレージ資格情報の外部 ID に更新します。

    "sts:ExternalId": "<STORAGE-CREDENTIAL-EXTERNAL-ID>"
    

    ポリシーは次のようになりますが、置換テキストはストレージ認証情報の外部 ID、アカウント ID、IAMロール値を使用するように更新されます。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL",
              "arn:aws:iam::<YOUR-AWS-ACCOUNT-ID>:role/<THIS-ROLE-NAME>"
            ]
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<STORAGE-CREDENTIAL-EXTERNAL-ID>"
            }
          }
        }
      ]
    }
    

次のステップ

ストレージ資格情報を使用するアクセス許可を表示、更新、削除、および他のユーザーに付与できます。 「 ストレージ資格情報の管理」を参照してください。

ストレージ資格情報を使用して外部ロケーションを定義できます。 「外部ロケーションを作成してクラウド ストレージを Databricks に接続する」を参照してください。