AWS S3 数据湖跨账户使用

AWS S3 data lake cross account usage

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

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

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

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

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

你有什么建议吗?

您可以通过以下文档来完成,

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

步骤:

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

例如,您可以创建 S3 Reader、S3 Writers 并根据其分配权限。

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

希望对您有所帮助。

一种简洁明了的方法是使用存储桶策略,通过提供帐户 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

在我们的案例中,我们使用 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)