【问题标题】:How to properly provide credentials for spark-redshift in EMR instances?如何在 EMR 实例中正确提供 spark-redshift 的凭据?
【发布时间】: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


【解决方案1】:

GetSessionToken API 旨在由 IAM 用户调用,如他们的文档中所述:

为 AWS 账户或 IAM 用户返回一组临时凭证。

在您的第一个示例中,您使用 EMR 实例角色调用 API,这是一个 IAM 角色(解释了一些差异here)。在这种特定情况下,EMR 实例角色凭证是 EMR 代表您的实例获取的会话凭证。

您的错误的具体措辞是什么?如果是Cannot call GetSessionToken with session credentials,就可以确认以上所有。

当您将实例角色转换为会话令牌时,它会起作用,因为如上所述,事实证明假定角色的凭据会话凭据,因此它可以正常工作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 2011-12-09
    • 1970-01-01
    • 2017-06-05
    • 2019-02-16
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    相关资源
    最近更新 更多