繁体   English   中英

Spark 是否允许使用 Amazon Assumed Role 和 STS 临时凭证在 EMR 上进行 Glue 跨账户访问

[英]Does Spark allow to use Amazon Assumed Role and STS temporary credentials for Glue cross account access on EMR

我们正在尝试使用 EMR spark 作业连接到跨账户 AWS Glue 目录。 我做了一项研究,AWS 以两种方式支持 Glue 目录的跨账户访问。

  1. IAM基于角色。 (这对我不起作用)
  2. 基于资源的政策。 (这对我有用)

所以问题场景是,账户A使用其角色role_Account_A创建EMR 角色role_Account_A想要访问账户 B 的胶水目录

  • 账户 A 创建角色为 role_Account_A的 EMR 集群
  • 帐户 B 具有角色role_Account_B ,它可以访问受信任实体中的 glue 和 s3 和role_Account_A
  • role_Account_A具有资源role_Account_B的 sts:AssumeRole 策略
  • 使用 sdk,我们能够从role_Account_A承担角色role_Account_B并获得临时凭证。
  • EMR 具有配置 [{"classification":"spark-hive-site","properties":{"hive.metastore.glue.catalogid":"Account_B", "hive.metastore.client.factory.class": "com .amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"}}]
    SparkSession sparkSession=SparkSession.builder().appName("testing glue")
                .enableHiveSupport()
                .getOrCreate();
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider");
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.access.key", assumedcreds.getAccessKeyId());
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.secret.key", assumedcreds.getSecretAccessKey());
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.session.token", assumedcreds.getSessionToken());
sparkSession.sparkContext().conf().set("fs.s3a.access.key",  assumedcreds.getAccessKeyId());
sparkSession.sparkContext().conf().set("fs.s3a.secret.key",  assumedcreds.getSecretAccessKey());
sparkSession.sparkContext().conf().set("fs.s3a.session.token", assumedcreds.getSessionToken());
sparkSession.sql("show databases").show(10, false);

我们得到的错误是

    Caused by: MetaException(message:User: arn:aws:sts::Account_A:assumed-role/role_Account_A/i-xxxxxxxxxxxx is not authorized to perform: glue:GetDatabase on resource: arn:aws:glue:XX-XXXX-X:Account_B:catalog 
because no resource-based policy allows the glue:GetDatabase action (Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: X93Xbc64-0153-XXXX-XXX-XXXXXXX))

问题:-

  • spark 是否支持基于胶水的身份验证属性,例如 aws.glue.access.key?
  • 根据错误,spark 未使用代入角色 role_Account_B。 它使用创建 EMR 的 role_Account_A。 我们可以让它使用代入角色 role_Account_B 吗?

如果我遗漏了什么,我会更新问题的详细信息。

你找到解决方案了吗? 我面临着完全相同的问题! 谢谢

我相信您在账户 A 中拥有 EMR 实例配置文件角色。如果是这样,您将必须遵循这些并且跨账户访问应该有效

在帐户 B 中,

  1. 在 Glue 下,转到设置并将(EMR 实例配置文件角色 A)添加为主体,并提供对帐户 B 的胶水和 S3 的访问权限。 建议只为你需要访问的buckets提供
  2. 转到粘合表将使用的存储桶的存储桶策略,并将(EMR 实例配置文件角色 A)添加为委托人并提供读/写访问权限。

现在,如果您在账户 A 中运行 EMR 作业,您将看到该作业使用跨账户访问权限运行

它适用于我们的目的。 试试看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM