EMRを使用して、別アカウントのS3バケットにアクセスしたい時があります。
ここでは例として、アカウントAのEMRからアカウントBのS3のログを集計して、アカウントBのS3バケットへ
出力してみます。

まず、アカウントBのS3バケットのACLを設定します。
方法は以前の記事「S3ってなんじゃ?(S3のログファイルを別アカウントでダウンロード)」と同じように
SDKで設定します。

$src = 'memorycraft-log';//入力ログバケット
$target = 'memorycraft-archive';//出力先バケット
$owner_canonical_id = 'オーナー(アカウントB)の標準ユーザーID';
$other_canonical_id = '別アカウント(アカウントA)の標準ユーザーID';
$s3 = new AmazonS3(array('key'=>'オーナーのアクセスキー','secret'=>'オーナーのシークレットキー');
$s3->set_region(AmazonS3::REGION_APAC_NE1);

$res = $s3->set_bucket_acl($src, array(
array('id' => AmazonS3::USERS_LOGGING, 'permission' => AmazonS3::GRANT_READ_ACP),
array('id' => AmazonS3::USERS_LOGGING, 'permission' => AmazonS3::GRANT_WRITE),
array('id' => $other_canonical_id, 'permission' => AmazonS3::GRANT_FULL_CONTROL),
array('id' => $owner_canonical_id, 'permission' => AmazonS3::GRANT_FULL_CONTROL),
));

$res = $s3->set_bucket_acl($target, array(
array('id' => $other_canonical_id, 'permission' => AmazonS3::GRANT_FULL_CONTROL),
array('id' => $owner_canonical_id, 'permission' => AmazonS3::GRANT_FULL_CONTROL),
));

このままの状態でEMR(Hive)で出力すると出力されたファイルは以下のようになります。

パーミッションがありません。
これは出力するファイル自体のパーミッションの設定がおかしいためです。
これに権限を追加するにはHiveの場合、HiveScriptの先頭に以下のコマンドを追加します。

set fs.s3.canned.acl=BucketOwnerFullControl;

再度実行すると、出力されたファイルにも権限が与えられているのがわかります。

この説明に関しては、最近日本語化されたEMRの公式ドキュメントにPigやカスタムJARの場合の対応法とともに
詳しく記載されています。

aws documentation : Amazon S3 に書き込むファイルにアクセス許可を設定

これで、アカウントをまたいだリソース集計が可能になります。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら