¿Cómo puedo acceder a buckets de pagos por solicitante de Amazon S3 desde AWS Glue, Amazon EMR o Amazon Athena?

2 minutos de lectura
0

Quiero acceder a un bucket de pagos por solicitante de Amazon Simple Storage Service (Amazon S3) desde AWS Glue, Amazon EMR o Amazon Athena.

Breve descripción

Para acceder a buckets de S3 con la opción Pago por solicitante activada, todas las solicitudes al bucket deben llevar el encabezado «Pago por solicitante».

Resolución

AWS Glue

Las solicitudes de AWS Glue a Amazon S3 no incluyen el encabezado «Pago por solicitante» de forma predeterminada. Sin este encabezado, en una llamada a la API a un bucket de pago por solicitante se produce un error con la excepción «AccessDenied». Para añadir el encabezado «Pago por solicitante» a un script de ETL, utilice hadoopConfiguration().set() para activar fs.s3.useRequesterPaysHeader en la variable GlueContext o en la variable de la sesión de Apache Spark.

GlueContext:

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

Sesión de Spark:

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

A continuación, se muestra un ejemplo de cómo utilizar el encabezado en un script de ETL. Sustituya los siguientes valores:

database_name: nombre de su base de datos your_table_name: nombre de su tabla s3://awsdoc-example-bucket/path-to-source-location/: ruta al bucket de origen s3://awsdoc-example-bucket/path-to-target-location/: ruta al bucket de destino

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

Defina la siguiente propiedad en /usr/share/aws/emr/emrfs/conf/emrfs-site.xml:

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

Athena

Para permitir que los miembros del grupo de trabajo consulten los buckets de pago por solicitante, seleccione Habilitar consultas en buckets de pago por solicitante en Amazon S3 cuando cree el grupo de trabajo. Para obtener más información, consulte Creación de un grupo de trabajo.


Información relacionada

Descarga de objetos en buckets de pago por solicitante

¿Cómo puedo solucionar los errores 403 de acceso denegado de Amazon S3?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años