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

Gou*_*vJn 3 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.我可能会做一些错误的事情.

请帮忙...

小智 8

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

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

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


Mar*_*ift 6

我的第一个 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>
Run Code Online (Sandbox Code Playgroud)

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

AWS Lambda 控制台的屏幕截图

  • @MartijnVandeGrift 我不认为这是真的(我希望是这样)。我认为它只对您有用,因为您实际上并未使用 AWS 开发工具包。如果你这样做了,你会在运行时得到一个 NoClassDefFoundError。 (2认同)

Jar*_*eld 5

对我来说,具有49 MB的JAR大小似乎有些大,具体取决于您所包括的库。如果您包括完整的AWS开发工具包(所有服务),则可能会增加JAR的大小。我假设您自己的代码和其他库的大小都是名义上的。如果您使用的是Maven,则可以仅包含所需服务的库(例如S3),并通过不包含不需要的库进行保存。

很好的资源是使用适用于Java的AWS开发工具包管理依赖关系-物料清单模块(BOM)博客文章。从技术上讲,它是一个稍微不同的主题,它展示了有关Java中AWS开发工具包的软件包管理的最佳实践。通过包含软件包aws-java-sdk-s3而不是aws-java-sdk作为示例,您会看到软件包大小的大幅减少,AWS提供了很多服务,并且它们的完整SDK相当大。

我在许多基于Java的Lambda函数中看到的部署大小为10 MB到13 MB,具体取决于我需要包括的其他第三方库。仅基于Java部署的工作原理,您肯定无法获得接近于node.js的部署大小,但是应该从您所在的位置获得改进的空间。


Rog*_*ger 5

您可能需要考虑将proguard视为开源 jar 收缩器/优化器。我发现它帮助我将 lambda 函数从 15Mb 减少到 3Mb。通过更谨慎地使用 proguard 选项,我可能可以将其降低,但我对现在的节省感到满意。

我的 Scala lambda 函数的基于 SBT 的设置如下 - 但我认为您应该为 Java lambda 函数获得类似的减少。

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