AWS Lambda未被授权执行权限列表中列出的操作。

8

我有一个非常简单的 AWS Lambda 函数 - 只是列出我所有的 CloudWatch 事件:

import boto3

def lambda_handler(event, context):
    client = boto3.client("events")
    return client.list_rules()

然而,当我尝试运行它(使用空的测试事件:{})时,我遇到了以下权限异常:

An error occurred (AccessDeniedException) when calling the ListRules operation:
User: arn:aws:sts::123321123321:assumed-role/lambda+basicEvents/lambdaName 
is not authorized to perform: events:ListRules 
on resource: arn:aws:events:eu-west-1:123321123321:rule/*

我已将此策略附加到 Lambda 执行角色上(我可以在 Lambda 的权限选项卡中看到列出的操作):

{
  "document": {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Sid": "BasicCloudWatchEventsManager",
        "Effect": "Allow",
        "Action": [
          "events:DescribeRule",
          "events:EnableRule",
          "events:PutRule",
          "events:ListRules",
          "events:DisableRule"
        ],
        "Resource": "arn:aws:events:*:*:rule/[*/]*"
      }
    ]
  },
  "name": "BasicCloudWatchEventsManager",
  "id": "SOME7LONG7ID",
  "type": "managed",
  "arn": "arn:aws:iam::123321123321:policy/BasicCloudWatchEventsManager"
}

我使用提供的可视化编辑器进行策略构建,仅手动更改了sid

有什么线索可能丢失了吗?


1
这可能是SCP(如果您在使用AWS组织的环境中)或权限边界生效。您尝试过https://policysim.aws.amazon.com/进行验证吗? - Michael Hausenblas
@MichaelHausenblas 我是在我的AWS账户上运行的,没有设置策略限制。以前不知道policysim,现在尝试了一下 - 被拒绝 Implicitly denied (no matching statements) - Faboor
1
明白了。在使用策略模拟器时,您是否提供了资源 ARN? - Michael Hausenblas
1
@MichaelHausenblas,我不想提供特定的ARN,因为我想列出所有的规则,甚至是我计划未来创建的规则。但当我尝试使用特定的arn或更改为“ "Resource": "*"`时,它可以工作-这使我得出了我发布的答案。感谢您的帮助!policysim是一个很好的提示。 - Faboor
1个回答

16

经历了很多挫折后,我终于弄清楚了。 在可视化策略编辑器中,将资源选择为任何规则,添加ARN并选择所有选项中的"任何",将在策略中添加此行:

"Resource": "arn:aws:events:*:*:rule/[*/]*"

这意味着:

  • 一个事件资源
  • 在任何 (*) 区域
  • 在任何账户
  • 在任何事件总线上,如果规则属于其中之一(这是 [*/] 的部分)
  • 使用任何名称

然而,看起来 Amazon 的逻辑有些问题,可选部分不起作用,可能被字面理解。因此,我必须将其更改为:

"Resource": "arn:aws:events:*:*:rule/*"

有了这个,它可以无问题地运行。


2
好的发现!- 为我节省了很多麻烦 - Tim
我尝试使用 "Resource": "*",也可以正常运行。 - zeh
无法将其设置为“arn:aws:events:::rule/”,因为它会自动更正以删除最后一个“”。 - Josep Alsina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接