Wie kann ich von AWS Glue, Amazon EMR oder Amazon Athena aus auf Amazon S3 Requester Pays-Buckets zugreifen?

Lesedauer: 2 Minute
0

Ich möchte über AWS Glue, Amazon EMR oder Amazon Athena auf einen Amazon Simple Storage Service (Amazon S3) Requester Pays-Bucket zugreifen.

Kurzbeschreibung

Um auf S3-Buckets zuzugreifen, für die Requester Pays aktiviert ist, müssen alle Anfragen an den Bucket den Header Requester Pays haben.

Lösung

AWS-Kleber

AWS Glue-Anfragen an Amazon S3 enthalten standardmäßig nicht den Header Requester Pays. Ohne diesen Header schlägt ein API-Aufruf an einen Requester Pays-Bucket mit einer AccessDenied-Ausnahme fehl. Um den Header Requester Pays zu einem ETL-Skript hinzuzufügen, verwenden Sie hadoopConfiguration ().set(), um fs.s3.useRequesterPaysHeader für die GlueContext-Variable oder die Apache Spark-Sitzungsvariable zu aktivieren.

GlueContext:

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

Spark-Sitzung:

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

Im Folgenden finden Sie ein Beispiel für die Verwendung des Headers in einem ETL-Skript. Ersetzen Sie die folgenden Werte:

database_name: der Name Ihrer Datenbank your_table_name: der Name Ihrer Tabelle s3://awsdoc-example-bucket/path-to-source-location/: der Pfad zum Quell-Bucket s3://awsdoc-example-bucket/path-to-target-location/: der Pfad zum Ziel-Bucket

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

Stellen Sie die folgende Eigenschaft in /usr/share/aws/emr/emrfs/conf/emrfs-site.xml ein:

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

Athena

Um Arbeitsgruppenmitgliedern die Abfrage von Requester Pays-Buckets zu ermöglichen, Abfrage von Requester Pays-Buckets in Amazon S3 aktivieren, wenn Sie die Arbeitsgruppe erstellen. Weitere Informationen finden Sie unter Erstellen einer Arbeitsgruppe.


Verwandte Informationen

Objekte in Requester Pays-Buckets herunterladen

Wie behebe ich Fehler 403 Access Denied von Amazon S3?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren