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

所要時間2分
0

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 のリクエスタ支払いバケットでクエリを有効にする) を選択します。詳細については、ワークグループの作成を参照してください。


関連情報

リクエスタ支払いバケット内のオブジェクトのダウンロード

Amazon S3 から HTTP 403: Access Denied エラーをトラブルシューティングする方法

AWS公式
AWS公式更新しました 2年前
コメントはありません