ここでは例として、アカウントAのEMRからアカウントBのS3のログを集計して、アカウントBのS3バケットへ出力してみます。
まず、アカウントBのS3バケットのACLを設定します。
方法は以前の記事と同じようにSDKで設定します。
S3ってなんじゃ?(S3のログファイルを別アカウントでダウンロード
$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の場合の対応法とともに詳しく記載されています。
http://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-s3-acls.html
これで、アカウントをまたいだリソース集計が可能になります。
以上です。