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から対象バケットの中身が閲覧のみ出来るようになるはず。