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

この記事では、Unity Catalog でストレージ認証情報を作成して 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:

  • Unity Catalogが有効化されたDatabricksワークスペース

  • CREATE STORAGE CREDENTIAL 権限(ワークスペースにアタッチされたUnity Catalogのメタストア上の)。アカウント管理者とメタストア管理者には、デフォルトでこれらの権限があります。

AWSアカウントにおいて:

  • S3 バケット。 エグレス料金を回避するには、データにアクセスするワークスペースと同じリージョンにする必要があります。

    追加の S3 バケット要件:

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

    • バケットに S3 アクセスコントロールリストをアタッチすることはできません。

  • IAMロールを作成する権限

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

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

ヒント

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

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

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

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

    重要

    2024年9月20日より、Databricksは新しいストレージ資格情報の自己引き受け型要件の実施を開始します。2025年1月20日、Databricksは自己引き受け型ではない既存のストレージ資格情報のブロックを開始します。詳細については、自己引き受け型ロールの適用ポリシーを参照してください。

    ポリシーを作成するには、プレースホルダー外部IDを使用する必要があります。

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

    2. カスタム信頼ポリシーフィールドに、以下のポリシーJSONを貼り付けます。

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

      ポリシーは、プレースホルダーとして外部IDを0000に設定します。後の手順でストレージ資格情報の外部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"
            }
          }
        }]
      }
      
      {
        "Version": "2012-10-17",
        "Statement": [{
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws-us-gov:iam::044793339203:role/unity-catalog-prod-UCMasterRole-1QRFA8SGY15OJ"
            ]
          },
          "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. S3 バケットと同じアカウントのファイルイベントの IAM ポリシーを作成します。

    注:

    このステップはオプションですが、強くお勧めします。 ユーザーに代わってファイル イベントを構成するための Databricks アクセス権を付与しない場合は、場所ごとにファイル イベントを手動で構成する必要があります。 そうしないと、Databricks が将来リリースする可能性のある重要な機能へのアクセスが制限されます。

    IAM ポリシーは、バケットのイベント通知設定の更新、SNS トピックの作成、SQS キューの作成、および SQS キューの SNS トピックへのサブスクライブを行う権限を Databricks に付与します。 これらは、ファイルイベントを使用する機能に必要なリソースです。 <BUCKET> を S3 バケットの名前に置き換えます。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "ManagedFileEventsSetupStatement",
          "Effect": "Allow",
          "Action": [
            "s3:GetBucketNotification",
            "s3:PutBucketNotification",
            "sns:ListSubscriptionsByTopic",
            "sns:GetTopicAttributes",
            "sns:SetTopicAttributes",
            "sns:CreateTopic",
            "sns:TagResource",
            "sns:Publish",
            "sns:Subscribe",
            "sqs:CreateQueue",
            "sqs:DeleteMessage",
            "sqs:ReceiveMessage",
            "sqs:SendMessage",
            "sqs:GetQueueUrl",
            "sqs:GetQueueAttributes",
            "sqs:SetQueueAttributes",
            "sqs:TagQueue",
            "sqs:ChangeMessageVisibility"
          ],
          "Resource": [
            "arn:aws:s3:::<BUCKET>",
            "arn:aws:sqs:*:*:*",
            "arn:aws:sns:*:*:*"
          ]
        },
        {
          "Sid": "ManagedFileEventsListStatement",
          "Effect": "Allow",
          "Action": [
            "sqs:ListQueues",
            "sqs:ListQueueTags",
            "sns:ListTopics"
          ],
          "Resource": "*"
        },
        {
          "Sid": "ManagedFileEventsTeardownStatement",
          "Effect": "Allow",
          "Action": [
            "sns:Unsubscribe",
            "sns:DeleteTopic",
            "sqs:DeleteQueue"
          ],
          "Resource": [
            "arn:aws:sqs:*:*:*",
            "arn:aws:sns:*:*:*"
          ]
        }
      ]
    }
    
  4. IAM ポリシーをIAMロールにアタッチします。

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

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

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

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

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

  3. [クイック アクセス] ページで、[外部データ] > ボタンをクリックし、[資格情報] タブに移動して、[資格情報の作成] を選択します。

  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: Update the IAMロールの信頼関係ポリシー

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

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

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

    以下のARNを「Allow」ステートメントに追加してください。<YOUR-AWS-ACCOUNT-ID><THIS-ROLE-NAME>を実際のアカウントIDとIAMロール値に置き換えます。

    "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>"
            }
          }
        }
      ]
    }
    

ステップ4: ストレージ資格情報を検証する

「ステップIAM 3: ロールの信頼関係ポリシーを更新するIAM 」で ロールの信頼ポリシーIAM に変更を加えた後、 ロールがストレージ認証情報として使用されるように適切に設定されていることを確認します。

注:

構成を検証するには、ストレージ認証情報の所有者、メタストア管理者であるか、ストレージ認証情報に対するCREATE EXTERNAL LOCATION権限を持っている必要があります。

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

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

  3. [クイック アクセス] ページで、[外部データ] > ボタンをクリックし、[資格情報] タブに移動します。

    別の方法として、[カタログ] ウィンドウの上部にある 歯車アイコン 歯車アイコンをクリックし、[ 認証情報] を選択することもできます。

  4. 検証するストレージ資格情報を選択します。

  5. [ 構成を検証ボタン] をクリックします。

  6. いずれかのチェックが失敗した場合は、「 ステップ 3: IAMロールの信頼関係ポリシーを更新する 」に戻り、 IAMロールの信頼ポリシーを確認して正しく構成します。

ストレージ資格情報が検証されたら、それを使用して 外部ロケーションを作成できます

自己引き受け型ロールの適用ポリシー

2023年6月30日、AWSはIAMロールの信頼ポリシーを更新し、IAMロールが STS:AssumeRole 呼び出しに対して明示的に自己信頼することを義務付けました。その結果、Databricksは、ストレージ認証情報のAWS IAMロールが自己引き受け型あることを要求し、自己引き受け型でないストレージ認証情報は間もなく禁止される予定です。詳細については、こちらの コミュニティのブログ記事を参照してください。

2024年9月20日より、Databricksは自己引き受け型ではないAWS IAMロールのストレージ資格情報の作成を禁止します。自己引き受け型ではないIAMロールの既存のストレージ資格情報は引き続き機能しますが、それらのロールを使用して新しいストレージ認証情報を作成することはできません。

2025年1月20日、Databricksは、既存のストレージ資格情報と自己引き受け型ではないIAMロールの使用のブロックを開始します。これにより、自己引き受け型ではない資格情報を使用して実行されるワークロードやジョブが中断される可能性があります。

ストレージ認証情報の AWS IAMロールが自己仮定であるかどうかを確認するには、「 ステップ 4: ストレージ認証情報を検証する」の手順に従います。 「自己引き受けロール」チェックが失敗した場合は、「ステップ 3: IAMロールの信頼関係ポリシーを更新する」に戻り、IAMロールの信頼ポリシーを自身を信頼するように再構成します。

メタストアに複数のストレージ資格情報があり、それを確認したい場合は、次のノートブックを使用して、メタストア内のすべてのストレージ資格情報が自主的に機能することを確認してください。

自己引き受け型ストレージ資格情報検証ノートブック

ノートブックを新しいタブで開く

(オプション)特定のワークスペースにストレージ資格情報を割り当てる

プレビュー

この機能はパブリックプレビュー段階です。

デフォルトでは、ストレージ資格情報はメタストア内のすべてのワークスペースからアクセスできます。つまり、ユーザーがそのストレージ認証情報に対する権限(CREATE EXTERNAL LOCATIONなど)を与えられていれば、メタストアに接続されているどのワークスペースからでもその権限を行使できます。ワークスペースを使用してユーザーデータアクセスを分離する場合は、ストレージ資格情報へのアクセスを特定のワークスペースからのみ許可することをお勧めします。この機能は、ワークスペースのバインドまたはストレージ資格情報の分離と呼ばれます。

ストレージ資格情報を特定のワークスペースにバインドする一般的なユースケースには、クラウド管理者が運用クラウドアカウント資格情報を使用してストレージ資格情報を構成し、Databricksユーザーがこの資格情報を使用して運用ワークスペースでのみ外部の場所を作成できるようにする場合などが考えられます。

ワークスペースのバインド機能の詳細については、(オプション)特定のワークスペースに外部ロケーションを割り当てるおよびカタログへのアクセスを特定のワークスペースに制限するを参照してください。

注:

ワークスペースバインディングは、ストレージ資格情報に対する権限が行使されるときに参照されます。たとえば、ユーザーがストレージ資格情報を使用して外部ロケーションを作成する場合、ストレージ資格情報のワークスペースバインディングは、外部ロケーションが作成されたときにのみチェックされます。作成された後、外部ロケーションはストレージ資格情報に設定されているワークスペースバインディングとは独立して機能します。

ストレージ認証情報を1つ以上のワークスペースにバインドする

ストレージ認証情報を特定のワークスペースに割り当てるには、カタログエクスプローラーまたはDatabricks CLIを使用できます。

必要な権限:メタストア管理者またはストレージ資格所有者。

注:

メタストア管理者は、カタログエクスプローラーを使用してメタストア内のすべてのストレージ資格情報を確認できます。ストレージ資格情報の所有者は、ストレージ資格情報が現在のワークスペースに割り当てられているかどうかに関係なく、メタストアで所有しているすべてのストレージ資格情報を確認できます。ワークスペースに割り当てられていないストレージ資格情報は、灰色で表示されます。

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

  2. サイドバーで、「カタログアイコン カタログ 」をクリックします。

  3. [クイック アクセス] ページで、[外部データ>] ボタンをクリックし、[資格情報] タブに移動します。

  4. ストレージ資格情報を選択し、[ワークスペース] タブに移動します。

  5. [ワークスペース] タブで、[すべてのワークスペースがアクセス可能] チェックボックスをオフにします。

    ストレージ資格情報がすでに1つ以上のワークスペースにバインドされている場合、このチェックボックスはすでにオフになっています。

  6. [ワークスペースに割り当てる] をクリックし、割り当てるワークスペースを入力または検索します。

アクセス権を取り消すには、[ワークスペース] タブに移動し、ワークスペースを選択して、[取り消し] をクリックします。すべてのワークスペースからのアクセスを許可するには、[すべてのワークスペースがアクセス可能] チェックボックスをオンにします。

ワークスペースにストレージ認証情報を割り当てるには、2 つの Databricks CLIコマンドグループと2つのステップが必要です。

次の例では、 <profile-name> をDatabricks認証構成プロファイルの名前に置き換えます。これには、パーソナルアクセストークンを生成したワークスペースのワークスペースインスタンス名とワークスペースIDに加えて、パーソナルアクセストークンの値を含める必要があります。「Databricksパーソナルアクセストークン認証」を参照してください。

  1. storage-credentialsコマンドグループのupdateコマンドを使用して、ストレージ認証情報のisolation modeISOLATEDに設定します。

    databricks storage-credentials update <my-storage-credential> \
    --isolation-mode ISOLATED \
    --profile <profile-name>
    

    デフォルトのisolation-modeは、メタストアにアタッチされているすべてのワークスペースに対してOPENです。

  2. workspace-bindingsコマンドグループのupdate-bindingsコマンドを使用して、ワークスペースをストレージ認証情報に割り当てます。

    databricks workspace-bindings update-bindings storage-credential <my-storage-credential> \
    --json '{
      "add": [{"workspace_id": <workspace-id>}...],
      "remove": [{"workspace_id": <workspace-id>}...]
    }' --profile <profile-name>
    

    ワークスペースのバインドを追加または削除するには、"add"プロパティと"remove"プロパティを使用します。

    注:

    読み取り専用バインディング(BINDING_TYPE_READ_ONLY)はストレージ認証情報では使用できません。したがって、ストレージ認証情報のバインディングにbinding_typeを設定する理由はありません。

ストレージ認証情報のすべてのワークスペース割り当てを一覧表示するには、workspace-bindingsコマンドグループのget-bindingsコマンドを使用します。

databricks workspace-bindings get-bindings storage-credential <my-storage-credential> \
--profile <profile-name>

ワークスペースからストレージ資格情報のバインドを解除する

Catalog Explorerまたはworkspace-bindings CLIコマンドグループを使用してストレージ認証情報へのワークスペースアクセスを取り消す手順については、「ストレージ認証情報を1つ以上のワークスペースにバインドする」を参照してください。

次のステップ

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

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