【问题标题】:AWS Lambda Policy Length Exceeded - adding rules to a lambda functionAWS Lambda Policy Length Exceeded - 向 lambda 函数添​​加规则
【发布时间】:2018-12-28 03:22:18
【问题描述】:

我有一个网站可以动态创建附加了 cron 事件的规则。所有这些规则都关联并调用单个 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 的 Function Policy 添加权限,大约 68 条规则后,Function Policy 变得过大。

我该如何解决这个问题?


这是一个示例权限:

{
  "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&lt;some_arn_data&gt;:rule/*

但在功能仪表板上,在 CloudWatch 事件列表所在的位置,它只说:

The rule * could not be found.


有没有办法让权限适用于所有规则?

如果没有,有没有其他方法可以解决这个问题?

如果没有办法直接解决这个问题,我可以为网站上的每条记录创建一个单独的 lambda,而不是为每个都指向一个 lambda 的记录创建单独的规则。有什么理由为什么创建一个单独的 lambda 会是一个坏主意?比如你可以拥有的 Lambda 函数的数量是否有限制?

【问题讨论】:

  • 第一个问题:控制台显示错误,但rule/* 真的有效吗? ArnLike 暗示 like 与通配符匹配,所以这听起来有点像控制台有点过于“有用”并显示一个实际上不存在的虚构错误。
  • 哈,它确实有效。我所有的 cron 事件每天触发一次,所以我从来没有真正去测试它们。我做了一个每分钟运行一次,结果他们确实运行了。由于该规则没有显示在该函数的云事件列表中,而是显示了一个错误,所以我认为它不起作用。我猜亚马逊需要在他们的 lambda 函数上修复他们的 GUI 仪表板逻辑。谢谢!如果你想把它作为答案,我很乐意接受。

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


【解决方案1】:

我认为 Lambda 控制台在许多情况下会造成一种错觉,即 Lambda 知道“已连接”以触发函数的事件源。在某些情况下,例如 DynamoDB 流和 SQS,Lambda 服务知道这些事情,因为它们会触发函数,因为 Lambda 服务的一部分实际上是在后台轮询这些服务以“使用”它们——而其他服务在它们发生时将它们的事件推送到 Lambda(例如 S3、CloudWatch 事件)。

这是我对这个结论的理由:

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

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

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

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

某些东西正在解析函数策略并将ArnLike 条件错误地视为文字字符串匹配。本质上是一个表面上的错误,因为正如 cmets 中提到的那样,该策略似乎确实按预期工作。

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

应该可以做这样的事情:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2017-02-22
    • 2020-01-08
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多