Amazon web services 使用AWS API网关调用AWS Lambda

Amazon web services 使用AWS API网关调用AWS Lambda,amazon-web-services,aws-lambda,aws-sdk,aws-api-gateway,aws-java-sdk,Amazon Web Services,Aws Lambda,Aws Sdk,Aws Api Gateway,Aws Java Sdk,我正在将一些scala代码迁移到AWS Lambda,我打算通过AWS API网关将其公开,但我一直在努力,只要有一个参数,就可以让整个过程正常工作 我的非常简单的代码如下所示: class HelloService { def hello(name: String) = { "hello there, " + name } } { "isBase64Encoded": true|false, "statusCode": httpStatusCode,

我正在将一些scala代码迁移到AWS Lambda,我打算通过AWS API网关将其公开,但我一直在努力,只要有一个参数,就可以让整个过程正常工作

我的非常简单的代码如下所示:

class HelloService {
  def hello(name: String) = {
    "hello there, " + name
  }
}
{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}
我将构建的jar上传到Lambda,并通过创建一个测试事件在AWS控制台中对其进行测试。正如预期的那样,它返回正确的响应

但是,我希望API网关调用这个Lambda。我既使用了Lambda代理集成,也定义了自己的身体映射模板。我似乎无法让它工作,我一直得到:

{
  "message": "Internal server error"
}
使用日志:

请求测试请求的执行日志2017年7月3日星期一16:23:21 UTC: 开始执行请求:03年7月1日测试调用请求 UTC 2017:16:23:21:HTTP方法:GET,资源路径:/car/aaa周一至七月 03 16:23:21 UTC 2017:方法请求路径:{carReg=aaa}周一至七月三日 UTC 2017:16:23:21:方法请求查询字符串:{}Mon Jul 03 UTC 2017:16:23:21:方法请求头:{}周一至七月03日16:23:21 UTC 2017年:转换前的方法请求正文:03年7月1日 UTC 2017:16:23:21:端点请求URI: 2017年7月3日星期一16:23:21 UTC:端点请求标题: {x-amzn-lambda-integration-tag=测试请求, ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************,X-Amz-Date=20170703T162321Z,X-amzn-apigateway-api-id=9dwaaf2mdg, X-Amz-Source-Arn=Arn:aws:executeapi:eu-west-1:879461422967:9dwaaf2mdg/null/GET/car/{carReg+}, Accept=application/json,User-Agent=AmazonAPIGateway_9dwaaf2mdg, 7.6-Amz-Amz-X-Amz-X-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-Amz-MES-SES-SES-SES-TOD-SED-SED-SED-SED-SED-SED-SED-SED-SED-SEC-SED-SED-SED-SED-SED-SED-SEA-1-1-1-1-1-1-1-1-1-1-1-1-1-3-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-Xzrkyzisseqitmhntr3HIJIEY6AJZJFR+z2PqqVKvtgKQ [截断]2017年7月3日星期一16:23:21 UTC:端点请求正文 转换:{message:foo}周一2017年7月3日16:23:21 UTC :转换前的端点响应正文:{errorMessage:An JSON过程中发生错误 解析,errorType:java.lang.RuntimeException,stackTrace:[],原因:{errorMessage:com.fasterxml.jackson.databind.JsonMappingException: 无法反序列化START\u对象之外的java.lang.String实例 令牌\n位于[源: lambdainternal.util。NativeMemoryAsInputStream@e720b71;行:1, 专栏: 1] ,errorType:java.io.UncheckedIOException,stackTrace:[],原因:{errorMessage:Can 未从START\u对象反序列化java.lang.String实例 令牌\n位于[源: lambdainternal.util。NativeMemoryAsInputStream@e720b71;行:1, 专栏: 1] ,errorType:com.fasterxml.jackson.databind.JsonMappingException,stackTrace:[com.fasterxml.jackson.databind.JsonMappingException.fromJsonMappingException.java:148,com.fasterxml.jackson.databind.DeserializationContext.mappingexceptionserializationcontext.java:857,com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserializer.java [截断]2017年7月3日星期一16:23:21 UTC:端点响应标题: {x-amzn-remaped-Content-Length=0, x-amzn-RequestId=EDE9AED-600b-11e7-834e-47baf0a4e23f, 连接=保持活动状态,内容长度=1252, X-Amz-Function-Error=未处理,日期=2017年7月3日星期一格林尼治标准时间16:23:20, X-Amzn-Trace-Id=根=1-595a6f79-c065d6038ba3209743378112;采样=0, Content Type=application/json}周一2017年7月3日16:23:21 UTC: 由于配置错误,执行失败:输出映射引用 无效的方法响应:200周一至7月3日16:23:21 UTC 2017:method 完成状态:500

我的ARN路径中有一个空值,但我想这是因为我没有身份验证集,这正是我现在想要的。我不认为这会是错误的原因

除此之外,我还尝试将主体的内容类型定义为application/json和text/plain。这两种类型似乎都不起作用,即使使用text/plain,AWS似乎也需要json。我希望字符串是有效的json

我做错了什么?我应该在我的主体映射模板中放置什么样的完整表达式?我的模型中的模式定义应该是什么样的?我似乎无法为纯文本定义合适的模型


我确信这是非常简单的事情,我只是缺少了一些东西…

对于Lambda代理,您必须返回一个字符串化的JSON

使用Lambda,您可以从Lambda返回JSON,然后让API网关主体映射模板为您将其字符串化


有关其他上下文和示例,请参阅。

您发回的响应 o服务器取决于您是否使用Lambda代理集成。在API网关端使用代理集成更容易设置,但是您的Lambda需要做更多的工作,因为网关将向您发送大量内容,并在响应中要求特定的格式。对于代理集成,响应格式需要如下所示:

class HelloService {
  def hello(name: String) = {
    "hello there, " + name
  }
}
{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}
这里还有更多:


如果您不使用代理集成,则需要为相关HTTP谓词的API网关集成中的参数设置主体映射,以将API参数与lambda参数相匹配。这里接受的答案中有一个很好的解释:

嘿,谢谢。我真的不想让我的代码依赖于AWS库,所以我选择了Body Mapping替代方案,但你的答案正好帮助我找到答案。我昨天确实看了那篇文章,但一定是太累了,完全没有找到解决办法。谢谢