Comment accéder aux compartiments S3 Paiement par le demandeur depuis AWS Glue, Amazon EMR ou Athena ?

Dernière mise à jour : 08/07/2020

Comment accéder à un compartiment de type Paiement par le demandeur Amazon Simple Storage Service (Amazon S3) depuis AWS Glue, Amazon EMR ou Amazon Athena ?

Brève description

Pour accéder aux compartiments S3 pour lesquels le Paiement par le demandeur est activé, toutes les demandes envoyées au compartiment doivent avoir l'en-tête Paiement par le demandeur.

Solution

AWS Glue

Les demandes AWS Glue adressées à Amazon S3 n'incluent pas l'en-tête Paiement par le demandeur par défaut. Sans cet en-tête, un appel d'API vers un compartiment de type Paiement par le demandeur échoue avec une exception AccessDenied. Pour ajouter l'en-tête Paiement par le demandeur à un script ETL, utilisez hadoopConfiguration().set() pour activer fs.s3.useRequesterPaysHeader sur la variable GlueContext ou la variable de session Apache Spark.

GlueContext :

glueContext._jsc.hadoopConfiguration().set("fs.s3.useRequesterPaysHeader","true")

Session Spark :

spark._jsc.hadoopConfiguration().set("fs.s3.useRequesterPaysHeader","true")

Voici un exemple d'utilisation de l'en-tête dans un script ETL. Remplacez les valeurs suivantes :

database_name : par le nom de votre base de données
your_table_name : par le nom de votre table
s3://awsdoc-example-bucket/path-to-source-location/ : par le chemin d'accès au compartiment source
s3://awsdoc-example-bucket/path-to-target-location/ : par le chemin d'accès au compartiment de destination

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.dynamicframe import DynamicFrame

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

spark._jsc.hadoopConfiguration().set("fs.s3.useRequesterPaysHeader","true")
# glueContext._jsc.hadoopConfiguration().set("fs.s3.useRequesterPaysHeader","true")

##AWS Glue DynamicFrame read and write
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "your_database_name", table_name = "your_table_name", transformation_ctx = "datasource0")
datasource0.show()
datasink = glueContext.write_dynamic_frame.from_options(frame = datasource0, connection_type = "s3", connection_options = {"path":"s3://awsdoc-example-bucket/path-to-source-location/"}, format = "csv")

##Spark DataFrame read and write
df = spark.read.csv("s3://awsdoc-example-bucket/path-to-source-location/")
df.show()
df.write.csv("s3://awsdoc-example-bucket/path-to-target-location/")

job.commit()

Amazon EMR

Définissez la propriété suivante dans /usr/share/aws/emr/emrfs/conf/emrfs-site.xml :

<property>
   <name>fs.s3.useRequesterPaysHeader</name>
   <value>true</value>
</property>

Athena

Pour autoriser les membres du groupe de travail à interroger les compartiments de type Paiement par le demandeur, sélectionnez Activer les requêtes sur les compartiments de type Paiement par le demandeur dans Amazon S3 lorsque vous créez le groupe de travail. Pour plus d'informations, consultez la section Créer un groupe de travail.