所有していない Amazon S3 バケットにデータを書き込む方法 - Amazon EMR

所有していない Amazon S3 バケットにデータを書き込む方法

Amazon Simple Storage Service (Amazon S3) バケットにファイルを書き込むと、デフォルトではお客様以外はそのファイルを読むことができません。これは、自分専用のバケットにファイルを書き込むことが前提になっており、このデフォルト設定によってファイルのプライバシーを保護しています。

そのため、クラスターの実行時に出力を別の AWS ユーザーの Simple Storage Service (Amazon S3) バケットに書き込んで、その AWS ユーザーが出力を読み取れるようにするには、次の 2 つのことを実行する必要があります。

  • 他の AWS ユーザーが、その Simple Storage Service (Amazon S3) バケットへの書き込みアクセス許可をお客様に付与する。お客様が起動するクラスターはお客様の AWS 認証情報で実行されるため、起動したすべてのクラスターも、他の AWS ユーザーのバケットに書き込むことができます。

  • 他の AWS ユーザーに対して、お客様またはクラスターが Simple Storage Service (Amazon S3) バケットに書き込むファイルへの読み取りアクセス許可を設定する。この読み取りアクセス許可を設定する最も簡単な方法は、Simple Storage Service (Amazon S3) で事前定義されているアクセスポリシーのセットである既定アクセスコントロールリスト(ACL)を使用することです。

他の AWS ユーザーがお客様に他のユーザーの Simple Storage Service (Amazon S3) バケットにファイルを書き込むアクセス許可を付与する方法については、「Amazon Simple Storage Service ユーザーガイド」の「バケットのアクセス許可の編集」を参照してください。

お客様のクラスターが Simple Storage Service (Amazon S3) へのファイル書き込み時に既定の ACL を使用するようにするには、fs.s3.canned.acl クラスター設定オプションに、使用する既定の ACL を設定します。次の表に、現在定義されている既定 ACL のリストを示します。

既定 ACL 説明
AuthenticatedRead 所有者には Permission.FullControl が、GroupGrantee.AuthenticatedUsers グループには Permission.Read アクセスが与えられるように指定します。
BucketOwnerFullControl バケットの所有者に Permission.FullControl が与えられるように指定します。バケットの所有者は、オブジェクトの所有者と同じであるとは限りません。
BucketOwnerRead バケットの所有者に Permission.Read が与えられるように指定します。バケットの所有者は、オブジェクトの所有者と同じであるとは限りません。
LogDeliveryWrite アクセスログを作成できるように、所有者には Permission.FullControl が、GroupGrantee.LogDelivery グループには Permission.Write アクセスが与えられるように指定します。
Private 所有者に Permission.FullControl が与えられるように指定します。
PublicRead 所有者には Permission.FullControl が、GroupGrantee.AllUsers グループには Permission.Read アクセスが与えられるように指定します。
PublicReadWrite 所有者には Permission.FullControl が、GroupGrantee.AllUsers グループには Permission.Read および Permission.Write アクセスが与えられるように指定します。

クラスターの設定オプションを設定する方法は、実行するクラスターのタイプに応じてさまざまです。以下の手順では、一般的なケースでオプションを設定する方法を示します。

Hive で既定 ACL を使用してファイルを書き込むには
  • Hive のコマンドプロンプトで、クラスターが Simple Storage Service (Amazon S3) に書き込むファイルに対して設定する既定 ACL を fs.s3.canned.acl 設定オプションに設定します。Hive のコマンドプロンプトにアクセスするには、SSH を使用してマスターノード接続し、Hadoop のコマンドプロンプトに "Hive" と入力します。詳細については、「SSH を使用してプライマリノードに接続する」を参照してください。

    次の例では、fs.s3.canned.acl 設定オプションを BucketOwnerFullControl に設定することにより、Simple Storage Service (Amazon S3) バケットの所有者に対してファイルの完全なコントロールを許可しています。set コマンドでは大文字と小文字が区別され、引用符やスペースは使用できません。

    hive> set fs.s3.canned.acl=BucketOwnerFullControl; create table acl (n int) location 's3://acltestbucket/acl/'; insert overwrite table acl select count(*) from acl;

    例の最後の 2 行では、Simple Storage Service (Amazon S3) に保存されるテーブルを作成し、そのテーブルにデータを書き込みます。

Pig で既定 ACL を使用してファイルを書き込むには
  • Pig のコマンドプロンプトで、クラスターが Simple Storage Service (Amazon S3) に書き込むファイルに対して設定する既定 ACL を fs.s3.canned.acl 設定オプションに設定します。Pig のコマンドプロンプトにアクセスするには、SSH を使用してマスターノード接続し、Hadoop のコマンドプロンプトに "Pig" と入力します。詳細については、「SSH を使用してプライマリノードに接続する」を参照してください。

    次の例では、fs.s3.canned.acl 設定オプションを BucketOwnerFullControl に設定することにより、Simple Storage Service (Amazon S3) バケットの所有者に対してファイルの完全なコントロールを許可しています。set コマンドでは、既定 ACL 名の前にスペースを 1 つ挿入し、引用符は使用しません。

    pig> set fs.s3.canned.acl BucketOwnerFullControl; store some data into 's3://acltestbucket/pig/acl';
カスタム JAR で既定 ACL を使用してファイルを書き込むには
  • -D フラグを指定して Hadoop を使用して、fs.s3.canned.acl 設定オプションを設定します。これを次の例に示します。

    hadoop jar hadoop-examples.jar wordcount -Dfs.s3.canned.acl=BucketOwnerFullControl s3://mybucket/input s3://mybucket/output