J'essaie de lire des fichiers depuis S3 à l'aide de Pyspark en utilisant des informations d'identification de session temporaire mais je continue à obtenir l'erreur suivante :
Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: null, AWS Request ID: XXXXXXXX, AWS Error Code: null, AWS Error Message: Forbidden, S3 Extended Request ID: XXXXXXX
Je pense que le problème pourrait être que la connexion S3A doit utiliser org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider
afin d'intégrer le jeton de session en plus de la clé d'accès et de la clé secrète standard, mais même en définissant l'attribut fs.s3a.aws.credentials.provider
il tente toujours de s'authentifier avec la variable de configuration BasicAWSCredentialsProvider
. En regardant les journaux, je vois :
DEBUG AWSCredentialsProviderChain:105 - Loading credentials from BasicAWSCredentialsProvider
J'ai suivi les instructions ici pour ajouter les valeurs de configuration nécessaires, mais elles ne semblent pas faire de différence. Voici le code que j'utilise pour le configurer :
import os
import sys
import pyspark
from pyspark.sql import SQLContext
from pyspark.context import SparkContext
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk-pom:1.11.83,org.apache.hadoop:hadoop-aws:2.7.3 pyspark-shell'
sc = SparkContext()
sc.setLogLevel("DEBUG")
sc._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider")
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", os.environ.get("AWS_ACCESS_KEY_ID"))
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", os.environ.get("AWS_SECRET_ACCESS_KEY"))
sc._jsc.hadoopConfiguration().set("fs.s3a.session.token", os.environ.get("AWS_SESSION_TOKEN"))
sql_context = SQLContext(sc)
Pourquoi est-ce que TemporaryAWSCredentialsProvider
n'est pas utilisé ?