【发布时间】:2016-02-21 05:30:42
【问题描述】:
我们尝试使用spark-redshift 项目,遵循提供凭据的第三条建议。即:
IAM 实例配置文件:如果您在 EC2 上运行并通过身份验证 S3 使用 IAM 和实例配置文件,那么您必须配置 temporary_aws_access_key_id、temporary_aws_secret_access_key 和 要指向的temporary_aws_session_token 配置属性 通过 AWS Security Token Service 创建的临时密钥。这些 然后临时密钥将通过 LOAD 和 UNLOAD 传递给 Redshift 命令。
我们的 Spark 应用程序正在 EMR 集群中运行。为此,我们尝试从调用 getSessionToken 的该节点的内部实例中获取临时凭证,如下所示:
val stsClient = new AWSSecurityTokenServiceClient(new InstanceProfileCredentialsProvider())
val getSessionTokenRequest = new GetSessionTokenRequest()
val sessionTokenResult = stsClient.getSessionToken(getSessionTokenRequest);
val sessionCredentials = sessionTokenResult.getCredentials()
但这会抛出 403 Access Denied,即使 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 策略有什么严重错误吗?
谢谢!
【问题讨论】:
-
您能否提供有关您的解决方案的更多详细信息,例如您是否导入了任何附加包或我们使用 Java SDK?当我只是在spark-shell中使用上述语句时,它不知道AWSSessionCredentials是什么。
标签: amazon-web-services apache-spark amazon-redshift emr aws-sdk