通过 SDK 获得权限的 AWS Lambda 函数调用策略问题

Posted

技术标签:

【中文标题】通过 SDK 获得权限的 AWS Lambda 函数调用策略问题【英文标题】:Problems with AWS Lambda function invocation policy with permission via SDK 【发布时间】:2017-07-17 13:08:44 【问题描述】:

我遇到了一个非常奇怪的问题。我正在使用 boto3 为 Lambda 函数创建 API Gateway 代理。我可以在 API Gateway 控制台中创建 Method,它会通知我 API Gateway 将被授予调用该函数的权限。这很好用。

但是,如果我使用 SDK (lambda.add_permission) 创建 API 网关方法,则会收到此异常:

Execution failed due to configuration error: Invalid permissions on Lambda function

我已确认我创建的策略与控制台向导创建的策略完全相同,因此我对正在发生的事情以及 API 无法调用该函数的原因感到非常困惑。这是我附加的权限:


    "Policy": "\"Version\":\"2012-10-17\",\"Id\":\"default\",\"Statement\":[\"Sid\":\"1ac63c2c972f3cbdbcf0f4b0038133e2\",\"Effect\":\"Allow\",\"Principal\":\"Service\":\"apigateway.amazonaws.com\",\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:REGION:ACCOUNT:function:FUNCTION_NAME\",\"Condition\":\"ArnLike\":\"AWS:SourceArn\":\"arn:aws:execute-api:REGION:ACCOUNT:API_ID/*/*/*\"]"

似乎其他人也遇到过类似的问题,但这些解决方案是我已经尝试过的:

https://forums.aws.amazon.com/thread.jspa?threadID=217254&tstart=0

【问题讨论】:

【参考方案1】:

TL;WR:通过 CLI 或 SDK 向函数版本添加权限时指定函数版本的 ARN。

在对 CLI 和 API 网关控制台进行了大量操作之后,我终于弄明白了。因为我是动态更新我的 Lambda 函数,所以每次更新时它都会创建版本号。当我在方法中创建 API 网关请求时,我将它指向该函数的特定 version,然后我正在更新 latest 版本的策略而不是那个 版本的政策。在控制台向导中,它不会使用版本号,因此策略是正确的......

想明白是多么痛苦啊!应该有更好的文档记录!

【讨论】:

以上是关于通过 SDK 获得权限的 AWS Lambda 函数调用策略问题的主要内容,如果未能解决你的问题,请参考以下文章

访问 AWS Lambda 的 Amazon CloudWatch 日志

如何在 AWS Lambda 中运行 AWS SDK Opsworks 命令?

AWS lambda 类似于 Haskell 函数的执行

AWS Lambda:如何为具有 VPC 访问权限的 lambda 函数设置 NAT 网关

Lambda 代入具有细粒度权限的 AWS IAM 角色

如何在 lambda 函数中包含 javascript aws-sdk?