本文介绍如何在 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 角色详细信息。
创建允许访问 S3 存储桶的 IAM 角色。
角色创建是一个双重过程。 在此步骤中创建角色,添加 临时 信任关系策略和占位符外部 ID,然后在 Azure Databricks 中创建存储凭据后对其进行修改。
创建角色 后 ,必须修改信任策略,因为角色必须自假设(也就是说,必须将其配置为信任自身)。 因此,在添加自动假设声明之前,必须存在该角色。 有关自己承担角色的信息,请参阅此 Amazon 博客文章。
重要
Databricks 基于不会自动获取权限的 IAM 角色限制新的和现有的存储凭据。 有关详细信息,请参阅 自假设角色强制策略。
若要创建策略,必须使用占位符外部 ID。
使用 自定义信任策略创建 IAM 角色。
在 “自定义信任策略 ”字段中,粘贴以下策略 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" } } } ] }
跳过权限策略配置。 稍后将返回添加该内容。
保存 IAM 角色。
在与 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 帐户团队以获取帮助。
-
为 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-*"] } ] }
将 IAM 策略附加到 IAM 角色。
在“角色的权限”选项卡中,添加刚刚创建的 IAM 策略。
步骤 2:为 Azure Databricks 提供 IAM 角色详细信息
在 Azure Databricks 中,登录到链接到 Unity Catalog 元数据存储的工作区。
必须具有权限
CREATE STORAGE CREDENTIAL
。 元存储管理员和帐户管理员角色都包含此特权。单击
目录。
在“快速访问”页中单击“外部数据 >””按钮,转到“凭证”选项卡,然后选择“创建凭证”。
选择 AWS IAM 角色的凭据类型。
输入凭据的名称、授权 Unity Catalog 访问云租户上存储位置的 IAM 角色的 ARN,以及一个可选的注释。
(可选)如果希望用户对使用此存储凭据的外部位置具有只读访问权限,请在“高级”选项中选择“只读”。 有关详细信息,请参阅将存储凭据标记为只读。
注释
由于 Azure Databricks 仅使用存储凭据提供对 S3 存储桶的只读访问权限,因此无需设置此选项。
单击 “创建” 。
在“已创建存储凭据”对话框,复制“外部 ID”。
单击“完成”。
(可选)将存储凭据绑定到特定工作区。
默认情况下,任何特权用户都可以在附加到元存储的任何工作区上使用存储凭据。 如果只想允许从特定工作区进行访问,请转到“工作区”选项卡并分配工作区。 请参阅 (可选)将存储凭据分配给特定工作区。
还可以使用 Databricks Terraform 提供程序和 databricks_storage_credential 创建存储凭据。
步骤 3:更新 IAM 角色信任关系策略
在 AWS 中,修改信任关系策略以添加存储凭据的外部 ID 并使其自假设。
返回到已保存的 IAM 角色,并转到“ 信任关系 ”选项卡。
按如下所示编辑信任关系策略:
请将以下 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
权限。
在 Azure Databricks 中,登录到链接到元数据存储的工作区。
单击
目录。
在“ 快速访问 ”页上,单击“ 外部数据 > ”按钮并转到“ 凭据 ”选项卡。
或者,可以单击
“目录”窗格顶部的齿轮图标,然后选择“ 凭据”。
选择要验证的存储凭据。
单击“
。
如果任何检查失败,请返回到 步骤 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 存储桶的跨平台访问。
后续步骤
查看、更新、删除和授予其他用户使用存储凭据的权限。 请参阅管理存储凭据。
使用存储凭据定义外部位置。 请参阅创建外部位置以将云存储连接到 Azure Databricks。