搜索

首页  >  问答  >  正文

在 Lambda 中部署的 Spring Boot 抛出“statusCode”:502 Gateway timeout”

<p>我将 Spring boot jar 文件(它具有 lambda 请求流处理程序)作为 zip 文件上传到 AWS Lambda。由于 zip 很大,我在 S3 中上传并在 AWS 控制台中创建此 Lambda 函数时给出了该链接。正如我到处读到的那样,这就是使用简单方法在 lambda 中部署 Spring Boot 服务的全部内容。我的 Spring Boot 服务中有 2 个 GET 端点。请在下面找到完整的 Spring boot 服务代码和 Lambda 屏幕截图。</p> <p>错误:(出现超时错误,因此在 Lambda 测试中增加到 15 分钟,结果如下,似乎仍然无法正常工作)</p> <pre class="brush:php;toolbar:false;">Executing function: succeeded (logs ) { &quot;statusCode&quot;: 502, &quot;multiValueHeaders&quot;: { &quot;Content-Type&quot;: [ &quot;application/json&quot; ] }, &quot;body&quot;: &quot;{\&quot;message\&quot;:\&quot;Gateway timeout\&quot;}&quot;, &quot;isBase64Encoded&quot;: false }</pre> <p>Spring boot Lambda 请求流处理程序:(异步,因为我觉得 Lambda 最初需要很长时间才能启动)</p> <pre class="brush:php;toolbar:false;">public class StreamLambdaHandler implements RequestStreamHandler { private SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler; public StreamLambdaHandler() throws ContainerInitializationException { handler = new SpringBootProxyHandlerBuilder() .defaultProxy() .asyncInit() .springBootApplication(SlowApplication.class) .buildAndInitialize(); } @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); } }</pre> <p>build.gradle(我在此处添加了“task buildZip”以获取 zip 文件中的 build->“distributions”jar)</p> <pre class="brush:php;toolbar:false;">plugins { id 'java' id 'org.springframework.boot' version '3.1.0' id 'io.spring.dependency-management' version '1.1.0' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-test' implementation 'mysql:mysql-connector-java:8.0.32' implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'com.amazonaws:aws-lambda-java-core:1.2.2' implementation 'com.amazonaws:aws-lambda-java-events:3.11.1' implementation 'com.amazonaws.serverless:aws-serverless-java-container-spring:1.5.2' } task buildZip(type: Zip) { into('lib') { from(jar) from(configurations.runtimeClasspath) } } tasks.named('test') { useJUnitPlatform() } jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE manifest { attributes &quot;Main-Class&quot;: &quot;com.example.awstest&quot; } from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } }</pre> <p>Spring Boot应用程序类:</p> <pre class="brush:php;toolbar:false;">package com.example.awstest.client; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @ComponentScan (&quot;com.example.awstest&quot;) public class AWSTestApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(AWSTestApplication.class, args); } }</pre> <p>Spring 启动控制器:</p> <pre class="brush:php;toolbar:false;">package com.example.awstest.controller; @RestController public class AWSTestController { @Autowired private AWSTestServiceDAO awstestServiceDAO; @CrossOrigin(origins = &quot;*&quot;) @GetMapping(&quot;/searchAllData&quot;) public List<TESTData> searchAllData() { List<TESTData> dataList = awstestServiceDAO.getAllData(); return dataList; } @CrossOrigin(origins = &quot;*&quot;) @GetMapping(&quot;/searchDataByUser/{userno}&quot;) public List<TESTData> searchDataByUser(@PathVariable Integer userno) { List<TESTData> dataList = awstestServiceDAO.findDataByMemberNo(userno); return dataList; } }</pre> <p>Lambda 控制台:</p> <p>添加处理程序为:<code>com.example.awstest.handler.AWSLambdaHandler::handleRequest</code></p> <p>测试功能:apigateway-awsproxy</p> <pre class="brush:php;toolbar:false;">{ &quot;body&quot;: &quot;eyJ0ZXN0IjoiYm9keSJ9&quot;, &quot;resource&quot;: &quot;/{proxy+}&quot;, &quot;path&quot;: &quot;/searchAllData&quot;, &quot;httpMethod&quot;: &quot;GET&quot;, &quot;isBase64Encoded&quot;: true, &quot;pathParameters&quot;: { &quot;proxy&quot;: &quot;/searchAllData&quot; }, &quot;stageVariables&quot;: { &quot;baz&quot;: &quot;qux&quot; }, &quot;headers&quot;: { &quot;Accept&quot;: &quot;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8&quot;, &quot;Accept-Encoding&quot;: &quot;gzip, deflate, sdch&quot;, &quot;Accept-Language&quot;: &quot;en-US,en;q=0.8&quot;, &quot;Cache-Control&quot;: &quot;max-age=0&quot;, &quot;CloudFront-Forwarded-Proto&quot;: &quot;https&quot;, &quot;CloudFront-Is-Desktop-Viewer&quot;: &quot;true&quot;, &quot;CloudFront-Is-Mobile-Viewer&quot;: &quot;false&quot;, &quot;CloudFront-Is-SmartTV-Viewer&quot;: &quot;false&quot;, &quot;CloudFront-Is-Tablet-Viewer&quot;: &quot;false&quot;, &quot;CloudFront-Viewer-Country&quot;: &quot;US&quot;, &quot;Host&quot;: &quot;1234567890.execute-api.us-east-1.amazonaws.com&quot;, &quot;Upgrade-Insecure-Requests&quot;: &quot;1&quot;, &quot;User-Agent&quot;: &quot;Custom User Agent String&quot;, &quot;Via&quot;: &quot;1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)&quot;, &quot;X-Amz-Cf-Id&quot;: &quot;cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==&quot;, &quot;X-Forwarded-For&quot;: &quot;127.0.0.1, 127.0.0.2&quot;, &quot;X-Forwarded-Port&quot;: &quot;443&quot;, &quot;X-Forwarded-Proto&quot;: &quot;https&quot; }, &quot;multiValueHeaders&quot;: { &quot;Accept&quot;: [ &quot;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8&quot; ], &quot;Accept-Encoding&quot;: [ &quot;gzip, deflate, sdch&quot; ], &quot;Accept-Language&quot;: [ &quot;en-US,en;q=0.8&quot; ], &quot;Cache-Control&quot;: [ &quot;max-age=0&quot; ], &quot;CloudFront-Forwarded-Proto&quot;: [ &quot;https&quot; ], &quot;CloudFront-Is-Desktop-Viewer&quot;: [ &quot;true&quot; ], &quot;CloudFront-Is-Mobile-Viewer&quot;: [ &quot;false&quot; ], &quot;CloudFront-Is-SmartTV-Viewer&quot;: [ &quot;false&quot; ], &quot;CloudFront-Is-Tablet-Viewer&quot;: [ &quot;false&quot; ], &quot;CloudFront-Viewer-Country&quot;: [ &quot;US&quot; ], &quot;Host&quot;: [ &quot;0123456789.execute-api.us-east-1.amazonaws.com&quot; ], &quot;Upgrade-Insecure-Requests&quot;: [ &quot;1&quot; ], &quot;User-Agent&quot;: [ &quot;Custom User Agent String&quot; ], &quot;Via&quot;: [ &quot;1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)&quot; ], &quot;X-Amz-Cf-Id&quot;: [ &quot;cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==&quot; ], &quot;X-Forwarded-For&quot;: [ &quot;127.0.0.1, 127.0.0.2&quot; ], &quot;X-Forwarded-Port&quot;: [ &quot;443&quot; ], &quot;X-Forwarded-Proto&quot;: [ &quot;https&quot; ] }, &quot;requestContext&quot;: { &quot;accountId&quot;: &quot;123456789012&quot;, &quot;resourceId&quot;: &quot;123456&quot;, &quot;stage&quot;: &quot;prod&quot;, &quot;requestId&quot;: &quot;c6af9ac6-7b61-11e6-9a41-93e8deadbeef&quot;, &quot;requestTime&quot;: &quot;09/Apr/2015:12:34:56 +0000&quot;, &quot;requestTimeEpoch&quot;: 1428582896000, &quot;identity&quot;: { &quot;cognitoIdentityPoolId&quot;: null, &quot;accountId&quot;: null, &quot;cognitoIdentityId&quot;: null, &quot;caller&quot;: null, &quot;accessKey&quot;: null, &quot;sourceIp&quot;: &quot;127.0.0.1&quot;, &quot;cognitoAuthenticationType&quot;: null, &quot;cognitoAuthenticationProvider&quot;: null, &quot;userArn&quot;: null, &quot;userAgent&quot;: &quot;Custom User Agent String&quot;, &quot;user&quot;: null }, &quot;path&quot;: &quot;/prod/searchAllData&quot;, &quot;resourcePath&quot;: &quot;/{proxy+}&quot;, &quot;httpMethod&quot;: &quot;GET&quot;, &quot;apiId&quot;: &quot;1234567890&quot;, &quot;protocol&quot;: &quot;HTTP/1.1&quot; } }</pre> <p>错误:</p> <pre class="brush:php;toolbar:false;">s.exceptions.ContainerInitializationException: Could not initialize framework within the 20000ms timeout at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:207) at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:254) at com.example.awstest.handler.AWSLambdaHandler.handleRequest(AWSLambdaHandler.java:36) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at com.amazonaws.services.lambda.runtime.api.client.EventHandlerLoader$StreamMethodRequestHandler.handleRequest(EventHandlerLoader.java:379) at com.amazonaws.services.lambda.runtime.api.client.EventHandlerLoader$2.call(EventHandlerLoader.java:903) at com.amazonaws.services.lambda.runtime.api.client.AWSLambda.startRuntime(AWSLambda.java:238) at com.amazonaws.services.lambda.runtime.api.client.AWSLambda.startRuntime(AWSLambda.java:190) at com.amazonaws.services.lambda.runtime.api.client.AWSLambda.main(AWSLambda.java:185) 04:36:48.470 [main] ERROR com.amazonaws.serverless.proxy.AwsProxyExceptionHandler -- Called exception handler for: com.amazonaws.serverless.exceptions.ContainerInitializationException: Could not initialize framework within the 20000ms timeout at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:207) at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:254) at com.example.awstest.handler.AWSLambdaHandler.handleRequest(AWSLambdaHandler.java:36) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at com.amazonaws.services.lambda.runtime.api.client.EventHandlerLoader$StreamMethodRequestHandler.handleRequest(EventHandlerLoader.java:379) at com.amazonaws.services.lambda.runtime.api.client.EventHandlerLoader$2.call(EventHandlerLoader.java:903) at com.amazonaws.services.lambda.runtime.api.client.AWSLambda.startRuntime(AWSLambda.java:238) at com.amazonaws.services.lambda.runtime.api.client.AWSLambda.startRuntime(AWSLambda.java:190) at com.amazonaws.services.lambda.runtime.api.client.AWSLambda.main(AWSLambda.java:185) com.amazonaws.serverless.exceptions.ContainerInitializationException: Could not initialize framework within the 20000ms timeout at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:207) at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:254) at com.example.awstest.handler.AWSLambdaHandler.handleRequest(AWSLambdaHandler.java:36) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at com.amazonaws.services.lambda.runtime.api.client.EventHandlerLoader$StreamMethodRequestHandler.handleRequest(EventHandlerLoader.java:379) at com.amazonaws.services.lambda.runtime.api.client.EventHandlerLoader$2.call(EventHandlerLoader.java:903) at com.amazonaws.services.lambda.runtime.api.client.AWSLambda.startRuntime(AWSLambda.java:238) at com.amazonaws.services.lambda.runtime.api.client.AWSLambda.startRuntime(AWSLambda.java:190) at com.amazonaws.services.lambda.runtime.api.client.AWSLambda.main(AWSLambda.java:185) END RequestId: 21464e19-8dee-47e0-9acd-5ae04d24431a REPORT RequestId: 21464e19-8dee-47e0-9acd-5ae04d24431a Duration: 20003.03 ms Billed Duration: 20004 ms Memory Size: 512 MB Max Memory Used: 137 MB</pre></p>
P粉111227898P粉111227898459 天前808

全部回复(1)我来回复

  • P粉659518294

    P粉6595182942023-08-29 00:44:41

    查看您的 Gradle 文件,您使用的是非常旧的过时的 AWS Serverless Java 容器版本,该版本与 Spring Boot 3.x 不兼容。

    删除 com.amazonaws.serverless:aws-serverless-java-container-spring:1.5.2 并将其替换为 com.amazonaws.serverless:aws-serverless-java-container -springboot3:2.0.0-M1。您还可以在 https://github.com/awslabs/aws-serverless-java-container/tree/main/samples/springboot3/pet-store进行比较。

    如果您将来遇到类似的超时挑战,您还可以启用 AWS X-RayOpenTelemetry 收集跟踪数据并查看时间损失的位置。

    回复
    0
  • 取消回复