IAMでS3のbucketにアクセスできるユーザーを制限する

AWS ConsoleでAWS Identity and Access Management (IAM)が操作できるようになったので試してみました。しかし、APIを直接叩かなくなくてよくなったから簡単、ではなかったです。
いずれの方法にしろJSON形式のPolicyを定義する必要があります。AWS Policy Generatorもあるのですが、S3のAPIを使ったことがないと対象のリソースと操作(Action)をどう組み合わせると、どうなるかイメージしづらいです。

IAMでユーザーかグループを作成し、それに対してパーミッションを追加します。まずは、特定のbucketにアクセスできるパーミッションとして以下のようなPolicyを作りました。は実際には対象のbucket名です。このPolicyが正しいかは自信ありません...

{
  "Statement": [
    { // (1)
      "Action": "s3:ListAllMyBuckets",
      "Effect": "Allow",
      "Resource": "*"
    },
    { // (2)
      "Action": [
        "s3:ListBuckets"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket_name>"
    },
    { // (3)
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket_name>/*"
    }
  ]
}

基本はすべてDenyです。そこに必要な権限を付加していきます。
(1)で自分がアクセスできるBucketの一覧を取得できます。これは、bucket内での操作には直接必要ではないですが、AWS ConsoleやクライアントアプリケーションでBucketの一覧を取得するのに必要なようです。
(2)(3)でbucketの操作権限を付加しています。(2)のActionで"s3:*"とするだけでも良いように思えるのですが、、(3)のようにkey_nameとして*を指定しないとファイルの追加ができませんでした。(3)のActionはもう少し厳しくしたほうがよいと思います(PutObject/GetObject/DeleteObjectのみでもOKかも)。