【问题标题】:API Gateway CLI Lambda permission (add-permission)API Gateway CLI Lambda 权限(添加权限)
【发布时间】: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}","re​​sourceId":"{AccountId}:{resourceId}","stage":"test-invoke-stage","re​​questId":"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


【解决方案1】:

总结聊天中的调试:

使用 Lambda 的错误 http 方法创建了 GET 方法,GET。这导致 Lambda 无法解释来自 API Gateway 的请求,从而生成 XML 错误响应。 XML 错误响应不是有效的 JSON 代理响应,因此生成了 502。

控制台正在添加必要的权限并将http方法重置为POST,因此使用控制台后成功。

【讨论】:

  • 具体来说:我需要在我的 JS SDK 代码中将 integrationHttpMethod 编辑为 integrationHttpMethod: "POST",因为它被设置为 GET,从那里我可以在 API 网关中创建任何方法使用该功能没有问题。非常感谢 Bob 的所有帮助。
【解决方案2】:

您尝试锻炼的步骤由以下命令解决:

aws apigateway 放置集成

您必须非常注意该命令的选项中有一个非常具体的事情。一个完整的“put-integration”语句如下:

aws apigateway put-integration
--region us-west-2
--rest-api-id y0UrApI1D
--resource-id r35ourc3ID
--http 方法 GET
--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 选项中,您必须注意:

  • us-west-2 是区域的示例,请确保将 lamnda 函数所在的区域放置在正确的位置
  • 请确保您不要更改下一部分,它必须与声明的完全相同,否则将不会授予权限“lambda:path/2015-03-31/functions
  • 更改您的 AWS 帐号的值 111111111111
  • 将“functionname”更改为您注册的 lambda 函数的确切名称

保证工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多