【发布时间】:2017-08-20 21:07:12
【问题描述】:
在浏览大量页面(包括一些 SO 页面)提出一些建议(参见下面的列表)后,我仍然无法授予我的 APIGateway 访问权限,以通过 AWS CLI 命令行工具执行新添加的 Lambda 函数。
即我正在尝试复制这个:
我创建了一个新端点,具有以下集成设置:
只要我尝试测试它(从 API 网关控制台中),我就会得到这个
<AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
我知道这是因为,虽然我在方法中添加了 lambda 函数,但 APIGateway 策略仍未更新(图 1),因此存在权限问题。
如果我重新添加该功能并自动(通过 AWS GUI)允许权限,则测试和执行工作正常。
我正在尝试执行的当前 CLI 命令是这样的(通过 PS):
aws lambda add-permission --function-name xx-url --statement-id apigateway-perm-1 --action lambda:InvokeFunction --principal apigateway.amazonaws.com --s
ource-arn "arn:aws:execute-api:{REGION}:{AWS_ACCOUNT_ID}:{API_ID}/*/*"
上面arn地址我试过多个版本(包括/*/*|/{STAGE}/{METHOD}|/{STAGE}/{METHOD}/{RESOURCE})
我也尝试在这些更改前后部署 API,但没有效果?
PS - 我还阅读了将函数的集成类型更改为 POST 的建议(请参阅this URL),但我的要求是有一个 GET 方法,还有 -通过控制台手动添加此 GET 方法可以正常工作,因此,应该通过 CLI 工具执行相同操作。
网址列表(如果其他人正在寻找有关此问题/主题的一些资源):
更新 #1
我还可以确认,在将新创建的 get-policy 与现有的工作中进行比较后,它们看起来几乎相同(只是名称不同):
使用的 AWS CLI 命令:aws lambda get-policy --function-name {FunctionName}
已经生效的策略与新创建的策略的结果:
这让我怀疑这可能是我缺少的额外步骤。
编辑(根据请求)
测试屏幕截图 - 此日志继续显示 AccessDeniedException 错误。
以文本形式记录(为了便于阅读而缩短了一点):
请求测试请求的执行日志 2017 年 3 月 28 日星期二 22:59:40 UTC:开始执行请求:test-invoke-request 2017 年 3 月 28 日星期二 22:59:40 UTC:HTTP 方法:GET,资源路径:/api/v1/{path} 2017 年 3 月 28 日星期二 22:59:40 UTC:方法请求路径:{} 2017 年 3 月 28 日星期二 22:59:40 UTC:方法请求查询字符串:{fileName=x.doc} 2017 年 3 月 28 日星期二 22:59:40 UTC:方法请求标头:{} 2017 年 3 月 28 日星期二 22:59:40 UTC:转换前的方法请求正文: 2017 年 3 月 28 日星期二 22:59:40 UTC:端点请求 URI:https://lambda.ap-southeast-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:ap-southeast-2:{accountid}:function:xx-url/invocations 2017 年 3 月 28 日星期二 22:59:40 UTC:端点请求标头:{X-Amz-Date=20170328T240Z,x-amzn-apigateway-api-id={resouceId},Accept=application/json,Access-Control-Allow-来源=*,用户代理=AmazonAPIGateway_f,主机=lambda.ap-southeast-2.amazonaws.com,X-Amz-Content-Sha256=93438097f7627fe6203432b05e2257de86b32f74f8306,X-Amzn-Trace-Id=Root=1-58daeadc-bdd648f80d3584343 x-amzn-lambda-integration-tag=测试请求,授权=************************************ ***********d309e7,X-Amz-Source-Arn=arn:aws:execute-api:ap-southeast-2:{AccountId}:{resourceId}/null/GET/api/v1 /{path}, X-Amz-Security-Token=FQoDYXdzEDcaDAzSjIbAbD9j0wBjWFBxP++dR0+CGiK3flLOatlCr2 [截断] 2017 年 3 月 28 日星期二 22:59:40 UTC:转换后的端点请求正文:{"resource":"/api/v1/{path}","path":"/api/v1/{path}","httpMethod ":"GET","headers":null,"queryStringParameters":{"fileName":"x.doc"},"pathParameters":null,"stageVariables":null,"requestContext":{"accountId":" {AccountId}","resourceId":"{AccountId}:{resourceId}","stage":"test-invoke-stage","requestId":"test-invoke-request","identity":{"cognitoIdentityPoolId ":null,"accountId""{resourceId}","cognitoIdentityId":null,"caller":"ABPPLGO4:","apiKey":"test-invoke-api-key","sourceIp":"test-invoke -source-ip","accessKey":"ASHYYQ","cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":"arn:aws:sts::111:assumed-role/AWS-Admins/{name }","userAgent":"Apache-HttpClient/4.5.x (Java/1.8.0_112)","user":"AROZBPPLGO4:{name}"},"resourcePath":"/api/v1/{path} ","httpMethod":"GET","apiId":"{resourceId}"},"body":null,"isBase64Encoded":false} 2017 年 3 月 28 日星期二 22:59:40 UTC:转换前的端点响应正文:
<AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
2017 年 3 月 28 日星期二 22:59:40 UTC:端点响应标头:{x-amzn-RequestId=39398a3e-140a-11e7-92a3-3fdc0fbb61c2, Connection=keep-alive, Content-Length=130, Date=Tue , 2017 年 3 月 28 日 22:59:39 GMT} 2017 年 3 月 28 日星期二 22:59:40 UTC:由于配置错误,执行失败:Lambda 代理响应格式错误 2017 年 3 月 28 日星期二 22:59:40 UTC:方法已完成,状态为:502
这最终读取Malformed Lambda proxy response 的事实不是问题 - 我已经通过手动重新选择 lambda 函数来证明这一点,让权限被应用,立即重新测试并且一切正常,Lambda 甚至没有得到调用。
【问题讨论】:
-
您正在执行什么命令/代码生成“无法确定要授权的服务/操作名称”错误?如果您未能正确更新政策,预期的错误应该是 500 http 状态代码,类似于“内部服务错误”。
-
@BobKinney 我没有运行命令,在那个阶段我只是在 API 网关控制台(来自“测试”部分)中测试该方法。但是,如果我从 Postman 部署和测试,我会得到相同的结果 (502)。
-
这很不寻常,完全不是我所期望的。
-
我只是试图重现这个并得到预期的 500 错误。当您收到此错误时,您能否截取测试调用控制台的屏幕截图?
-
@BobKinney 截图已添加。您应该能够通过添加一个新方法 (GET) 来重现这一点,该方法通过 AWS CLI 工具使用 AWS_PROXY lambda。
标签: aws-lambda aws-sdk aws-api-gateway aws-cli