如何减少Eclipse中用JAVA编写的AWS Lambda代码的大小

时间:2016-04-20 17:08:05

标签: java amazon-s3 aws-sdk aws-lambda

我是一名Android开发人员并且正在探索亚马逊AWS,以便将来作为后端选项应用。我曾经使用JAVA探索过各种AWS服务,例如dynamoDB,S3,SES和cool lambda功能。在我学习期间,我发现/准备了一个代码,用于为上传到S3存储桶的每个图像创建缩略图。我在eclipse IDE中成功地在java中编写了Lambda代码,并且能够使用AWS控制台上传和使用它,以达到预期目的。

我担心的是,当我将JAVA Lambda代码上传到AWS时,它在SIZE中显示为49 MB。当我寻找原因时,我发现在AWS sdk下项目中有大量的jar用于java。这是正常的还是我可以减少上传代码的大小无论如何。请指导我如何有效地减小尺寸。我还看到node.js Lambda代码相同,只有KB。我可能会做一些错误的事情。

请帮助......

5 个答案:

答案 0 :(得分:7)

简单回答 - 你做得对,包大小不能缩小到与node.js应用程序相当的大小。

对于node.js lambda,amazon有适当的AWS SDK库,因此您只需上传自己的代码和第三方库。但对于java lambda,AWS SDK必须与应用程序打包在一起。

但是,您可以通过仔细选择要包含的库并排除不必要的依赖项来减少包大小。

答案 1 :(得分:4)

JAR大小为49 MB对我来说似乎有点大,具体取决于您所包含的库。如果您要包含完整的AWS SDK(所有服务),则可以为JAR添加相当大的大小。我假设您自己的代码和其他库的名称大小。如果您使用的是Maven,那么您只能包含所需服务的库(例如:S3),并且不包括那些您不需要的服务。

一个好的资源是Managing Dependencies with AWS SDK for Java - Bill of Materials module (BOM)博客文章。虽然技术上讲的主题略有不同,但它展示了围绕Java SDK中的SDK SDK的最佳实践。通过包括aws-java-sdk-s3而不是aws-java-sdk作为示例,您将看到包大小的大幅减少,AWS有很多服务,并且它们的完整SDK非常大。

我在许多基于Java的Lambda函数中看到的是部署大小为10 MB到13 MB,具体取决于我需要包含的其他第三方库。你肯定无法在node.js附近的任何地方获得部署规模,只是基于Java部署的工作方式,但是你应该有进一步改进的空间。

答案 2 :(得分:4)

您可能需要考虑查看proguard开源jar收缩器/优化器。我发现它帮助我将lambda函数从15Mb减少到3Mb。我可以通过更仔细地使用proguard选项来降低它,但我现在对这种保存感到非常高兴。

我对Scala lambda函数的基于SBT的设置如下 - 但我认为,你应该对Java lambda函数进行类似的减少。

ProguardKeys.options in Proguard ++= Seq(
"-dontoptimize",
"-dontobfuscate",
"-dontnote",
"-dontwarn",
"-keep,includedescriptorclasses class mypackage.** { *; }",
)

答案 3 :(得分:2)

我的第一个Java Lambda函数也非常庞大。我的HelloWorld Java功能是10+ MB!当您在AWS网站上关注Java功能部署教程时,您会得到打包AWS-sdk所需的印象。不是。

我对此进行了测试,得出结论认为没有必要打包AWS-sdk来运行Lambda函数。如果您正在使用Maven,则可以通过以下方式将AWS-sdk设置为:

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk</artifactId>
  <version>1.10.72</version>
  <scope>provided</scope>
</dependency>

当您将函数打包到JAR中时,这将导致几KB的函数。

Screenshot from AWS Lambda console

答案 4 :(得分:1)

您可以使用 aws-lightweight-client-java,它是一个独立的 jar(无依赖项)并且小于 60K。减少的类数量也可以大量减少 Lambda 冷启动时间(详见项目)。问题是您必须通过其文档了解更多有关 AWS API 的信息,而不是依赖于 IDE 中的自动完成以及 AWS 开发工具包 jar 中生成的胖代码。举个简单的例子,这是如何编写从 Lambda 处理程序中的 s3 存储桶读取对象的代码:

Client s3 = Client.s3().defaultClient().build();
String bytes = s3.path("myBucket", "myObject.txt").responseAsBytes();

此示例使用 com.github.davidmoten:aws-lightweight-client-java:0.1.3 编码(但您应该检查项目的最新版本)。