AWS Glue、Amazon EMR、または Amazon Athena から Amazon S3 リクエスタ支払いバケットにアクセスするにはどうすればよいですか?

最終更新日: 2021 年 11 月 29 日

AWS Glue、Amazon EMR、または Amazon Athena から Amazon Simple Storage Service (Amazon S3) リクエスタ支払いバケットにアクセスしたいと考えています。

簡単な説明

リクエスタ支払いがオンになっている S3 バケットにアクセスするには、バケットへのすべてのリクエストにリクエスタ支払いヘッダーが必要です。

解決方法

AWS Glue

デフォルトでは、Amazon S3 への AWS Glue リクエストにリクエスタ支払いヘッダーは含まれていません。このヘッダーがない場合、リクエスタ支払いバケットへの API コールは AccessDenied 例外で失敗します。ETL スクリプトにリクエスタ支払いヘッダーを追加するには、hadoopConfiguration().set() を使用して GlueContext 変数または Apache Spark セッション変数で fs.s3.useRequesterPaysHeader をオンにします。

GlueContext:

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

Spark セッション:

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

ETL スクリプトでヘッダーを使用する方法の例を次に示します。次の値を置き換えます。

database_name: データベースの名前 your_table_name: テーブルの名前 s3://awsdoc-example-bucket/path-to-source-location/: ソースバケットへのパス s3://awsdoc-example-bucket/path-to-target-location/: 宛先バケットへのパス

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

/usr/share/aws/emr/emrfs/conf/emrfs-site.xml で次のプロパティを設定します。

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

Athena

ワークグループのメンバーがリクエスタ支払いバケットをクエリできるようにするには、ワークグループを作成するときに [Enable queries on Requester Pays buckets in Amazon S3] (Amazon S3 のリクエスタ支払いバケットでクエリを有効にする) を選択します。詳細については、ワークグループの作成を参照してください。