【问题标题】:Unable to call describe_db_instances in aws lambda due to permission issue由于权限问题,无法在 aws lambda 中调用 describe_db_instances
【发布时间】:2019-12-14 23:05:40
【问题描述】:

我希望能够运行以下代码:

rds = boto3.client("rds")
filters = [{
    "Name": "tag:Name",
    "Values": [f"*-{DB_SUFFIX}"]
}]
to_drop_dbs = rds.describe_db_instances(Filters=filters)

为了选择具有共同后缀的数据库标识符列表。

我在尝试运行时遇到了这个错误

调用 DescribeDBInstances 时发生错误 (AccessDenied) 操作: 用户: arn:aws:sts::888999792464:assumed-role/dev.lambda/list-all-dbs 不是 授权执行:rds:DescribeDBInstances: ClientError

这是我在 terraform 中的 lambda 函数的政策声明。

{   
    "Version": "2012-10-17",   
    "Statement": [  {
      "Effect": "Allow",
       "Action": [
         "rds:DescribeDBInstances"
       ],
       "Resource": [
         "arn:aws:rds:${var.region}:${local.account_id}:db:*"
      ]
     }]
 }

我在策略模拟器中尝试了该策略。它也失败了,没有资源可以指定。

我的问题:

如何修正我的政策?

【问题讨论】:

    标签: python aws-lambda terraform amazon-rds


    【解决方案1】:

    对于您在策略中描述的操作(即 rds:DescribeDBInstances),不能有资源级权限。

    也就是说,您不能像尝试那样将操作限制为区域或本地帐户,策略中资源的值必须为“*”。

    {   
        "Version": "2012-10-17",   
        "Statement": [  {
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBInstances"
            ],
            "Resource": [
                "*"
            ]
        }]
    }
    

    使用策略模拟器时,您可以判断何时可以修改字段值,因为您将能够在模拟中编辑该字段。

    以下是尝试修改 rds:DescribeDBInstances 和 logs:GetLogEvents 的资源值时发生的屏幕截图。

    可以为 GetLogEvents 修改资源模拟字段,因为该策略可以应用于单个日志组和流。

    但无法修改 DescribeDBInstances 的资源模拟字段,因为该策略不能应用于单个资源或资源子集。要么全有,要么全无。

    来自How Amazon RDS Works with IAM - Resources

    某些 RDS API 操作(例如用于创建资源的操作)不能 在特定资源上执行。在这些情况下,您必须使用 通配符 (*)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      相关资源
      最近更新 更多