【问题标题】:spark s3 access without configuring keys and with only IAM role无需配置密钥且仅具有 IAM 角色即可触发 s3 访问
【发布时间】:2018-12-27 15:00:04
【问题描述】:

我在 AWS 上有一个 HDP 集群,我也有一个 s3(在其他帐户中),我的 hadoop 版本是 Hadoop 3.1.1.3.0.1.0-187

现在我想从 s3(在不同帐户中)读取并处理,然后将结果写入我的 s3(与集群相同的帐户)。

但是按照 HDP 指南Here 的说法,我只能配置我的帐户或其他帐户的一个密钥。

但在我的情况下,我想配置两个帐户密钥,那么该怎么做呢?

由于某些安全原因,其他帐户无法更改存储桶策略以添加在我的帐户中创建的 IAM 角色,因此我尝试如下访问

  1. 配置其他账户的密钥
  2. 为我的账户添加了 IAM 角色(它具有我的存储桶的访问策略)

但是当我尝试从 spark write 访问我的帐户 s3 时仍然出现以下错误

com.amazonaws.services.s3.model.AmazonS3Exception:状态代码:400,AWS 服务:Amazon S3

【问题讨论】:

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


    【解决方案1】:

    您需要使用 EC2 实例配置文件角色。它是附加到您的实例的 IAM 角色:https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html

    您首先创建一个具有允许 s3 访问权限的角色。然后您将该角色附加到您的 HDP 集群(EC2 自动扩展组和 EMR 都可以实现)。您不需要 IAM 访问密钥配置,尽管 AWS 仍然在后台为您执行此操作。这是 s3 “出站”访问部分。

    第二步,设置桶策略允许跨账户访问:https://docs.aws.amazon.com/AmazonS3/latest/dev/example-walkthroughs-managing-access-example2.html 您需要为不同账户中的每个存储桶执行此操作。这基本上是“入站”s3 访问权限部分。

    如果您的任何部分访问(即您的实例配置文件角色的权限、S3 存储桶 ACL、存储桶策略、公共访问阻止设置等)在权限链中被拒绝,您将遇到 400。 “入站”端有更多层。因此,如果您不是 IAM 专家,请尝试从非常开放的政策(使用“*”通配符)开始,然后缩小范围。

    【讨论】:

    • 好的,有没有办法以hadoop jceks文件格式添加多个key?
    • 根据 HDP(docs.hortonworks.com/HDPDocuments/HDP3/HDP-3.0.1/…),它确实支持实例配置文件角色。您可以尝试仅删除与访问密钥相关的所有属性块吗?使用实例配置文件角色的全部意义在于根本不用担心访问密钥。
    • 好的,有一个问题,其他账户安全团队告诉,它不可能更改他们的存储桶策略,因此我需要使用配置密钥和我的账户 s3 访问其他账户和实例配置文件角色,所以这可能吗?
    • 只要您的帐户已经在他们的存储桶策略中列入白名单,就可以了。否则,他们必须修改存储桶策略,以便您的帐户不会在他们的存储桶端被阻止。如果他们不这样做,你的任务是不可能的——访问密钥也不会改变这个事实。
    【解决方案2】:

    如果我没听错的话

    1. 您希望您的 EC2 虚拟机访问 IAM 角色无权访问的 S3 存储桶
    2. 您有一组外部 S3 存储桶的 AWS 登录详细信息(登录名和密码)

    HDP3 有一个默认的身份验证链,按顺序

    1. 每个存储桶的秘密。 fs.s3a.bucket.NAME.access.key, fs.s3a.bucket.NAME.secret.key
    2. 配置范围的秘密fs.s3a.access.key, fs.s3a.secret.key
    3. 环境变量AWS_ACCESS_KEYAWS_SECRET_KEY
    4. IAM 角色(它对 169.something 服务器执行 HTTP GET,该服务器至少每小时一次提供一组新的 IAM 角色凭证)

    您需要在这里尝试的是仅为外部源(在 core-site.xml 的所有节点上的 JCEKS 文件中,或在 spark 默认值中)设置一些每个存储桶的机密。例如,如果外部桶是s3a://external,你会有

    spark.hadoop.fs.s3a.bucket.external.access.key AKAISOMETHING spark.hadoop.fs.s3a.bucket.external.secret.key SECRETSOMETHING

    HDP3/Hadoop 3 可以毫无问题地处理同一个 JCEKS 文件中的 >1 个密钥。 HADOOP-14507。我的代码。旧版本允许您将 username:secret 放在 URI 中,但这是一个安全问题(所有内容都会记录这些 URI,因为它们不被视为敏感),该功能现在已从 Hadoop 中删除。坚持使用每个存储桶秘密的 JCEKs 文件,为您自己的数据回退到 IAM 角色

    请注意,您可以修改身份验证列表以进行排序和行为:如果您添加使用 TemporaryAWSCredentialsProvider,那么它也将支持会话密钥,这通常很方便。 <property> <name>fs.s3a.aws.credentials.provider</name> <value> org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider, org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider, com.amazonaws.auth.EnvironmentVariableCredentialsProvider, org.apache.hadoop.fs.s3a.auth.IAMInstanceCredentialsProvider </value> </property>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2016-07-10
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2021-01-30
      相关资源
      最近更新 更多