AWS S3数据湖跨帐户使用情况

时间:2018-03-12 11:40:19

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

我们有以下情况: AWS账户A(应用程序)将数据从应用程序写入账户B(数据湖)拥有的S3存储桶。帐户C(报告)中的分析师希望获取数据并在其上构建报告和仪表板。

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

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

我们尝试在不同的帐户中担任角色,但它并不适用于我们所有的基础架构。例如。通过CLI或控制台进行S3访问是可以的,但在帐户C中使用EMR则不行。此外,我们还有内部部署基础架构(本地任务管理器),这种机制不是一种选择。

维护所有帐户和用户的IAM角色需要付出太多努力。我们的目标是实现自动解决方案,而不是每次添加新用户或帐户时都必须采取行动。

你有什么建议吗?

3 个答案:

答案 0 :(得分:1)

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

https://metacpan.org/pod/wallflower

步骤:

  1. 创建SAML提供程序
  2. 为SAML提供商创建角色,例如下面的
  3. 根据saml条件分配用户角色
  4. 例如,您可以创建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"
            }}
          }]
    }
    

    希望它有所帮助。

答案 1 :(得分: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/*"
         ]
      }
   ]
}

然后,此策略可以附加到所需的任何Account C IAM角色或用户组。例如,您可以将其附加到标准的Developer或Analyst角色上,以授予对大型用户的访问权限,也可以将其附加到服务角色,以使特定服务访问存储桶。

如何进行此操作有guide on the Amazon S3 documentation site

答案 2 :(得分:0)

在我们的案例中,我们使用DataLake帐户(B)中的角色(用于写入(WriterRole)和读取(ReaderRole)访问)解决了该问题。从帐户A写入DataLake时,您的编写者会假设帐户B中的“ WriterRole”具有所需的权限。从帐户C进行读取时,您假定使用“ ReaderRole”。 关于EMR阅读的问题,我们通过使用IAM角色阅读(https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-emrfs-iam-roles.html)的EMRFS解决了