如何使用 AWS Lake Formation 跨账户共享 AWS Glue 数据目录数据库和表?

上次更新日期:2022 年 5 月 5 日

我想使用 AWS Lake Formation 跨账户共享 AWS Glue 数据目录数据库和表。

解决方法

借助 Lake Formation 的跨账户功能,您可以向其他 AWS 账户授予访问权限,以便在数据湖中写入和共享数据。可以通过基于标签的访问控制或命名资源共享资源。本文重点介绍如何使用命名资源方法授予对数据目录资源的跨账户访问权限。

确保满足先决条件

在与另一个账户共享数据目录资源或访问从另一个账户共享的资源之前,请记住以下先决条件:

撤销 Lake Formation 权限

撤消 IAMAllowedPrincipals 组对数据目录资源的所有 Lake Formation 权限。

防止新表拥有 Super 权限

对于包含您可能共享的表的数据目录数据库,请防止新表具有对 IAMAllowedPrincipals: 的默认 Super 权限

  1. 打开 Lake Formation 控制台
  2. 在导航窗格中的数据目录,选择数据库
  3. 选择要更新的数据库。
  4. 选择 Actions(操作),然后选择 Edit(编辑)。
  5. Default permissions for newly created tables(新创建的表的默认权限)下,清除 Use only IAM access control for new tables in this database(仅对此数据库中的新表使用 IAM 访问控制)。
  6. 选择 Save(保存)。

有关更多信息,请参阅 Super

添加跨账户访问所需的权限

如果账户中已启用 AWS Glue 数据目录资源策略,您可以移除策略或向策略添加跨账户授权所需的新权限。以下是一个示例资源策略,用于提供从账户 1111222233334444 到账户 5555666677778888 的跨账户 AWS Glue 访问权限。

有关更多信息,请参阅授予跨账户访问权限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ram.amazonaws.com"
      },
      "Action": "glue:ShareResource",
      "Resource": [
        "arn:aws:glue:us-east-1:1111222233334444:table/*/*",
        "arn:aws:glue:us-east-1:1111222233334444:database/*",
        "arn:aws:glue:us-east-1:1111222233334444:catalog"
      ]
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::5555666677778888:root"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:1111222233334444:table/*/*",
        "arn:aws:glue:us-east-1:1111222233334444:database/*",
        "arn:aws:glue:us-east-1:1111222233334444:catalog"
      ]
    }
  ]
}

启用与企业共享

如果数据目录资源在企业间共享,则使用 AWS RAM 控制台启用与 AWS Organizations 共享。启用此选项的 AWS Identity and Access Management (IAM) 用户或角色必须拥有 ram:EnableSharingWithAwsOrganization IAM 权限。

有关更多信息,请参阅 Cross-account access prerequisites(跨账户访问先决条件)。

授予所需的 IAM 权限

源账户:要使用命名资源方法授予跨账户权限,您必须具有 AWS Glue 和 AWS Resource Access Manager (AWS RAM) 所需的 IAM 权限。您可以选择授予这些权限的 AWS 托管式策略 AWSLakeFormationCrossAccountManager,或者基于此策略创建新策略。

目标账户:目标账户中的数据湖管理员必须具有以下附加策略。此策略允许管理员接受 AWS RAM 资源共享邀请并启用与企业的资源共享:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ram:AcceptResourceShareInvitation",
        "ram:RejectResourceShareInvitation",
        "ec2:DescribeAvailabilityZones",
        "ram:EnableSharingWithAwsOrganization"
      ],
      "Resource": "*"
    }
  ]
}

注意:在 AWS RAM 中接收资源共享邀请的 IAM 用户或角色必须具有 glue:PutResourcePolicy 所需的 IAM 权限。

与目标账户共享数据库及其表

要与不属于企业的目标账户共享数据库和数据库中的所有表,请执行以下操作:

注意: 如果共享源账户中数据库里面的所有表,那么在源账户中创建的任何新表都会自动与目标账户共享。

在源账户中,执行以下操作:

  1. 打开 Lake Formation 控制台,然后以数据湖管理员身份登录。
  2. 在导航窗格中,选择数据库
  3. 选择要共享的数据库。
  4. 选择 Actions(操作),然后选择 Grant(授予)。
  5. 选择 External account(外部账户)。
  6. 对于 AWS 账户 ID 或 AWS 企业 ID,请输入目标账户的账户 ID。
  7. 对于 Table(表),请确保选中 All tables(所有表)。
  8. 对于 Table permissions(表权限)和 Grantable permissions(可授权权限),请选择您想要授权的访问权限。
  9. 选择 Grant(授予)。

在目标账户中,执行以下操作:

  1. 打开 AWS RAM 控制台
  2. 在导航窗格中,在 Shared with me(与我共享)下方,选择 Resource shares(资源共享)。
  3. 查看已授予您访问权限的资源共享列表。
  4. 要接受从源账户共享的资源的邀请,请选择资源共享 ID,然后选择接受资源共享
  5. 打开 Lake Formation 控制台
  6. 在导航窗格中,选择数据库
    您可以在列表中查看共享数据库。此数据库的 Owner account ID(拥有者账户 ID)显示源账户的账户 ID。
  7. 选择共享数据库,然后选择 Actions(操作)。
  8. 选择 Create resource link(创建资源链接)。
  9. Create resource link(创建资源链接)页面中,执行以下操作:
    对于 Resource link name(资源链接名称),输入资源链接的名称。
    对于 Shared database(已共享数据库),请确保已选中已共享数据库的名称。
    对于 Shared database's owner ID(共享数据库的拥有者 ID),输入源账户的账户 ID。
  10. 选择 Create(创建)。
    已创建资源链接。

资源链接是指向元数据数据库和表的数据目录对象,通常是指向来自其他 AWS 账户的共享数据库和表的链接。这些链接有助于实现对数据湖中数据的跨账户访问。创建资源链接后,您可以使用数据湖管理员访问权限查询共享数据库中的表。

要向共享数据库的 IAM 用户/主体授予访问权限,请授予资源链接和共享数据库所需的权限。这允许 IAM 用户/委托人在 Lake Formation 控制台中查看共享数据库和资源链接。IAM 用户还可以在他们的 Amazon Athena 控制台或 Amazon Redshift Spectrum 中查看数据库和资源链接。

要向 IAM 用户授予资源链接的访问权限,请执行以下操作:

  1. 打开 Lake Formation 控制台,然后以数据湖管理员身份登录。
  2. 在导航窗格中,选择数据库
  3. 选择您创建的资源链接。
  4. 选择操作,然后选择授予
  5. 委托人下,选择 IAM 用户和角色
  6. 对于 IAM 用户和角色,选择您想要授予访问权限的 IAM 用户/委托人。
  7. 资源链接权限下,选择描述
  8. 选择授予

要向 IAM 用户授予共享数据库的访问权限,请执行以下操作:

  1. 打开 Lake Formation 控制台,然后以数据湖管理员身份登录。
  2. 在导航窗格中,选择数据库
  3. 选择共享数据库。
  4. 选择操作,然后选择授予
  5. 委托人下,选择 IAM 用户和角色
  6. 对于 IAM 用户和角色,选择您想要授予访问权限的 IAM 用户/委托人。
  7. 数据库权限下,选择描述
    注:此步骤为用户提供了查看共享数据库的最低权限。
  8. 选择授予

要授予对数据库中所有表或特定表的访问权限,请选择所有表选项:

  1. 选择资源链接。
  2. 选择 Actions(操作),然后选择 Grant(授予)。
  3. 选择 IAM users and roles(IAM 用户和角色)。
  4. 对于 IAM users and roles(IAM 用户和角色),选择您想要授予访问权限的用户/主体。
  5. LF-Tags or catalog resources(LF 标签或目录资源)下方,执行以下操作:
    要授予对数据库中所有表的访问权限,请为 Tables - optional(表 - 可选)选择 All tables(所有表)。
    要仅授予对数据库中特定表的访问权限,请为 Tables - optional(表 - 可选)选择表。
  6. 针对 Table permissions(表权限)和 Grantable permissions(可授予权限),选择 Select(选择)和 Describe(说明)。
  7. 选择 Grant(授予)。

注意: 您只能授予源账户中为 Grantable permissions(可授予权限)选择的那些权限。

授予所需权限后,您可以从目标账户成功查询 Athena 中的表。

只与目标账户共享表

要与目标账户共享单个表,请按照上一节中的说明进行以下更改。

源账户:

要从 Lake Formation 控制台授予对目标账户的访问权限,请选择单独的表而不是选择数据库。

目标账户:

  • 在 AWS RAM 控制台中接受资源共享以访问 Lake Formation 控制台中的共享表。
  • 为共享表创建资源链接。创建资源链接后,您可以使用数据湖管理员访问权限查询共享表。
  • 要向共享表的 IAM 用户/主体授予访问权限,您必须授予资源链接的权限。

查看其他注意事项

  • 当您授予对表的权限时,只能限制对表中特定列的访问权限。如果这样操作,目标账户只能查看共享表中的那些列。
  • 确保目标账户中的 IAM 用户/主体有权访问源账户中的 Amazon Simple Storage Service (Amazon S3) 路径。
  • 如果您撤消之前从源账户授予的权限,则目标账户将无法访问共享数据库/表。但是,您在目标账户中创建的资源链接不会自动删除。您必须手动删除资源链接。
  • 删除数据库/表时,不会自动删除 AWS RAM 中的资源共享内容。因此,在删除共享数据库或表之前,必须手动撤消跨账户权限。