Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何在EMR实例中正确提供spark redshift的凭据?_Amazon Web Services_Apache Spark_Amazon Redshift_Emr_Aws Sdk - Fatal编程技术网

Amazon web services 如何在EMR实例中正确提供spark redshift的凭据?

Amazon web services 如何在EMR实例中正确提供spark redshift的凭据?,amazon-web-services,apache-spark,amazon-redshift,emr,aws-sdk,Amazon Web Services,Apache Spark,Amazon Redshift,Emr,Aws Sdk,我们试图使用该项目,遵循第三条提供凭证的建议。即: IAM实例配置文件:如果您在EC2上运行并通过身份验证 S3使用IAM和实例配置文件,则必须配置 临时aws访问密钥id、临时aws秘密访问密钥,以及 要指向的临时\u aws\u会话\u令牌配置属性 通过AWS安全令牌服务创建的临时密钥。这些 然后,临时密钥将通过加载和卸载传递给Redshift 命令 我们的Spark应用程序是从EMR集群运行的。为此,我们尝试从调用getSessionToken的节点实例内部获取临时凭据,如下所示: val

我们试图使用该项目,遵循第三条提供凭证的建议。即:

IAM实例配置文件:如果您在EC2上运行并通过身份验证 S3使用IAM和实例配置文件,则必须配置 临时aws访问密钥id、临时aws秘密访问密钥,以及 要指向的临时\u aws\u会话\u令牌配置属性 通过AWS安全令牌服务创建的临时密钥。这些 然后,临时密钥将通过加载和卸载传递给Redshift 命令

我们的Spark应用程序是从EMR集群运行的。为此,我们尝试从调用
getSessionToken
的节点实例内部获取临时凭据,如下所示:

val stsClient = new AWSSecurityTokenServiceClient(new InstanceProfileCredentialsProvider())        
val getSessionTokenRequest = new GetSessionTokenRequest()
val sessionTokenResult =  stsClient.getSessionToken(getSessionTokenRequest);
val sessionCredentials = sessionTokenResult.getCredentials()
但这会抛出
403访问被拒绝
,即使带有
sts:getSessionToken
的策略应用于EMR实例的角色

然后我们尝试了以下两种选择。首先,使用
AssumeRole
策略:

val p = new STSAssumeRoleSessionCredentialsProvider("arn:aws:iam::123456798123:role/My_EMR_Role", "session_name")
val credentials: AWSSessionCredentials = p.getCredentials
val token = credentials.getSessionToken
第二,从
InstanceProfileCredentialsProvider
强制转换结果:

val provider = new InstanceProfileCredentialsProvider()
val credentials: AWSSessionCredentials = provider.getCredentials.asInstanceOf[AWSSessionCredentials]
val token = credentials.getSessionToken
它们都能工作,但预期的工作方式是什么?铸造结果或添加
AssumeRole
策略是否有严重错误

谢谢

正如IAM用户在他们的文档中所说的那样,API将由IAM用户调用:

返回AWS帐户或IAM用户的一组临时凭据

在第一个示例中,您正在使用EMR实例角色调用API,该角色是IAM角色(将解释其中的一些差异)。在此特定情况下,EMR实例角色凭据是EMR代表您的实例获得的会话凭据

关于你的错误,具体的措辞是什么?如果是
,则无法使用会话凭据调用GetSessionToken
,这将确认上述所有操作

当您将实例角色强制转换为会话令牌时,它会起作用,因为如上所述,假定角色的凭据是会话凭据,所以它只起作用


显式调用AssumeRole没有什么错。这正是EMR服务在幕后所做的。将结果强制转换为会话凭据也没有什么错,因为它们几乎可以保证是您用例中的会话凭据。

n您能否提供有关解决方案的更多详细信息,比如您是否导入了任何附加包或我们的Java SDK?当我在spark shell中使用上述语句时,它不知道什么是AWSSessionCredentials。