我为API网关端点创建了2个授权程序。一个手动使用控制台,另一个使用boto3。 手动创建的那个很好,但是使用脚本创建的那个会产生主题行中提到的错误。如果您检查这两个授权者的内容,它们是相同的。
缺少的部分是什么?我不认为这是lambda的无效权限,因为它在手动配置时正在处理一个授权者。
The code for the same is as below:
response = client.create_authorizer(
restApiId=apiid,
name=authName,
type='TOKEN',
authType='custom',
authorizerUri=authorizerUri,
##arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:<AcctId>:function:CustomAuthorizer/invocations
identitySource='method.request.header.Authorization',
identityValidationExpression= '.*',
authorizerResultTtlInSeconds=300
)
The code for the same is as below:
response = client.create_authorizer(
restApiId=apiid,
name=authName,
type='TOKEN',
authType='custom',
authorizerUri=authorizerUri,
##arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:<AcctId>:function:CustomAuthorizer/invocations
identitySource='method.request.header.Authorization',
identityValidationExpression= '.*',
authorizerResultTtlInSeconds=300
)
获取错误: 7月18日星期一11:53:04 UTC 2016:由于配置错误导致执行失败:Lambda函数的权限无效 7月18日星期一11:53:04 UTC 2016:由于配置错误导致执行失败:授权程序错误 7月18日星期一11:53:04 UTC 2016:AuthorizerConfigurationException
答案 0 :(得分:0)
刚从这个兔子洞中掉下来,遇到了一个解决方案(使用boto3和python,希望它在不同的sdk中是相似的。)
问题是,当您通过控制台手动创建它时,会弹出一个窗口,要求启用api网关(确切地说是这个特定的授权者),以触发您用作授权者的lambda函数。通过sdk进行操作时,显然没有弹出窗口,因此未授权授权者调用该lambda。
您可以通过两种方式启用权限:
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Service": "apigateway.amazonaws.com"},"Action": "sts:AssumeRole"}]}
现在,当使用sdk创建自定义授权者时,您必须提供一个authorizerCredentials参数,该参数描述为“(字符串)将所需的凭证指定为API网关用于调用授权者的IAM角色。要指定IAM API网关承担的角色,请使用角色的Amazon资源名称(ARN)。要对Lambda函数使用基于资源的权限,请指定null。“
复制新创建的角色的arn,并将其用作authorizerCredentials参数的值。
中提琴!您现在有了一个自定义授权者,该授权者可以使用允许其调用lambda函数的角色!
(抱歉格式不正确,我不经常评论:D)
答案 1 :(得分:0)
您需要将基于资源的语句添加到您的 Lambda 的权限中,以允许您的网关调用它。正如@MichaelJoy 指出的那样,当您在弹出窗口中单击“创建”时,这会在控制台中处理。以编程方式执行此操作需要在创建授权方后执行第二步。
要通过 CLI 执行此操作,您可以执行以下操作(大概 boto3 具有所有相应的命令):
aws lambda add-permission --function-name 'arn:aws:lambda:us-west-2:<AcctId>:function:CustomAuthorizer' \
--action lambda:InvokeFunction --statement-id 'api_gateway' \
--principal apigateway.amazonaws.com --output text \
--source-arn "AUTHORIZER_ARN"
其中 AUTHORIZER_ARN 是您刚刚创建的授权方的 ARN。注意'api_gateway'的语句id是任意的。
您可以通过以下方式查看您的 Lambda 上所有基于资源的策略。尤其是如果您想检查您通过控制台添加的权限作为您需要以编程方式实现相同结果的工作示例,这可能会有所帮助:
aws lambda get-policy --function-name XXXX
如果您要更新现有的基于资源的权限,则需要先通过 remove-policy
命令将其删除
答案 2 :(得分:0)
如果您检查 CloudWatch Logs Insights 会有所帮助。
转到您的 lambda 函数,打开“监视器”部分。通读最后收到的日志。
就我而言,我在 lambda 方法处理程序地址上打错了字。这就是抛出错误的原因。
答案 3 :(得分:-1)
首先,使用API Gateway中的测试按钮确认您是否可以从中调用Lambda函数。这将确保API Gateway-to-Lambda连接正常工作。
要评估您的资源政策,您需要调用GetPolicy API;执行角色控制您的代码在Lambda中执行的操作,而不是谁可以调用它。那将是一个很好的下一次检查。
您还可以打开API网关登录,这是一种很好的方式,可以更深入地了解它为您做的事情。然后,这些日志将显示在Amazon CloudWatch Logs中,您可以在其中查看请求的流程。
如果你正在使用CORS,可能会错过一个设置(或两个:),所以我也会仔细检查它。直接向您的端点进行CURL(您可以使用其HTTP端点蓝图轻松地从Lambda进行测试)是将API直接“连接”到网站或其他应用程序之前的第一步。