AWS Lambda策略长度超出-向lambda函数添加规则

时间:2018-07-19 21:25:19

标签: python amazon-web-services aws-lambda boto amazon-cloudwatch

我有一个网站,可以动态创建附加了cron事件的规则。所有这些规则都与一个lambda函数相关联并调用一个lambda函数。

我正在使用python和boto3生成规则并将其应用于Lambda函数。 (如果看到我的生成规则和事件的python代码会有所帮助,我很乐意将其包含在此处。)


这一切都可行,但是在使用我的网站并创建了约68条规则后,出现此错误:

PolicyLengthExceededException: An error occurred (PolicyLengthExceededException) when calling the AddPermission operation: The final policy size (20642) is bigger than the limit (20480).

每次创建规则及其事件时,都需要向lambda的功能策略中添加权限,大约68条规则后,功能策略会变得太大。

我该如何解决?


以下是示例权限:

{
  "Sid": "<some_random_id_for_this_permission",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:<some_arn_id>:function:_MyFunction",
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "arn:aws:events<some_arn_id>:rule/my_rule_1"
    }
  }

AWS:SourceArn是规则的唯一值,因此我认为我可以使用*来授予所有规则的权限。因此,我尝试将AWS:SourceArn的值放入:

arn:aws:events<some_arn_data>:rule/*

但是在功能仪表板上的CloudWatch Events列表所在的位置,它只说了:

The rule * could not be found.


是否有一种方法可以授予适用于所有规则的权限?

如果没有,是否有其他解决方法?

如果没有直接解决此问题的方法,我可以为网站上的每条记录创建一个单独的lambda,而不是为所有指向一个lambda的记录创建单独的规则。有什么理由为什么创建一个单独的lambda将是一个坏主意?例如,您可以拥有的Lambda函数数量是否受到限制?

1 个答案:

答案 0 :(得分:3)

在许多情况下,Lambda控制台会造成一种幻觉,即Lambda意识到“连接”以触发功能的事件源。在某些情况下,例如DynamoDB流和SQS,Lambda服务 意识到这些事情,因为它们触发了功能,因为Lambda服务的一部分实际上是在后台轮询那些服务以便“消费”它们-当其他服务将它们的事件推送到Lambda时(例如S3,CloudWatch事件)。

这是我得出该结论的理由:

  

事件源维护事件源映射,但基于轮询的服务(Amazon Kinesis数据流,Amazon DynamoDB流和Amazon Simple Queue Service)除外。对于基于轮询的服务,AWS Lambda维护事件源映射。

     

https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html

对于其他来源,控制台本身似乎正在进行“发现” API调用,试图将这些东西拼凑在一起,以呈现给用户。

这似乎是该逻辑中的错误。

某项正在解析功能策略,并错误地将ArnLike条件视为文字字符串匹配。本质上是表面上的错误,因为正如评论中提到的那样,该政策似乎确实按预期起作用。

而且,尽管您可能想更具体一些,但通配符策略可能是实现预期目标的最佳方法,在*之前使用字符串前缀。是否必要,取决于允许多少用户和/或角色创建这些事件,以及是否需要更细粒度的权限控制。

或者应该可以执行以下操作:

Condition": {
    "ArnLike": {
      "AWS:SourceArn": [
        "arn:aws:events<some_arn_id>:rule/my_rule_1",
        "arn:aws:events<some_arn_id>:rule/my_rule_2",
        "arn:aws:events<some_arn_id>:rule/my_rule_3"
        ]
    }
}

但这仍然不能像通配符那样扩展,并且无需在外部存储这些ARN,如果您的应用程序引起对策略文档的写入冲突,您可以轻松地自动进行错误配置并“错位” ARN。