【问题标题】:s3 bucket policy for instance to read from two different accountss3 存储桶策略,例如从两个不同的帐户读取
【发布时间】:2019-04-14 05:17:59
【问题描述】:

我有一个实例需要从两个不同的账户 s3 读取数据。

  1. DataAccount 中的存储桶名称为“dataaccountlogs
  2. UserAccount 中的存储桶名称为“userlogs

我对这两个账户都有控制台访问权限,所以现在我需要配置存储桶策略以允许实例从存储桶 dataaccountlogsuserlogs 读取 s3 数据,而我的实例是在 UserAccount 中运行。

我需要从 命令行 以及使用 spark job 访问这两个存储桶。

【问题讨论】:

  • 我已经要求其他帐户所有者更新策略,同时我想知道如果添加这些策略,我是否能够在不配置访问密钥和密钥的情况下读取侧火花中的 s3?跨度>
  • 这个 spark 作业在哪里运行?如果是 EC2,那么您需要为其附加适当的 IAM 角色。
  • 是的,它正在我账户的 EC2 实例中运行。但我不确定我应该担任哪个角色

标签: amazon-web-services apache-spark amazon-s3 amazon-iam


【解决方案1】:

您将需要 UserAccount 中的一个角色,该角色将用于访问上述存储桶,例如 RoleA。角色应具有所需 S3 操作的权限。

然后您将能够为每个存储桶配置存储桶策略:

  1. 对于数据帐户

    {        
    "Version": "2012-10-17",
    "Id": "Policy1",
    "Statement": [
        {
            "Sid": "test1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::DataAccount:role/RoleA"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::dataaccountlogs",
                "arn:aws:s3:::dataaccountlogs/*"
            ]
        }
    ]
    }
    
  2. 对于用户帐户

    {
    "Version": "2012-10-17",
    "Id": "Policy1",
    "Statement": [
        {
            "Sid": "test1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::DataAccount:role/RoleA"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::userlogs",
                "arn:aws:s3:::userlogs/*"
            ]
        }
    ]
    } 
    

从命令行访问它们:

您需要先设置 AWS CLI 工具: https://docs.aws.amazon.com/polly/latest/dg/setup-aws-cli.html

然后您需要配置一个配置文件以使用您的角色。 首先,您需要为您的用户创建个人资料以便登录:

aws 配置 --profile YourProfileAlias

并按照说明设置凭据。

然后您需要编辑配置并为角色添加配置文件: ~/.aws/config

在末尾添加一个块:

[profile YourRoleProfileName]
role_arn = arn:aws:iam::DataAccount:role/RoleA
source_profile = YourProfileAlias

之后,您将能够使用 aws s3api ... --profile YourRoleProfileName 代表创建的角色访问您的两个存储桶。

从 spark 访问:

  1. 如果您在 EMR 上运行集群,则应使用 SecurityConfiguration,并填写 S3 角色配置部分。可以为每个特定存储桶指定不同的角色。您应该使用“前缀”约束并在之后列出所有目标前缀。比如“s3://dataaccountlogs/,s3://userlogs”。

注意:您应该严格使用 s3 协议,而不是 s3a。还有一些限制,你可以在这里找到: https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-s3-optimized-committer.html

  1. 使用 spark 的另一种方法是配置 Hadoop 以承担您的角色。推杆

    spark.hadoop.fs.s3a.aws.credentials.provider = "org.apache.hadoop.fs.s3a.AssumedRoleCredentialProvider,org.apache.hadoop.fs.s3a.auth.AssumedRoleCredentialProvider"

并配置你要使用的角色

spark.hadoop.fs.s3a.assumed.role.arn = arn:aws:iam::DataAccount:role/RoleA

这种方式现在更通用了,因为 EMR 提交者有各种限制。您可以在 Hadoop 文档中找到更多配置信息: https://hadoop.apache.org/docs/r3.1.1/hadoop-aws/tools/hadoop-aws/assumed_roles.html

【讨论】:

  • 没想过为此目的使用 AssumedRole,好技巧。它主要是为了让我们可以更好地测试权限问题,尤其是重命名或删除中途的失败。在 spark 中,这些选项都应该是spark.hadoop.fs.s3a....
  • 感谢@SteveLoughran。我固定在答案中。
  • @SteveLoughran 如果您需要为您的账户存储桶提供多个外部账户访问权限,您甚至不需要存储桶策略。您可以只向您账户中的角色提供访问所需存储桶的权限,并与多个账户共享该角色。
猜你喜欢
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 2017-10-14
  • 2021-01-19
  • 2012-11-23
相关资源
最近更新 更多