aws memo

AWS関連の備忘録 (※本ブログの内容は個人的見解であり、所属組織及び企業の意見を代弁するものではありません。1年以上古いエントリは疑ってかかってください)

S3: バケットポリシーで特定のアカウントに対して参照可能にする

S3の利用方法としては静的Webサーバが便利で良く使われている。この場合、アクセス制御は基本的に全開にすることが多い。

一方、EMRの入出力で使用するバケットは、httpアクセスすることは少なく、特定のアカウントからのS3 APIでのアクセスのみ、というケースも多い。

 

例えば、以下の様にアカウントを跨いで、S3経由で非公開データ授受を行う場合などが考えられる。

f:id:understeer:20130327180231p:plain

S3のアクセス制御には、IAM、バケットポリシーACLがあるが、まずはバケットポリシーで設定してみる。

設定内容としては

・アカウント1111-2222-3333のS3バケット  s3://understeer を、アカウント1234-5678-9012が閲覧出来るようにする

・閲覧方法は、 GetObject  (各ファイルの取得・ダウンロード)および ListBucket (オブジェクト一覧表示)

とする

とはいえ、jsonフォーマットのポリシー定義をスクラッチで記述するのは大変なので、AWS Policy Generatorを使用する。

f:id:understeer:20130327181039p:plain

のように入力する。

・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を押下。以下のようになるはず。

f:id:understeer:20130327181459p:plain

 

 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"
        ]
      }
    }
  ]
}

f:id:understeer:20130327181450p:plain

 

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

f:id:understeer:20130327181915p:plain

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