我们正在开发一个项目,使用由API网关请求触发的lambda函数来处理文件。该函数然后获取S3存储桶中的文件并开始读取它。在此之前,一切都按预期工作,但是当文件读取开始时,我们收到以下错误:
(...)
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file
2017-02-06 19:15:06 <9025af71-eca0-11e6-82d2-9ff4b9184005> ERROR JRestlessHandlerContainer:339 - container failure
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file
END RequestId: (some id)
REPORT RequestId: (some id) Duration: 3047.44 ms Billed Duration: 3100 ms Memory Size: 1536 MB Max Memory Used: 94 MB
Exception in thread "main" java.lang.Error: java.lang.NoClassDefFoundError: java/lang/Throwable$WrappedPrintWriter
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:59)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)
Caused by: java.lang.NoClassDefFoundError: java/lang/Throwable$WrappedPrintWriter
at java.lang.Throwable.printStackTrace(Throwable.java:721)
at lambdainternal.UserFault.trace(UserFault.java:43)
at lambdainternal.UserFault.makeUserFault(UserFault.java:26)
at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:290)
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:57)
... 3 more
START RequestId: (some id) Version: $LATEST
END RequestId: (some id)
我们使用自己的自定义文件读取/处理库(Java项目),因为文件也是根据我们的需求定制的,我们使用Maven将它添加到我们的项目中。我们的lambda jar是使用Maven Shade插件生成的:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
在本地测试项目,它工作正常,我们可以获取文件信息。我们的代码使用JAX-RS和Spring来处理API网关(我们不确定这是否会干扰结果)。但是,到目前为止,在使用lambda运行项目时,我们无法解决此问题。在我们的测试中,我们故意增加了函数超时和内存,但无论限制是什么,错误都会持续存在。
提前谢谢。
答案 0 :(得分:1)
使用日志技术,对我们的代码进行调试并联系AWS支持,我们看到我们的一个库在禁止目录中创建文件,如下所述:https://aws.amazon.com/lambda/faqs/,因此Lambda函数失败。
他们解释说如果你需要创建文件,你必须使用/ tmp目录,在我们遇到这个问题之前我们没有注意到这一点。我们一遍又一遍地阅读文档,但是这一件事仍然抓住了我们,它发生了,我想。无论如何,在库中更改后,函数现在可以按预期完美地执行。
谢谢大家的帮助。
答案 1 :(得分:0)
你还有问题吗?可能是Lambda服务正在您正在使用的特定区域中维护。此错误告诉我JRE已损坏,无法访问rt.jar提供的库。如有必要,请联系支持。您可以检查AWS运行状况here。