Wie kann ich von AWS Glue, Amazon EMR oder Amazon Athena aus auf Amazon S3 Requester Pays-Buckets zugreifen?
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
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 9 Monaten
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren