【问题标题】:How can I create a mapping template to map path parameter to lambda function in apigateway?如何创建映射模板以将路径参数映射到 apigateway 中的 lambda 函数?
【发布时间】:2020-11-18 11:08:30
【问题描述】:

我正在使用无服务器部署 API 网关和使用 lambda integration 的 lambda。下面是基础代码:

myLambda:
   ...
   events:
    - http:
        path: customer/{id}
        method: delete
        integration: lambda
        request:
          parameters:
            paths:
              id: true
          template:
            text/plain: "$input.params('id')"

它创建一个delete API 以根据路径参数中指定的id 删除客户。我想将 path id 映射到其处理程序中的 myLambda 事件参数。但是上面的代码不起作用,lambda 从 API 网关接收整个 http 请求。如何将id 参数映射到lambda 中的事件参数?

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway


    【解决方案1】:

    当您使用 API Gateway 和 Lambda 函数时,您有 2 个选项:

    1. Lambda 代理
    2. Lambda 集成

    默认情况下,无服务器框架使用 Lambda 代理。这种连接到 Lambda 函数的方式要快得多。它将整个 HTTP 请求传递给 Lambda 函数,让您可以在 Lambda 函数端完全处理请求。

    正如我所提到的,还有另一种方法,即 Lambda 集成,无需使用 Lambda 代理。如果你想使用这个方法,你需要设置你的请求和响应的映射。这种方式在 LAmbda 代码方面“更干净”,因为与代理中的整个 HTTP 请求相比,Lambda 在事件中接收到映射参数。另一方面,这种集成设置起来比较复杂,因为您需要进行所有映射,并且它使用 VTL(Apache Velocity 模板语言)来做到这一点。

    要使用无服务器进行设置,请查看Serverless framework API Gateway documentation 中的“Lambda 集成”部分:

    【讨论】:

    • 我在 API 网关中设置了lambda integration。问题是如何将路径参数映射到 lambda 事件?
    【解决方案2】:

    我相信 ApiGateway 事件本身应该包含该查询/路径参数键值对,如果您使用上面提到的 @Caldazar 的 Lambda 代理方法,您可以直接从事件中查询您的参数。

    例如,假设你有一个 URL

    https://example.execute-api.us-west-2.amazonaws.com/prod/confirmReg?token=12345&uid=5

    您可以简单地从您的处理程序中检索以下值:

    token = event['queryStringParameters']['token']
    uid = event["queryStringParameters"]['uid']  
    

    编辑

    请按照以下步骤进行 Lambda 集成:

    转到您各自的 API 资源方法并单击集成请求部分

    找到集成请求的映射模板区域并将其打开。为 application/json Content-Type 添加一个新的映射模板。您需要将组合框中的类型从“输入直通”更改为“映射模板”。

    然后将以下一段 JSON 粘贴到模板中:

    {
      "id" : "$input.params('id')"
    }
    

    这样,您最终不会在 lambda 中收到整个事件对象,而只会收到在您的请求中发送的路径参数。

    一些参考资料:1 & 2

    【讨论】:

    • 我正在使用lambda integration,所以我不想在 lambda 代码中看到整个 http 请求。如何将路径参数映射到 lambda 事件?
    • @JoeyYiZhao 我已经更新了答案,请检查并告诉我它是否适合你
    • 我可以让它工作,但 lambda 中的事件仍然包括请求中的所有内容,如 bodyheader 等。我真正想要的只是在 lambda 中获取 id 作为字符串参数.
    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 2020-11-25
    • 2015-11-13
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    相关资源
    最近更新 更多