9

Wir haben versucht, das spark-redshift Projekt zu verwenden, nach der dritten Empfehlung für die Bereitstellung der Anmeldeinformationen. Nämlich:Wie können die Anmeldeinformationen für die Funkenreduktion in EMR-Instanzen ordnungsgemäß bereitgestellt werden?

IAM Instanz Profile: Wenn Sie auf EC2 ausführen und authentifizieren zu S3 mit IAM und Instanzprofile, dann müssen Sie müssen konfigurieren, dass die temporary_aws_access_key_id, temporary_aws_secret_access_key und temporary_aws_session_token Konfigurationseigenschaften weisen auf temporäre Schlüssel, die über den AWS Security Token Service erstellt wurden. Diese temporären Schlüssel werden dann über die Befehle LOAD und UNLOAD an Redshift übergeben.

Unsere Spark-Anwendung wird von einem EMR-Cluster ausgeführt. Zu diesem Zweck haben wir versucht, temporäre Anmeldeinformationen aus dem Inneren Instanzen dieses Knotens getSessionToken wie dieser Aufruf zu erhalten:

val stsClient = new AWSSecurityTokenServiceClient(new InstanceProfileCredentialsProvider())   
val getSessionTokenRequest = new GetSessionTokenRequest() 
val sessionTokenResult = stsClient.getSessionToken(getSessionTokenRequest); 
val sessionCredentials = sessionTokenResult.getCredentials() 

Aber das wirft 403 Access Denied, auch wenn die Politik mit sts:getSessionToken auf die Rolle der Instanzen von EMR angewandt wird.

Dann haben wir die folgenden zwei Alternativen ausprobiert. Zuerst mit der AssumeRole Politik:

val p = new STSAssumeRoleSessionCredentialsProvider("arn:aws:iam::123456798123:role/My_EMR_Role", "session_name") 
val credentials: AWSSessionCredentials = p.getCredentials 
val token = credentials.getSessionToken 

und zweitens das Ergebnis aus InstanceProfileCredentialsProvider Gießen:

val provider = new InstanceProfileCredentialsProvider() 
val credentials: AWSSessionCredentials = provider.getCredentials.asInstanceOf[AWSSessionCredentials] 
val token = credentials.getSessionToken 

Beide arbeiten, aber das ist die erwartete Art und Weise, dies zu tun? Gibt es etwas schrecklich falsches, das Ergebnis zu übertragen oder die Richtlinie AssumeRole hinzuzufügen?

Danke!

+0

Können Sie mehr Details zu Ihren Lösungen bereitstellen, wie haben Sie zusätzliche Pakete oder das Java SDK importiert?Wenn ich nur die obigen Anweisungen in Spark-Shell verwende, weiß es nicht, was AWSSessionCredentials ist. –

Antwort

1

Die GetSessionToken API soll von IAM-Benutzer aufgerufen werden, wie gesagt in ihren docs:

Gibt einen Satz von temporären Anmeldeinformationen für ein AWS-Konto oder IAM Benutzer.

An Ihrem ersten Beispiel rufen Sie die API Ihre EMR Instanz Rolle verwenden, die eine IAM-Rolle ist (einige der Unterschiede erläutert here). In diesem speziellen Fall handelt es sich bei den EMR-Instanzrollenanmeldeinformationen um Sitzungsanmeldeinformationen, die im Auftrag der Instanz von EMR abgerufen werden.

Was ist die spezifische Formulierung auf Ihrem Fehler? Wenn es Cannot call GetSessionToken with session credentials ist, würde das alles oben bestätigen.

Wenn Sie Ihre Instanzrolle in ein Sitzungstoken umwandeln, funktioniert es, da, wie oben erläutert, die Anmeldeinformationen einer angenommenen Rolle Sitzungsanmeldeinformationen sind.

Es ist nichts falsch daran, AssumeRole explizit aufzurufen. Genau das tut der EMR-Service unter der Haube. Es ist auch nicht falsch, Ihre Ergebnisse in die Sitzungsanmeldeinformationen zu übertragen, da sie in Ihrem Anwendungsfall ziemlich sicher Sitzungs-Anmeldeinformationen sind.