在涉及大量页面(包括一些SO)之后提出了一些建议(参见下面的列表),我仍然无法通过AWS CLI命令行工具授予我的APIGateway访问权限以执行新添加的Lambda函数。 / p>
即。我试图复制这个:
我已经创建了一个新的端点,具有以下集成设置:
一旦我尝试测试它(从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 lambda get-policy --function-name {FunctionName}
进行比较后,它们看起来几乎相同(只是命名不同):
使用的AWS CLI命令:AccessDeniedException
已经有效的政策与新创建政策的结果:
这让我怀疑这可能是我错过的另一个步骤。
编辑(按要求)
测试屏幕截图 - 此日志会继续显示<AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
错误。
以文本形式记录(为了便于阅读而缩短一点):
请求测试请求的执行日志 Tue Mar 28 22:59:40 UTC 2017:开始执行请求:test-invoke-request Tue Mar 28 22:59:40 UTC 2017:HTTP方法:GET,资源路径:/ api / v1 / {path} Tue Mar 28 22:59:40 UTC 2017:方法请求路径:{} Tue Mar 28 22:59:40 UTC 2017:方法请求查询字符串:{fileName = x.doc} Tue Mar 28 22:59:40 UTC 2017:方法请求标题:{} Tue Mar 28 22:59:40 UTC 2017:转换前的方法请求体: Tue Mar 28 22:59:40 UTC 2017:终点请求URI:https://lambda.ap-southeast-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:ap-southeast-2:{accountid}:function:xx-url / invocations Tue Mar 28 22:59:40 UTC 2017:终点请求标题:{X-Amz-Date = 20170328T240Z,x-amzn-apigateway-api-id = {resouceId},Accept = application / json,Access-Control-Allow- Origin = *,User-Agent = AmazonAPIGateway_f,Host = lambda.ap-southeast-2.amazonaws.com,X-Amz-Content-Sha256 = 93438097f7627fe6203432b05e2257de86b32f74f8306,X-Amzn-Trace-Id = Root = 1-58daeadc-bdd8f80d35834164c70, x-amzn-lambda-integration-tag = test-request,Authorization = ********************************** *********** 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 [TRUNCATED] Tue Mar 28 22:59:40 UTC 2017:转换后的端点请求体:{&#34;资源&#34;:&#34; / api / v1 / {路径}&#34;,&#34;路径&# 34;:&#34; / API / V1 / {路径}&#34;&#34;列举HTTPMethod&#34;:&#34; GET&#34;&#34;头&#34;:空,& #34; queryStringParameters&#34; {&#34;文件名&#34;:&#34; x.doc&#34;}&#34; pathParameters&#34;:空,&#34; stageVariables&#34 ;:空,&#34; RequestContext的&#34; {&#34;帐户ID&#34;:&#34; {ACCOUNTID}&#34;&#34; RESOURCEID&#34;:&#34; {ACCOUNTID}: {RESOURCEID}&#34;&#34;级&#34;:&#34;测试调用级&#34;&#34;的requestId&#34;:&#34;测试调用请求&#34 ;,&#34;身份&#34; {&#34; cognitoIdentityPoolId&#34;:空,&#34;帐户ID&#34;&#34; {RESOURCEID}&#34;&#34; cognitoIdentityId&#34 ;:空,&#34;呼叫者&#34;:&#34; ABPPLGO4:&#34;&#34; apiKey&#34;:&#34;测试调用的API密钥&#34;&# 34; SOURCEIP&#34;:&#34;测试调用源-IP&#34;&#34; ACCESSKEY&#34;:&#34; ASHYYQ&#34;&#34; cognitoAuthenticationType&#34;:空&#34; cognitoAuthenticationProvider&#34;:空,&#34; userArn&#34;:&#34; ARN:AWS:STS :: 111:地设想med-role / AWS-Admins / {name}&#34;,&#34; userAgent&#34;:&#34; Apache-HttpClient / 4.5.x(Java / 1.8.0_112)&#34;,&# 34;使用者&#34;:&#34; AROZBPPLGO4:{名称}&#34;}&#34; resourcePath&#34;:&#34; / API / V1 / {路径}&#34;&# 34;列举HTTPMethod&#34;:&#34; GET&#34;&#34; apiId&#34;:&#34; {RESOURCEID}&#34;}&#34;主体&#34;:空,& #34; isBase64Encoded&#34;:假} Tue Mar 28 22:59:40 UTC 2017:转换前的终点响应体:
Malformed Lambda proxy response
Tue Mar 28 22:59:40 UTC 2017:终点响应标题:{x-amzn-RequestId = 39398a3e-140a-11e7-92a3-3fdc0fbb61c2,Connection = keep-alive,Content-Length = 130,Date = Tue ,2017年3月28日22:59:39 GMT} 3月28日星期二22:59:40 UTC 2017:由于配置错误导致执行失败:格式错误的Lambda代理响应 Tue Mar 28 22:59:40 UTC 2017:方法已完成,状态:502
最终读取{{1}}的事实不是问题 - 我通过手动重新选择lambda函数,允许应用权限,立即重新测试并且一切正常,Lambda不是甚至被调用。
答案 0 :(得分:1)
总结聊天的调试:
GET方法是使用Lambda GET
的错误http方法创建的。这导致Lambda无法解释来自API网关的请求,从而生成XML错误响应。 XML错误响应不是有效的JSON代理响应,因此生成了502.
控制台正在添加必要的权限并将http方法重置为POST,因此在使用控制台后它成功的原因。
答案 1 :(得分:0)
您尝试锻炼的步骤由以下命令解决:
aws apigateway put-integration
您必须非常注意该命令的选项中有一个非常具体的事情。一个完整的“put-integration”语句是这样的:
aws apigateway put-integration
--region us-west-2
--rest-api-id y0UrApI1D
--resource-id r35ourc3ID
--http-方法获取
--type AWS
--integration-http-method POST
--uri arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:111111111111:function:functionname/invocations
在--uri选项中,你必须知道:
保证有效