超出 AWS Lambda 策略长度 - 向 lambda 函数添加规则
AWS Lambda Policy Length Exceeded - adding rules to a lambda function
我有一个网站可以动态创建附加了 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<some_arn_data>:rule/*
但是在功能仪表板上,在 CloudWatch Events 列表所在的下方,它只说:
The rule * could not be found.
有没有办法使权限适用于所有规则?
如果不是,是否有其他方法可以解决这个问题?
如果没有办法直接解决这个问题,我可以为网站上的每条记录创建一个单独的 lambda,而不是为所有指向一个 lambda 的每条记录创建单独的规则。有什么理由说创建一个单独的 lambda 会是个坏主意吗?例如,您可以拥有的 Lambda 函数数量是否有限制?
在许多情况下,Lambda 控制台创建了我认为是 Lambda 知道 "wired up" 触发函数的事件源的错觉。在某些情况下,例如 DynamoDB 流和 SQS,Lambda 服务 是 知道这些事情,因为它们会触发功能,因为 Lambda 服务的一部分实际上正在后台轮询这些服务,以便"consume" 他们——而其他服务在事件发生时将其推送到 Lambda(例如 S3、CloudWatch 事件)。
以下是我得出该结论的理由:
Event sources maintain the event source mapping, except for the poll-based services (Amazon Kinesis Data Streams, Amazon DynamoDB Streams and Amazon Simple Queue Service). For the poll-based services, AWS Lambda maintains the event source mapping.
https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html
对于其他来源,控制台本身似乎在进行 "discovery" API 调用以尝试将这些内容拼凑在一起以呈现给用户。
这似乎是该逻辑中的错误。
某些东西正在解析函数策略并错误地将 ArnLike
条件视为文字字符串匹配。本质上是一个表面错误,因为正如评论中提到的那样,该政策似乎确实按预期工作。
并且,此通配符策略可能是实现预期 objective 的最佳方式,尽管您可能希望更具体一些,在 *
之前使用字符串前缀。这是否有必要取决于有多少用户 and/or 角色被允许创建这些事件,以及您是否需要更细粒度的权限控制。
或者,应该可以做这样的事情:
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,您可以轻松地自动执行错误配置和 "misplace" 如果您的应用程序导致对策略文档的写入冲突,则可以自动生成 ARN。
我有一个网站可以动态创建附加了 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<some_arn_data>:rule/*
但是在功能仪表板上,在 CloudWatch Events 列表所在的下方,它只说:
The rule * could not be found.
有没有办法使权限适用于所有规则?
如果不是,是否有其他方法可以解决这个问题?
如果没有办法直接解决这个问题,我可以为网站上的每条记录创建一个单独的 lambda,而不是为所有指向一个 lambda 的每条记录创建单独的规则。有什么理由说创建一个单独的 lambda 会是个坏主意吗?例如,您可以拥有的 Lambda 函数数量是否有限制?
在许多情况下,Lambda 控制台创建了我认为是 Lambda 知道 "wired up" 触发函数的事件源的错觉。在某些情况下,例如 DynamoDB 流和 SQS,Lambda 服务 是 知道这些事情,因为它们会触发功能,因为 Lambda 服务的一部分实际上正在后台轮询这些服务,以便"consume" 他们——而其他服务在事件发生时将其推送到 Lambda(例如 S3、CloudWatch 事件)。
以下是我得出该结论的理由:
Event sources maintain the event source mapping, except for the poll-based services (Amazon Kinesis Data Streams, Amazon DynamoDB Streams and Amazon Simple Queue Service). For the poll-based services, AWS Lambda maintains the event source mapping.
https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html
对于其他来源,控制台本身似乎在进行 "discovery" API 调用以尝试将这些内容拼凑在一起以呈现给用户。
这似乎是该逻辑中的错误。
某些东西正在解析函数策略并错误地将 ArnLike
条件视为文字字符串匹配。本质上是一个表面错误,因为正如评论中提到的那样,该政策似乎确实按预期工作。
并且,此通配符策略可能是实现预期 objective 的最佳方式,尽管您可能希望更具体一些,在 *
之前使用字符串前缀。这是否有必要取决于有多少用户 and/or 角色被允许创建这些事件,以及您是否需要更细粒度的权限控制。
或者,应该可以做这样的事情:
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,您可以轻松地自动执行错误配置和 "misplace" 如果您的应用程序导致对策略文档的写入冲突,则可以自动生成 ARN。