AWS Glue、Amazon EMR、または Athena から S3 リクエスタ支払いバケットにアクセスする方法を教えてください。

最終更新日: 2020 年 7 月 8 日

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

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