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