为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

我的目标是让一个简单的例子起作用 . 但我一直收到这个错误,仍然无法找到解决方案 .

任何帮助非常感谢让这个工作 .