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?