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!
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. –