【问题标题】:Creating a REST API from Lambda Function从 Lambda 函数创建 REST API
【发布时间】:2017-12-19 10:45:19
【问题描述】:

我有一个基于 Java 的 Lambda 函数,该函数通过带有以下 JSON 的 Lambda 测试事件正确运行:

    {
  "married": "true",
  "wages": "200000",
  "homeInterest": "15000",
  "propertyTaxes": "15000",
  "stateTaxes": "13000",
  "otherDeductions": "4000",
  "postalCode": "11762"
}

然后我通过 Amazon API Gateway 创建了一个 API。当我粘贴与生成的 URL 的正文相同的 JSON 时,没有一个字段映射正确。

Lambda 处理程序使用 POJO 进行请求和响应:

public class TaxHandler implements RequestHandler<TaxRequest, TaxResponse>{

  public TaxResponse handleRequest(TaxRequest request, Context context){

当我通过 API 网关测试进行测试时,我看到以下信息:

请求测试请求的执行日志

Tue Dec 19 02:01:16 UTC 2017 : Starting execution for request: test-invoke-request
Tue Dec 19 02:01:16 UTC 2017 : HTTP Method: POST, Resource Path: /TaxCalculation
Tue Dec 19 02:01:16 UTC 2017 : Method request path: {}
Tue Dec 19 02:01:16 UTC 2017 : Method request query string: {}
Tue Dec 19 02:01:16 UTC 2017 : Method request headers: {}
Tue Dec 19 02:01:16 UTC 2017 : Method request body before transformations: {
  "married": "true",
  "wages": "200000",
  "homeInterest": "15000",
  "propertyTaxes": "15000",
  "stateTaxes": "13000",
  "otherDeductions": "4000",
  "postalCode": "11762"
}
Tue Dec 19 02:01:16 UTC 2017 : Endpoint request URI: https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:896795400074:function:TaxCalculation/invocations
Tue Dec 19 02:01:16 UTC 2017 : Endpoint request headers: {x-amzn-lambda-integration-tag=test-request, Authorization=************************************************************************************************************************************************************************************************************************************************************************************************************************7fcbc9, X-Amz-Date=20171219T020116Z, x-amzn-apigateway-api-id=07yp3njqzk, X-Amz-Source-Arn=arn:aws:execute-api:us-east-1:896795400074:07yp3njqzk/null/POST/TaxCalculation, Accept=application/json, User-Agent=AmazonAPIGateway_07yp3njqzk, X-Amz-Security-Token= [TRUNCATED]
Tue Dec 19 02:01:16 UTC 2017 : Endpoint request body after transformations: {"resource":"/TaxCalculation","path":"/TaxCalculation","httpMethod":"POST","headers":null,"queryStringParameters":null,"pathParameters":null,"stageVariables":null,"requestContext":{"path":"/TaxCalculation","accountId":"xxxxxxxx","resourceId":"v8358d","stage":"test-invoke-stage","requestId":"test-invoke-request","identity":{"cognitoIdentityPoolId":null,"cognitoIdentityId":null,"apiKey":"test-invoke-api-key","cognitoAuthenticationType":null,"userArn":"arn:aws:iam::xxxxx:user/tvfoodmaps_aws","apiKeyId":"test-invoke-api-key-id","userAgent":"Apache-HttpClient/4.5.x (Java/1.8.0_144)","accountId":"896795400074","caller":"AIDAINMSXKH5AWAQ7NX36","sourceIp":"test-invoke-source-ip","accessKey":"ASIAIHXWW4BOHGXESRNQ","cognitoAuthenticationProvider":null,"user":"AIDAINMSXKH5AWAQ7NX36"},"resourcePath":"/TaxCalculation","httpMethod":"POST","apiId":"07yp3njqzk"},"body":"{\n  \"married\": \"true\",\n  \"wages\": \"200000\",\n  \"homeInterest\": \"15000\",\n  \"propertyTa [TRUNCATED]
Tue Dec 19 02:01:16 UTC 2017 : Sending request to https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:896795400074:function:TaxCalculation/invocations
Tue Dec 19 02:01:16 UTC 2017 : Received response. Integration latency: 30 ms
Tue Dec 19 02:01:16 UTC 2017 : Endpoint response body before transformations: {"savings":565.0,"owedTaxes17":-635.0,"owedTaxes18":-1200.0,"effectiveRate17":0.0,"effectiveRate18":0.0}
Tue Dec 19 02:01:16 UTC 2017 : Endpoint response headers: {X-Amz-Executed-Version=$LATEST, x-amzn-Remapped-Content-Length=0, Connection=keep-alive, x-amzn-RequestId=7f8a1b13-e460-11e7-84cf-d1c3e8d3eaf5, Content-Length=104, Date=Tue, 19 Dec 2017 02:01:16 GMT, X-Amzn-Trace-Id=root=1-5a3872ec-1b9d875d8cc2fded5c30da46;sampled=0, Content-Type=application/json}
Tue Dec 19 02:01:16 UTC 2017 : Execution failed due to configuration error: Malformed Lambda proxy response
Tue Dec 19 02:01:16 UTC 2017 : Method completed with status: 502

我如何进一步调试为什么函数在通过 REST 而不是直接通过 Lambda 测试器调用时执行不同?注意:我知道错误是关于响应的,但问题是我的代码的第一行读取应该映射到 pojo 的字段不起作用(同样,仅在使用 API 时)。

【问题讨论】:

  • 你的问题是什么?
  • 您是否关注了docs.aws.amazon.com/lambda/latest/dg/… 的 Java POJO 示例?
  • 是的,当直接通过 Lambda 测试工具调用时,即使是我的 Lambda 也能正常工作。当我尝试使其成为 JSON 映射方式不同的 REST 服务时,发生了一些事情。

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


【解决方案1】:

看起来您已与 ANY 集成,但未返回代理响应。相反,您返回的是 JSON 对象响应。

这里讨论的类似问题,

https://forums.aws.amazon.com/thread.jspa?threadID=255561

这里记录了配置的解决方案,

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-output-format

希望对你有帮助。

【讨论】:

  • 我的问题已通过取消选中“使用 lambda 代理集成”得到解决
【解决方案2】:

您可以在代码中包含日志记录,以便它们可以在 AWS CloudWatch 中使用以调查问题。 AWS 根据 Java 的 documentation 推荐以下库和方法。

注意:还要设置 API Gateway 日志记录,以便更容易端到端地跟踪任何问题。

【讨论】:

  • 是的,我有日志记录,但我真正看到的是,当我通过 lambda 测试时,请求对象有我的值,而当我通过 API 工具测试时,它没有。
  • 设置 API Gateway 日志记录以跟踪正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 2021-05-11
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多