S3: バケットポリシーで特定のアカウントに対して参照可能にする
S3の利用方法としては静的Webサーバが便利で良く使われている。この場合、アクセス制御は基本的に全開にすることが多い。
一方、EMRの入出力で使用するバケットは、httpアクセスすることは少なく、特定のアカウントからのS3 APIでのアクセスのみ、というケースも多い。
例えば、以下の様にアカウントを跨いで、S3経由で非公開データ授受を行う場合などが考えられる。

S3のアクセス制御には、IAM、バケットポリシー、ACLがあるが、まずはバケットポリシーで設定してみる。
設定内容としては
・アカウント1111-2222-3333のS3バケット s3://understeer を、アカウント1234-5678-9012が閲覧出来るようにする
・閲覧方法は、 GetObject (各ファイルの取得・ダウンロード)および ListBucket (オブジェクト一覧表示)
とする
とはいえ、jsonフォーマットのポリシー定義をスクラッチで記述するのは大変なので、AWS Policy Generatorを使用する。

のように入力する。
・Principal : 権限付与するAWSアカウントID
・AWS Service: Amazon S3
・Actions: s3:GetObject
・ARN: arn:aws:s3:::understeer/*
とし、Add Statementを押下。続けて
・Principal : 権限付与するAWSアカウントID
・AWS Service: Amazon S3
・Actions: s3:ListBucket
・ARN: arn:aws:s3:::understeer
とし(ARNの末尾がバケット名で終わっていることに注意!)、AddStatementを押下。以下のようになるはず。

Statementが2つあるのは、GetObjectはバケット配下のオブジェクトに対する定義であり、ListBucketはバケットそのものに対する定義となるため。
ここで、 Generate Policyを押下すると、ポリシー定義したjson記述が表示されるので、コピーする。
ちなみに、上記設定で出力されるjsonは以下のようになる。
{
"Id": "Policy1364376133312",
"Statement": [
{
"Sid": "Stmt1364375260427",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::understeer/*",
"Principal": {
"AWS": [
"123456789012"
]
}
},
{
"Sid": "Stmt1364375280089",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::understeer",
"Principal": {
"AWS": [
"123456789012"
]
}
}
]
}

あとは、S3の画面にて、バケットのプロパティを表示し Permissions-> Edit bucket policyで上記jsonを入力し saveする。

うまく設定が行われていれば、アカウント1234-5678-9012配下のCloudBerryや s3cmdから対象バケットの中身が閲覧のみ出来るようになるはず。