![](/img/trans.png)
[英]Connect Redshift and Python without using aws credentials (running on emr)
[英]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.