AccessDenied:无权执行 rds:DescribeDBInstances

Rob*_*sen 5 rds amazon-web-services aws-sdk

我想以编程方式列出我的 RDS 数据库实例和集群快照,因此我将以下 IAM 策略直接附加到我的一位用户:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ReadProdSnapshotsAndInstances",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBInstances",
                "rds:DescribeDBClusterSnapshots"
            ],
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

但是当我以该用户身份执行以下操作时(使用 AWS Node.js SDK)...

rds.describeDBInstances({}, (error, data) => {
    ...
});
Run Code Online (Sandbox Code Playgroud)

...我收到以下错误:

AccessDenied: User: arn:aws:iam::<accountId>:user/<userName> is not authorized to perform: rds:DescribeDBInstances
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?这似乎应该如此简单。

Joh*_*ley 2

您的策略对于显示 RDS 实例和集群快照是正确的。发布您的完整代码,以便我们了解问题所在。还要仔细检查您对凭据的使用。

注意:我没有测试 Aurora,仅测试 RDS SQL Server。

我通过 IAM 策略模拟器运行了您的策略。DescribeDBInstancesDescribeDBClusterSnapshots通过,而其他命令失败。

我创建了一个新用户“testusers3”。我已将您的策略​​附加给该用户。

我下载了该新用户的凭证,并使用 AWS CLI 创建了配置文件“testusers3”。

AWS CLI 命令aws --profile testusers3 rds describe-db-instances工作正常。其他命令如aws --profile testusers3 rds stop-db-instance --db-instance-identifier XXX失败则正确。

然后我编写了以下Python程序来测试。该程序可以正确显示我们的RDS实例。

import boto3
session = boto3.Session(profile_name='testusers3')
client = session.client('rds')
r = client.describe_db_instances();
for i in r['DBInstances']:
        print(i['DBInstanceIdentifier'], i['DBInstanceClass'], i['Endpoint']['Address'])
Run Code Online (Sandbox Code Playgroud)