IAM制御について設計をしていたところ、制約が見つかった。この仕様ってかなりイマイチだと思うのだけど、みんなどうしているのだろうか?
IAM設計方針
IAMからはリソース指定はせずに、S3全体に対しての制御を緩めに設定して、アクセスされるBucket Policy側でIAM GroupやIAM Roleベースの細かい制御をPrincipal指定で行おうと思ったのです。共有フォルダのアクセス権限なんかをイメージすると、アクセスされるバケット側を見れば、権限が書いてある実装の方が管理しやすいのではないかと。バケットを追加する度に、IAMポリシーを修正するのは設定ミスによる影響範囲も大きくなるのではないか、って考えるのって普通じゃない?
Principal指定の仕様
そこで、こんなバケットポリシーを設定したかったのです。
{ "Statement": [ { "Action": "s3:*", "Effect": "Allow", "Resource": "arn:aws:s3:::s3-test-bucket/*", "Principal": { "AWS": [ "arn:aws:iam::000011112222:group/Administrators" ] } } ] }
設定しようとすると、以下のようなエラーが出たのです。
Invalid principal in policy - "AWS" : "arn:aws:iam::000011112222:group/Administrators"
動作確認をしたところ、IAM RoleでもIAM Userでも設定できるのに、IAM Groupだけが指定不可。結局こんな情報に行き着きました。2011年時点から存在する問題だったとは。こんな仕様が許されるはずがないと、AWSサポートにもかけあってみたけど、あっさりと断られました。
この仕様については、SQSとかも同じ挙動のようです。DynamoDBでは、テーブル側でポリシー設定はできなさそうだし、逆にIAM側に全て書くのが正解なのかなとも思いつつ、とても悲しかったのでブログにも書いてみました。