【问题标题】:AWS S3 data lake cross account usageAWS S3 数据湖跨账户使用
【发布时间】:2018-09-20 19:12:25
【问题描述】:

我们有以下场景: AWS 账户 A(应用程序)将数据从应用程序写入账户 B(数据湖)拥有的 S3 存储桶。账户 C(报告)中的分析师想要处理数据并在其上构建报告和仪表板。

账户 A 可以使用 --acl bucket-owner-full-control 将数据写入数据湖,以允许账户 B 访问。但账户 C 仍然无法查看和处理数据。

一个(在我们看来很糟糕)解决方案是将数据复制到与帐户 B 相同的位置(覆盖),从而有效地获得过程中数据的所有权并消除问题。我们不想要它,因为……丑

我们尝试在不同的帐户中担任角色,但它不适用于我们所有的基础架构。例如。通过 CLI 或控制台访问 S3 是可以的,但不能在账户 C 中从 EMR 使用它。我们还有本地基础设施(本地任务运行程序),这种机制不是一种选择。

维护所有账户和用户的 IAM 角色太费力了。我们的目标是提供一种自动解决方案,而不是每次添加新用户或帐户时都必须采取行动。

你有什么建议吗?

【问题讨论】:

    标签: amazon-web-services amazon-s3 data-lake


    【解决方案1】:

    一种不错且干净的方法是使用存储桶策略,通过提供账户 ARN 作为委托人来授予对外部账户(账户 C)的读取访问权限。

    {
       "Version": "2012-10-17",
       "Statement": [
          {
             "Sid": "Grant read access to reporting account",
             "Effect": "Allow",
             "Principal": {
                "AWS": "arn:aws:iam::insertReportingAccountIdHere:root"
             },
             "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectAcl"
             ],
             "Resource": [
                "arn:aws:s3:::yourdatalakebucket",
                "arn:aws:s3:::yourdatalakebucket/*"
             ]
          }
       ]
    }
    

    这让报告账户可以为其自己的用户管理存储桶的 (ListBucket, gGtObject) 权限,这意味着您现在可以在账户 C 上创建一个 IAM 策略,该策略具有从指定数据湖存储桶获取数据的权限:

    {
       "Version": "2012-10-17",
       "Statement": [
          {
             "Sid": "Allow reading files from the data lake",
             "Effect": "Allow",
             "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectAcl"
             ],
             "Resource": [
                "arn:aws:s3:::yourdatalakebucket",
                "arn:aws:s3:::yourdatalakebucket/*"
             ]
          }
       ]
    }
    

    然后可以将此策略附加到您想要的任何账户 C IAM 角色或用户组。例如,您可以将其附加到您的标准开发人员或分析师角色以授予对大型用户组的访问权限,或者您可以将其附加到服务角色以授予对存储桶的特定服务访问权限。

    有一个guide on the Amazon S3 documentation site 说明如何执行此操作。

    【讨论】:

      【解决方案2】:

      您可以通过以下文档进行操作,

      https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-saml.html

      步骤:

      1. 创建 SAML 提供程序
      2. 为 SAML 提供者创建角色,示例如下
      3. 根据 saml 条件分配用户角色

      例如,您可以创建 S3 读取器、S3 写入器并基于此分配权限。

      使用 SAML 假设角色的示例:

      {
            "Version": "2012-10-17",
            "Statement": [{
              "Effect": "Allow",
              "Principal": {"Federated": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:saml-provider/ExampleOrgSSOProvider"},
              "Action": "sts:AssumeRoleWithSAML",
              "Condition": {"StringEquals": {
                "saml:edupersonorgdn": "ExampleOrg",
                "saml:aud": "https://signin.aws.amazon.com/saml"
              }}
            }]
      }
      

      希望对你有帮助。

      【讨论】:

        【解决方案3】:

        在我们的例子中,我们使用 DataLake 帐户 (B) 中的角色解决了这个问题,包括写入 (WriterRole) 和读取 (ReaderRole) 访问。从账户 A 向 DataLake 写入数据时,您的写入者假定账户 B 中的“WriterRole”具有所需的权限。从帐户 C 读取时,您假定为“ReaderRole”。 EMR 读取的问题,我们通过使用 IAM 角色读取的 EMRFS 解决了 (https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-emrfs-iam-roles.html)

        【讨论】:

          猜你喜欢
          • 2020-03-29
          • 1970-01-01
          • 1970-01-01
          • 2021-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-21
          相关资源
          最近更新 更多