API 网关 CLI Lambda 权限(添加权限)

API Gateway CLI Lambda permission (add-permission)

在浏览了很多页面(包括一些 SO 页面)提出了一些建议(见下面的列表)之后,我仍然无法通过 API 网关访问权限来执行新添加的 Lambda 函数AWS CLI 命令行工具。

即我正在尝试复制这个:

我创建了一个新端点,具有以下集成设置:

我一尝试测试它(从 API 网关控制台),我就得到了这个

<AccessDeniedException>
  <Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>

我知道这是因为,虽然我在方法中添加了 lambda 函数,但 API 网关策略仍未更新(图 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 工具做同样的事情。

URL 列表(如果有人正在寻找有关此问题/主题的资源):

更新 #1

我还可以确认,在将新创建的 get-policy 与现有的工作中的进行比较后 - 它们看起来几乎相同(只是名称不同):

使用的 AWS CLI 命令:aws lambda get-policy --function-name {FunctionName}

已经生效的策略与新创建的策略的结果:

这让我怀疑这可能是我遗漏的一个额外步骤。

编辑(根据请求)

测试屏幕截图 - 此日志继续显示 AccessDeniedException 错误。

记录为文本(为了便于阅读而缩短了一点):

Execution log for request test-request Tue Mar 28 22:59:40 UTC 2017 : Starting execution for request: test-invoke-request Tue Mar 28 22:59:40 UTC 2017 : HTTP Method: GET, Resource Path: /api/v1/{path} Tue Mar 28 22:59:40 UTC 2017 : Method request path: {} Tue Mar 28 22:59:40 UTC 2017 : Method request query string: {fileName=x.doc} Tue Mar 28 22:59:40 UTC 2017 : Method request headers: {} Tue Mar 28 22:59:40 UTC 2017 : Method request body before transformations: Tue Mar 28 22:59:40 UTC 2017 : Endpoint request 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 : Endpoint request headers: {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 : Endpoint request body after transformations: {"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} Tue Mar 28 22:59:40 UTC 2017 : Endpoint response body before transformations:

<AccessDeniedException> <Message>Unable to determine service/operation name to be authorized</Message> </AccessDeniedException>

Tue Mar 28 22:59:40 UTC 2017 : Endpoint response headers: {x-amzn-RequestId=39398a3e-140a-11e7-92a3-3fdc0fbb61c2, Connection=keep-alive, Content-Length=130, Date=Tue, 28 Mar 2017 22:59:39 GMT} Tue Mar 28 22:59:40 UTC 2017 : Execution failed due to configuration error: Malformed Lambda proxy response Tue Mar 28 22:59:40 UTC 2017 : Method completed with status: 502

最终读取 Malformed Lambda proxy response 的事实不是问题 - 我已经通过手动重新选择 lambda 函数证明了这一点,允许应用权限,立即重新测试并且一切正常,Lambda甚至没有被调用。

从聊天中总结调试:

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

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

您尝试锻炼的步骤已通过命令解决:

aws api网关集成

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

aws api网关集成
--region us-west-2
--rest-api-id y0UrApI1D
--resource-id r35ourc3ID
--http 方法 GET
--键入 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 函数的确切名称

保证会工作