如何集成 API Gateway 调用带参数的 Lambda 函数?

Posted

技术标签:

【中文标题】如何集成 API Gateway 调用带参数的 Lambda 函数?【英文标题】:How to integrate API Gateway to call Lambda function with a parameter? 【发布时间】:2021-02-08 03:04:55 【问题描述】:

我有一个将文件上传到 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 函数并将文本返回给应用程序?

【问题讨论】:

什么是myLambdaRole lambda 函数的执行角色。它具有完整的 lambda 和 cloudwatch 访问权限,并允许调用 lambda 函数 【参考方案1】:

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

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

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

【讨论】:

你有什么理由使用AWS Service集成类型而不是Lambda集成类型 嗨,是的,使用它而不是 lambda 集成的原因是 AWS 在教程中做了它,所以我认为它会“更正确” 您是否检查了 lambda 的 cloudwatch 日志,请求是否到达那里 太棒了。我将其更改为 Lambda 集成,并且可以正常工作。谢谢阿伦!!您必须帮助 AWS 编写更好的教程! xD 由于我的名声,我无法为您的答案投票,但我确实尝试过投票xD

以上是关于如何集成 API Gateway 调用带参数的 Lambda 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将特定 AWS API Gateway 阶段连接到特定 AWS lambda 别名

未调用 AWS API Gateway 自定义授权方

不使用 API Gateway 代理集成无法调用后端服务

使用 AWS API Gateway 访问原始 URL

AWS API Gateway 集成请求正文映射模板

如何将 API Gateway 与 SQS 集成