ale*_*bit 9 amazon-web-services emr amazon-redshift apache-spark aws-sdk
我们尝试使用spark-redshift项目,遵循提供凭据的第3条建议.即:
IAM实例配置文件:如果您在EC2上运行并使用IAM和实例配置文件对S3进行身份验证,则必须配置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()
Run Code Online (Sandbox Code Playgroud)
但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
Run Code Online (Sandbox Code Playgroud)
第二,投射结果InstanceProfileCredentialsProvider:
val provider = new InstanceProfileCredentialsProvider()
val credentials: AWSSessionCredentials = provider.getCredentials.asInstanceOf[AWSSessionCredentials]
val token = credentials.getSessionToken
Run Code Online (Sandbox Code Playgroud)
他们都工作,但这是预期的方式吗?是否有关于投射结果或添加AssumeRole策略的错误?
谢谢!
GetSessionToken API 旨在由 IAM 用户调用,如他们的文档中所述:
返回 AWS 账户或 IAM 用户的一组临时凭证。
在第一个示例中,您使用 EMR 实例角色调用 API,该角色是 IAM 角色(此处解释了一些差异)。在这种特定情况下,EMR 实例角色凭证是 EMR 代表您的实例获取的会话凭证。
您的错误的具体措辞是什么?如果是Cannot call GetSessionToken with session credentials,那就证实了以上所有内容。
当您将实例角色转换为会话令牌时,它会起作用,因为如上所述,事实证明,假定角色的凭据是会话凭据,因此它会起作用。
显式调用 AssumeRole 没有任何问题。这正是 EMR 服务在幕后所做的事情。将结果转换为会话凭据也没有任何问题,因为它们几乎可以保证是您的用例中的会话凭据。
| 归档时间: |
|
| 查看次数: |
1318 次 |
| 最近记录: |