Come posso accedere ai bucket con Pagamento a carico del richiedente in Amazon S3 da AWS Glue, Amazon EMR o Amazon Athena?

2 minuti di lettura
0

Desidero accedere a un bucket con Pagamento a carico del richiedente in Amazon Simple Storage Service (Amazon S3) da AWS Glue, Amazon EMR o Amazon Athena.

Breve descrizione

Per accedere ai bucket S3 con Pagamento a carico del richiedente attivato, tutte le richieste al bucket devono avere l'intestazione Pagamento a carico del richiedente.

Soluzione

AWS Glue

Le richieste di AWS Glue ad Amazon S3 non includono l'intestazione Pagamento a carico del richiedente per impostazione predefinita. Senza questa intestazione, una chiamata API a un bucket con Pagamento a carico del richiedente genera un'eccezione AccessDenied. Per aggiungere l'intestazione Pagamento a carico del richiedente a uno script ETL, utilizza hadoopConfiguration().set() per attivare fs.s3.useRequesterPaysHeader nella variabile GlueContext o nella variabile di sessione Apache Spark.

GlueContext:

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

Sessione Spark:

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

L’esempio seguente mostra come utilizzare l'intestazione in uno script ETL. Sostituisci i seguenti valori:

database_name: il nome del database your_table_name: il nome della tabella s3://awsdoc-example-bucket/path-to-source-location/: il percorso del bucket di origine s3://awsdoc-example-bucket/path-to-target-location/: il percorso del bucket di destinazione

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

Imposta la seguente proprietà in /usr/share/aws/emr/emrfs/conf/emrfs-site.xml:

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

Athena

Per consentire ai membri del gruppo di lavoro di interrogare i bucket con Pagamento a carico del richiedente, scegli Abilita le query sui bucket con Pagamento a carico del richiedente in Amazon S3 quando crei il gruppo di lavoro. Per ulteriori informazioni, consulta Create a workgroup.


Informazioni correlate

Download di oggetti nei bucket con Pagamento a carico del richiedente

Come posso risolvere gli errori 403 Access Denied di Amazon S3?

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa