如何减少 Eclipse 中 JAVA 中编写的 AWS Lambda 代码的大小
How to reduce the size of AWS Lambda code written in JAVA in Eclipse
我是一名 android 开发人员,正在探索 Amazon AWS 作为我未来应用程序的后端选项。我已经使用 JAVA 探索了各种 AWS 服务,例如 dynamoDB、S3、SES 和很酷的 lambda 功能。在学习过程中,我 found/prepared 为上传到 S3 存储桶的每张图片创建缩略图的代码。我在 eclipse IDE 中成功地在 java 中编写了 Lambda 代码,并且能够使用 AWS 控制台上传和使用它来达到预期目的。
我担心的是,当我将 JAVA Lambda 代码上传到 AWS 时,它的大小显示为 49 MB。当我寻找原因时,我发现在 AWS sdk 下的项目中有很多 jar 用于 java。这是正常现象还是我无论如何都可以减少上传代码的大小。请指导我如何有效地减小尺寸。我还看到了相同的 node.js Lambda 代码,并且仅以 KB 为单位。可能是我在做一些错误的事情。
请帮忙...
简单的答案 - 你做对了,包大小不能减少到与 node.js 应用程序相当的大小。
对于 node.js lambda,亚马逊有 AWS SDK 库,因此您只需上传自己的代码和第三方库。但对于 java lambda,AWS SDK 必须与应用程序一起打包。
但是您可以通过仔细选择要包含的库并排除不必要的依赖项来减小包的大小。
JAR 大小为 49 MB 对我来说似乎有点大,具体取决于您包含的库。如果您包括完整的 AWS SDK(所有服务),这可能会给您的 JAR 增加相当多的大小。我假设您自己的代码和其他库的大小是名义上的。如果您使用的是 Maven,那么您可以只包含您需要的服务的库(例如:S3),并通过不包含您不需要的服务来保存。
Managing Dependencies with AWS SDK for Java - Bill of Materials module (BOM) 博客 post 是一个很好的资源。虽然它在技术上涉及的主题略有不同,但它在 Java 中展示了有关 AWS SDK 包管理的最佳实践。通过包含包 aws-java-sdk-s3
而不是 aws-java-sdk
作为示例,您将看到包大小大幅减少,AWS 有很多服务,它们的完整 SDK 非常大。
我看到许多基于 Java 的 Lambda 函数的部署大小为 10 MB 到 13 MB,具体取决于我需要包含的其他第 3 方库。仅根据 Java 部署工作方式的性质,您绝对无法获得接近 node.js 的部署规模,但应该有改进的空间。
我的第一个 Java Lambda 函数也相当大。我的 HelloWorld Java 函数有 10+ MB!当您按照 AWS 网站上的 Java 功能部署教程进行操作时,您会觉得有必要打包 AWS-sdk。不是。
我已经对此进行了测试,得出的结论是没有必要将 AWS-sdk 打包为 运行 Lambda 函数。如果您使用的是 Maven,则可以将 AWS-sdk 设置为 provided, by:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.10.72</version>
<scope>provided</scope>
</dependency>
当您将函数打包到 JAR 中时,这将导致几个 KB 的函数。
您可能需要考虑查看 proguard 开源 jar 收缩器/优化器。我发现它帮助我将 lambda 函数从 15Mb 减少到 3Mb。如果更小心地使用 proguard 选项,我可能会得到比这更低的值,但我对现在的节省感到很高兴。
我对 Scala lambda 函数的基于 SBT 的设置如下 - 但我认为你应该对 Java lambda 函数进行类似的减少。
ProguardKeys.options in Proguard ++= Seq(
"-dontoptimize",
"-dontobfuscate",
"-dontnote",
"-dontwarn",
"-keep,includedescriptorclasses class mypackage.** { *; }",
)
您可以使用 aws-lightweight-client-java,它是一个独立的 jar(无依赖项)并且 小于 60K。减少的 类 数量也可以大大减少 Lambda 冷启动次数(详见项目)。问题是您必须通过其文档更多地了解 AWS API,而不是依赖 IDE 中的自动完成以及 AWS SDK 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 编码(但您应该检查项目最近发布)。
我是一名 android 开发人员,正在探索 Amazon AWS 作为我未来应用程序的后端选项。我已经使用 JAVA 探索了各种 AWS 服务,例如 dynamoDB、S3、SES 和很酷的 lambda 功能。在学习过程中,我 found/prepared 为上传到 S3 存储桶的每张图片创建缩略图的代码。我在 eclipse IDE 中成功地在 java 中编写了 Lambda 代码,并且能够使用 AWS 控制台上传和使用它来达到预期目的。
我担心的是,当我将 JAVA Lambda 代码上传到 AWS 时,它的大小显示为 49 MB。当我寻找原因时,我发现在 AWS sdk 下的项目中有很多 jar 用于 java。这是正常现象还是我无论如何都可以减少上传代码的大小。请指导我如何有效地减小尺寸。我还看到了相同的 node.js Lambda 代码,并且仅以 KB 为单位。可能是我在做一些错误的事情。
请帮忙...
简单的答案 - 你做对了,包大小不能减少到与 node.js 应用程序相当的大小。
对于 node.js lambda,亚马逊有 AWS SDK 库,因此您只需上传自己的代码和第三方库。但对于 java lambda,AWS SDK 必须与应用程序一起打包。
但是您可以通过仔细选择要包含的库并排除不必要的依赖项来减小包的大小。
JAR 大小为 49 MB 对我来说似乎有点大,具体取决于您包含的库。如果您包括完整的 AWS SDK(所有服务),这可能会给您的 JAR 增加相当多的大小。我假设您自己的代码和其他库的大小是名义上的。如果您使用的是 Maven,那么您可以只包含您需要的服务的库(例如:S3),并通过不包含您不需要的服务来保存。
Managing Dependencies with AWS SDK for Java - Bill of Materials module (BOM) 博客 post 是一个很好的资源。虽然它在技术上涉及的主题略有不同,但它在 Java 中展示了有关 AWS SDK 包管理的最佳实践。通过包含包 aws-java-sdk-s3
而不是 aws-java-sdk
作为示例,您将看到包大小大幅减少,AWS 有很多服务,它们的完整 SDK 非常大。
我看到许多基于 Java 的 Lambda 函数的部署大小为 10 MB 到 13 MB,具体取决于我需要包含的其他第 3 方库。仅根据 Java 部署工作方式的性质,您绝对无法获得接近 node.js 的部署规模,但应该有改进的空间。
我的第一个 Java Lambda 函数也相当大。我的 HelloWorld Java 函数有 10+ MB!当您按照 AWS 网站上的 Java 功能部署教程进行操作时,您会觉得有必要打包 AWS-sdk。不是。
我已经对此进行了测试,得出的结论是没有必要将 AWS-sdk 打包为 运行 Lambda 函数。如果您使用的是 Maven,则可以将 AWS-sdk 设置为 provided, by:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.10.72</version>
<scope>provided</scope>
</dependency>
当您将函数打包到 JAR 中时,这将导致几个 KB 的函数。
您可能需要考虑查看 proguard 开源 jar 收缩器/优化器。我发现它帮助我将 lambda 函数从 15Mb 减少到 3Mb。如果更小心地使用 proguard 选项,我可能会得到比这更低的值,但我对现在的节省感到很高兴。
我对 Scala lambda 函数的基于 SBT 的设置如下 - 但我认为你应该对 Java lambda 函数进行类似的减少。
ProguardKeys.options in Proguard ++= Seq(
"-dontoptimize",
"-dontobfuscate",
"-dontnote",
"-dontwarn",
"-keep,includedescriptorclasses class mypackage.** { *; }",
)
您可以使用 aws-lightweight-client-java,它是一个独立的 jar(无依赖项)并且 小于 60K。减少的 类 数量也可以大大减少 Lambda 冷启动次数(详见项目)。问题是您必须通过其文档更多地了解 AWS API,而不是依赖 IDE 中的自动完成以及 AWS SDK 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 编码(但您应该检查项目最近发布)。