一部のRDSの情報の閲覧だけできるポリシーは作れなかった話

ポリシー作ってみた

協力会社の人が、「AWSのRDSのリソースの状況とか自分たちでリアルタイムで見たいから、マネジメントコンソールのアカウント欲しい」というので、特定のRDSの情報を見ることだけできるユーザを作ることに。

で、ポリシーの作成とかあまりやったことなかったので、AmazonRDSReadOnlyAccessのポリシーのJSONのResource"*"からARN指定に変えればいけるんじゃね? と思いコピペ&修正で新しいポリシーをJSONで作ってみる。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "rds:Describe*",
                "rds:ListTagsForResource",
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeVpcs"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:rds:ap-northeast-1:999999999999:db:rds-postgresql-test1",
                "arn:aws:rds:ap-northeast-1:999999999999:db:rds-postgresql-test2"
            ]
        },
        {
            "Action": [
                "cloudwatch:GetMetricStatistics",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

だめでした

このポリシーを付けたユーザでマネジメントコンソールにログインしたところ、怪しいメッセージが・・・。

アカウントの属性の取得に失敗しました。特定のコンソール機能に障害が発生している可能性があります。

RDSのインスタンス一覧を表示したところ、また違うエラーメッセージが。そして、一覧には何も表示されず。

User: arn:aws:iam::999999999999:user/testuser1 is not authorized to perform: rds:DescribeDBInstances 
(Service: AmazonRDS; Status Code: 403; Error Code: AccessDenied; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

その後、JSONの構造を変えてみたり、アクション名を足したり引いたりワイルドカードやめてみたりとかしたけど、何やってもエラーは変わらず。
もしかして、メッセージ通り何かの障害かもしれないと思い、サポートに問い合わせることに。

サポートの回答来た

英語で問い合わせたので、回答も英語。Google自動翻訳が以下の通り。

ポリシーのDescribe*権限は、コンソールからアクセスしたときのリソースレベル権限をサポートしていません。リソースレベルの権限とは、ユーザーがアクションを実行することを許可されているリソースを指定する機能を指します。サポートされていないアクション/権限は、すべてのリソース '*'で許可または拒否する必要があります。

たとえば、 'rds:DescribeDBInstances'を実行する権限があると言われているエラーの場合、 'rds-postgresql-test1'というリソースでこれを許可し、RDSコンソールを開くと、エラーが発生します。この理由は、RDSコンソールがすべてのリソースを記述し、単一のDBインスタンスだけを記述することができないためです。したがって、コンソールを介して 'rds:DescribeDBInstances'を呼び出すには、すべてのリソース '*'にアクセス権を許可する必要があります。

ということで、全てのアクションでリソース指定ができるわけじゃない、ということがわかりました。
DeleteDBInstanceのアクションとかだと指定できるみたいです。編集系だといけるんでしょうか。
AWSのドキュメントにも少し書いてました。

IAM と連携する AWS サービス

API がリソースレベルのアクセス権限をサポートしない場合、ポリシーのそのステートメントは Resource 要素で * を使用する必要があります。

可否の一覧とか無いと思ってググったけど、いい感じのは見つけられなかった。
そういうやり方ができない予感はしていたけど、出来ればポリシー作成時にエラーだして欲しかったぜ。

代替案あったら教えて

結局あきらめてすべてのRDSインスタンスのリードオンリー権限で作りました。
もしかしたら、タグで切り分けるとか他に方法があるかもしれません。
誰か知っていたら教えてください。