[英]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 目录的跨账户访问。
所以问题场景是,账户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 中,
现在,如果您在账户 A 中运行 EMR 作业,您将看到该作业使用跨账户访问权限运行
它适用于我们的目的。 试试看
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.