创建用于连接到 AWS S3 的存储凭据(只读)

本文介绍如何在 Unity 目录中创建存储凭据以连接到 AWS S3。 在 Azure Databricks 中对 S3 的支持为只读。

存储凭据是指能够访问云存储的长期云凭据。 在 Unity 目录中创建 外部位置 以控制对外部存储的访问时,引用存储凭据和云存储路径。

有关存储凭据和外部位置的详细信息,请参阅 使用 Unity 目录连接到云对象存储

有关 Unity 目录支持的其他云存储选项的信息,请参阅 Unity 目录支持的云存储选项

注释

可能会收取跨云数据传输费用。 使用无服务器计算时,会根据 Databricks 数据传输和连接策略计费。

创建存储凭据

若要创建用于访问 S3 存储桶的存储凭据,请创建一个 AWS IAM 角色,该角色授权访问 S3 存储桶路径,并在存储凭据定义中引用该 IAM 角色。

要求

在 Azure Databricks 中:

  • 启用 Unity Catalog 的 Azure Databricks 工作区。
  • 附加到工作区的 Unity Catalog 元存储的 CREATE STORAGE CREDENTIAL 特权。 默认情况下,帐户管理员和元存储管理员具有此权限。

在 AWS 帐户中:

  • 满足以下要求的 S3 存储桶:

    • 存储桶名称不能包含点号(例如,incorrect.bucket.name.notation)。 有关更多存储桶命名指南,请参阅 AWS 存储桶命名规则
    • 存储桶不能附加 Amazon S3 访问控制列表。
  • 创建身份与访问管理 (IAM) 角色的能力。

步骤 1:创建 IAM 角色

在 AWS 中,创建一个 IAM 角色,该角色授予你希望用户访问的 S3 存储桶的访问权限。 必须在与 S3 存储桶相同的帐户中定义此 IAM 角色。

小窍门

如果已创建提供此访问权限的 IAM 角色,则可以跳过此步骤并直接转到 步骤 2:为 Azure Databricks 提供 IAM 角色详细信息

  1. 创建允许访问 S3 存储桶的 IAM 角色。

    角色创建是一个双重过程。 在此步骤中创建角色,添加 临时 信任关系策略和占位符外部 ID,然后在 Azure Databricks 中创建存储凭据后对其进行修改。

    创建角色 ,必须修改信任策略,因为角色必须自假设(也就是说,必须将其配置为信任自身)。 因此,在添加自动假设声明之前,必须存在该角色。 有关自己承担角色的信息,请参阅此 Amazon 博客文章

    重要

    Databricks 基于不会自动获取权限的 IAM 角色限制新的和现有的存储凭据。 有关详细信息,请参阅 自假设角色强制策略

    若要创建策略,必须使用占位符外部 ID。

    1. 使用 自定义信任策略创建 IAM 角色。

    2. “自定义信任策略 ”字段中,粘贴以下策略 JSON。

      此策略建立了跨账户的信任关系,使 Unity Catalog 能够代表 Databricks 用户承担访问存储桶数据的角色。 Principal 部分中由 ARN 指定。 它是一个由 Databricks 创建角色所引用的静态值。

      策略将外部 ID 设置为 0000 占位符。 在稍后的步骤中,将此更新为存储凭据的外部 ID。

      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "AWS": ["arn:aws:iam::414351767826:role/unity-catalog-prod-UCAzureMainRole-1AJ6UQSSB8F0Q"]
            },
            "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",
            "s3:ListBucketMultipartUploads",
            "s3:ListMultipartUploadParts",
            "s3:AbortMultipartUpload"
          ],
          "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 目录 IAM 策略,请联系 Azure Databricks 帐户团队以获取帮助。

  3. 为 S3 存储桶所在的同一帐户中的文件事件创建 IAM 策略。

    注释

    此步骤可选,但强烈建议执行。 如果您不向 Azure Databricks 授权以代表您配置文件事件,则必须为每个位置手动配置文件事件。 如果您不这样做,您对 Databricks 未来可能发布的关键功能的访问将受到限制。 有关文件事件的详细信息,请参阅 (建议)为外部位置启用文件事件

    IAM 策略授予 Azure Databricks 更新存储桶的事件通知配置、创建 SNS 主题、创建 SQS 队列以及将 SQS 队列订阅到 SNS 主题的权限。 对于使用文件事件的功能,这些资源是必需的。 将 <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",
            "sqs:PurgeQueue"
          ],
          "Resource": ["arn:aws:s3:::<BUCKET>", "arn:aws:sqs:*:*:csms-*", "arn:aws:sns:*:*:csms-*"]
        },
        {
          "Sid": "ManagedFileEventsListStatement",
          "Effect": "Allow",
          "Action": ["sqs:ListQueues", "sqs:ListQueueTags", "sns:ListTopics"],
          "Resource": ["arn:aws:sqs:*:*:csms-*", "arn:aws:sns:*:*:csms-*"]
        },
        {
          "Sid": "ManagedFileEventsTeardownStatement",
          "Effect": "Allow",
          "Action": ["sns:Unsubscribe", "sns:DeleteTopic", "sqs:DeleteQueue"],
          "Resource": ["arn:aws:sqs:*:*:csms-*", "arn:aws:sns:*:*:csms-*"]
        }
      ]
    }
    
  4. 将 IAM 策略附加到 IAM 角色。

    在“角色的权限”选项卡中,添加刚刚创建的 IAM 策略。

步骤 2:为 Azure Databricks 提供 IAM 角色详细信息

  1. 在 Azure Databricks 中,登录到链接到 Unity Catalog 元数据存储的工作区。

    必须具有权限CREATE STORAGE CREDENTIAL。 元存储管理员和帐户管理员角色都包含此特权。

  2. 单击 “数据”图标。目录

  3. 在“快速访问”页中单击“外部数据 >””按钮,转到“凭证”选项卡,然后选择“创建凭证”

  4. 选择 AWS IAM 角色凭据类型

  5. 输入凭据的名称、授权 Unity Catalog 访问云租户上存储位置的 IAM 角色的 ARN,以及一个可选的注释。

  6. (可选)如果希望用户对使用此存储凭据的外部位置具有只读访问权限,请在“高级”选项中选择“只读”。 有关详细信息,请参阅将存储凭据标记为只读

    注释

    由于 Azure Databricks 仅使用存储凭据提供对 S3 存储桶的只读访问权限,因此无需设置此选项。

  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 和 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-UCAzureMainRole-1AJ6UQSSB8F0Q",
              "arn:aws:iam::<YOUR-AWS-ACCOUNT-ID>:role/<THIS-ROLE-NAME>"
            ]
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<STORAGE-CREDENTIAL-EXTERNAL-ID>"
            }
          }
        }
      ]
    }
    

步骤 4:验证存储凭据

步骤 3:更新 IAM 角色信任关系策略后,请验证 IAM 角色是否已正确配置为用作存储凭据。

注释

若要验证配置,你必须是存储凭据所有者、元存储管理员,或者你对存储凭据具有 CREATE EXTERNAL LOCATION 权限。

  1. 在 Azure Databricks 中,登录到链接到元数据存储的工作区。

  2. 单击 “数据”图标。目录

  3. 在“ 快速访问 ”页上,单击“ 外部数据 > ”按钮并转到“ 凭据 ”选项卡。

    或者,可以单击 “齿轮”图标。 “目录”窗格顶部的齿轮图标,然后选择“ 凭据”。

  4. 选择要验证的存储凭据。

  5. 单击“ 验证配置”按钮

  6. 如果任何检查失败,请返回到 步骤 3:更新 IAM 角色信任关系策略 ,并查看 IAM 角色的信任策略以正确配置它们。

验证存储凭据后,可以使用它 创建外部位置

自假设角色强制策略

2023 年 6 月 30 日,AWS 更新了其 IAM 角色信任策略,要求 IAM 角色必须显式信任自身以便进行 STS:AssumeRole 调用。 因此,Databricks 要求存储凭据的 AWS IAM 角色具备自我假设能力。 有关详细信息,请参阅此 社区博客文章

2025 年 1 月 20 日,Databricks 开始阻止使用具有非自假设 IAM 角色的现有存储凭据。 这种禁止可能会中断使用非自动假设凭据运行的工作负载和任务。

若要检查存储凭据的 AWS IAM 角色是否自动假定,请按照步骤 4 中的说明 验证存储凭据。 如果 自我承担角色 检查失败,请重新访问 步骤 3:更新 IAM 角色信任关系策略 ,并重新配置 IAM 角色的信任策略以信任自身。

如果元存储中有多个要检查的存储凭据,请使用以下笔记本来验证元存储中所有存储凭据的自假设功能:

自动存储凭据验证笔记本

获取笔记本

(可选)将存储凭据分配给特定工作区

默认情况下,存储凭据可从元存储中的所有工作区访问。 这意味着,如果用户已被授予该存储凭据的权限(例如 CREATE EXTERNAL LOCATION),则可以从附加到元存储的任何工作区行使该权限。 如果使用工作区来隔离用户数据访问,则可能需要仅允许从特定工作区访问存储凭据。 此功能称为工作区绑定或存储凭据隔离。 有关说明,请参阅 (可选)向特定工作区分配存储凭据

局限性

使用 无服务器出口控制的工作区不支持从 Azure Databricks 到 AWS S3 存储桶的跨平台访问。

后续步骤