如何集成API Gateway以使用参数调用Lambda函数?

问题描述

我有一个React应用,可以将文件上传到S3。当用户按下按钮以从文件提取文本时,应用程序将调用GET到API Gateway并将文件名作为参数发送。这将触发lambda函数从S3上的文件提取文本。但是我坚持需要调用Lambda函数的API。

我从AWS上遵循了本教程:https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html#api-as-lambda-proxy-expose-get-method-with-query-strings-to-call-lambda-function

这是我测试API调用时得到的响应:

Received response. Status: 403,Integration latency: 3 ms
Sun Oct 25 13:29:26 UTC 2020 : Endpoint response headers: {Date=Sun,25 Oct 2020 13:29:26 GMT,Content-Length=130,Connection=keep-alive,x-amzn-RequestId=d8eab391-05a7-44f2-9721-ce67939a9514}
Sun Oct 25 13:29:26 UTC 2020 : Endpoint response body before transformations: <AccessDeniedException>
  <Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>

Sun Oct 25 13:29:26 UTC 2020 : Method response body after transformations: <AccessDeniedException>
  <Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>

Sun Oct 25 13:29:26 UTC 2020 : Method response headers: {X-Amzn-Trace-Id=Root=1-5f957db6-4e36be9def67f8157b8467c5,Content-Type=application/json}
Sun Oct 25 13:29:26 UTC 2020 : Successfully completed execution
Sun Oct 25 13:29:26 UTC 2020 : Method completed with status: 200

我读到的关于此错误的每一篇帖子都说,问题是我的HTTP方法必须是POST,但它是吗?在我的设置屏幕截图中:

Screenshot of my API integration request


所以我的问题是,如何解决这个问题,以便我的API可以调用Lambda函数并将文本返回给应用程序?

解决方法

AWS Service集成类型是将api网关与任何AWS服务一起使用。即使lambda是AWS的功能,也存在Lambda集成类型,专门用于集成lambda。我认为在这种情况下,lambda集成类型是合适的。

您也可以在GET请求中传递文件名(例如,作为查询字符串参数)。

如果您想使用AWS Service集成类型,请确保为api网关添加调用lambda的权限。您需要在Lambda IAM角色的信任策略中添加此权限。