Comment puis-je accéder aux compartiments Amazon S3 de type Paiement par le demandeur à partir d'AWS Glue, d'Amazon EMR ou d'Amazon Athena ?

Dernière mise à jour : 29/11/2021

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 comporter l'en-tête Paiement par le demandeur.

Résolution

AWS Glue

Les demandes AWS Glue adressées à Amazon S3 n'incluent pas, par défaut, l'en-tête Paiement par le demandeur. 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 : le nom de votre base de données your_table_name : le nom de votre table s3://awsdoc-example-bucket/path-to-source-location/ : le chemin d'accès au compartiment source s3://awsdoc-example-bucket/path-to-target-location/ : 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, veuillez consulter la section Créer un groupe de travail.