为AWS SpringLambdaContainerHandler lambda和API网关集成获得502“网关超时”
我想在aws中使用SpringLambdaContainerHandler将一个API网关绑定到一个lambda函数 .
以下是相关课程 .
package org.san.aws.subscription;
import com.amazonaws.serverless.exceptions.ContainerInitializationException;
import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse;
import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaHandler implements RequestHandler<AwsProxyRequest, AwsProxyResponse>{
private SpringLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
LambdaLogger log = null;
public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) {
log = context.getLogger();
log.log("entering method handleRequest");
if (handler == null) {
try {
handler = SpringLambdaContainerHandler.getAwsProxyHandler(AppConfig.class);
} catch (ContainerInitializationException e) {
log.log("Cannot initialize spring handler"+e.getStackTrace());
}
}
AwsProxyResponse response = handler.proxy(awsProxyRequest, context);
return response;
}
}
package org.san.aws.subscription;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages ={"org.san.aws.subscription", "org.san.aws.subscription.controller"})
public class AppConfig {
}
package org.san.aws.subscription.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("subscriptions")
public class SubscriptionController2 {
@RequestMapping(method = RequestMethod.POST)
public String createSubscription() throws Exception {
return "Hello..";
}
}
使用以下swagger规范
swagger: "2.0"
info:
description: "subscription"
version: "1.0.0"
title: "subscription"
termsOfService: ""
contact:
email: "abc@xyz.com"
license:
name: ""
url: "http://localhost/"
schemes:
- "http"
paths:
/subscriptions:
post:
tags:
- "subscriptions"
summary: "create a new subscription"
description: ""
operationId: "addSubs"
consumes:
- "application/json"
- "application/xml"
produces:
- "application/xml"
- "application/json"
responses:
200:
description: "ok"
201:
description: "created"
405:
description: "Invalid input"
externalDocs:
description: "Find out more about Swagger"
url: "http://swagger.io"
对于lambda函数部署,我给了Handler as org.san.aws.subscription.LambdaHandler lambda的超时为30 san
我已经将API网关创建为“从swagger导入”
Then under resources in API Gateway:
Integration type -> Lambda Function
Use Lambda Proxy integration -> Ticked
Lambda Function -> subscriptionHandler
Custom timeout -> 29000
然后单击“操作”菜单中的“部署API” . 然后单击“资源”,然后单击出现的POST方法 . 然后单击/ subscriptions - POST - Method Execution窗格中的Test .
作为回应我得到以下内容:
{
"statusCode": 502,
"headers": {
"Content-Type": "application/json"
},
"body": "{\"message\":\"Gateway timeout\"}",
"base64Encoded": false
}
然后在我得到的日志中:
Thu Dec 14 10:15:59 UTC 2017 : Successfully completed execution
Thu Dec 14 10:15:59 UTC 2017 : Method completed with status: 200
我的目标是让一个简单的例子起作用 . 但我一直收到这个错误,仍然无法找到解决方案 .
任何帮助非常感谢让这个工作 .