簡體   English   中英

如何在EMR實例中正確提供spark-redshift的憑據?

[英]How to properly provide credentials for spark-redshift in EMR instances?

我們嘗試使用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()

但是,即使具有sts:getSessionToken的策略應用於EMR實例的角色,也會拋出403 Access Denied

然后我們嘗試了以下兩種選擇。 首先,使用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策略的錯誤?

謝謝!

GetSessionToken API旨在由IAM用戶調用,如他們的文檔中所述:

返回AWS賬戶或IAM用戶的一組臨時憑證。

在第一個示例中,您使用EMR實例角色調用API,這是一個IAM角色( 這里解釋一些差異)。 在此特定情況下,EMR實例角色憑據是EMR代表您的實例獲取的會話憑據。

您的錯誤的具體措辭是什么? 如果它Cannot call GetSessionToken with session credentials ,那將確認以上所有內容。

當您將實例角色轉換為會話令牌時,它會起作用,因為如上所述,假設角色的憑據會話憑據,因此它才有效。

顯式調用AssumeRole沒有錯。 這正是EMR服務所做的。 將結果轉換為會話憑據也沒有任何問題,因為它們幾乎可以保證成為用例的會話憑據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM