Java Maven部署包并上传到AWS Lambda

Java Maven部署包并上传到AWS Lambda,java,maven,amazon-web-services,amazon-s3,aws-lambda,Java,Maven,Amazon Web Services,Amazon S3,Aws Lambda,我在将maven部署包上传到AmazonS3时遇到了问题 从Eclipse中,我能够成功地生成.jar文件,但是我在上传到服务器时遇到了问题 以下是我的Java代码: package main.java.mavantestproj; import java.util.Map; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import co

我在将maven部署包上传到AmazonS3时遇到了问题

从Eclipse中,我能够成功地生成.jar文件,但是我在上传到服务器时遇到了问题

以下是我的Java代码:

package main.java.mavantestproj;

import java.util.Map;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.lambda.runtime.Context;

public class LambdaFunctionHandler {


    public String handleRequest(Map<String,Object> input, Context context) {
        context.getLogger().log("Input: " + input);

        AmazonDynamoDBClient client = new AmazonDynamoDBClient(new ProfileCredentialsProvider("mytest"));

        client.setRegion(com.amazonaws.regions.Region.getRegion(Regions.US_WEST_2));

        client.describeTable("ProductCatalog");
        // TODO: implement your handler
        return null;
    }

}
package main.java.mavantestproj;
导入java.util.Map;
导入com.amazonaws.auth.profile.ProfileCredentialsProvider;
导入com.amazonaws.regions.regions;
导入com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
导入com.amazonaws.services.lambda.runtime.Context;
公共类lambdFunctionHandler{
公共字符串handleRequest(映射输入、上下文){
context.getLogger().log(“输入:”+Input);
AmazonDynamoDBClient=newamazondynamodbclient(newprofilecredentialsprovider(“mytest”);
setRegion(com.amazonaws.regions.Region.getRegion(regions.US_-WEST_2));
可描述的客户(“产品目录”);
//TODO:实现您的处理程序
返回null;
}
}
在目标文件夹中,我有两个jar。ie lambda-java-example-1.0-SNAPSHOT.jar和original-lambda-java-example-1.0-SNAPSHOT.jar


在这个jar中,第一个是35MB,第二个是4KB。我不知道要上传哪一个到S3来运行lambda函数。

正在生成的更大的JAR文件包含所有嵌入的库依赖项。这是您希望上载到S3供AWS Lambda使用的一个,因为这些依赖项是运行所必需的


如果要缩小此文件,可以确保只包含所需的库,并删除任何不必要的库。实现这一点的常用方法是,AWS SDK只包含您需要调用的特定服务(如DynamoDB)的库,而不包括整个AWS SDK。

您肯定需要大的“”,因此将包括您的依赖类,但是有另一种方法可以使用Mavenassembly插件而不是Shade插件为AWS Lambda打包。最终将得到一个.zip格式的AWS lambda部署包,而不是一个.jar文件。它看起来更像一个JEE.war文件,所有原始的.jar依赖项都保持不变,并且您可以包含其他东西,比如属性文件,这些文件最终在运行lambda的文件系统中解包(在代码中查找和加载可能会更容易一些)。如果您对详细信息感兴趣,这里有一篇关于它的博客文章:另外,以这种方式打包Lambda函数应用程序可以更容易地查看zip文件,找出包含哪些依赖项jar,然后确定可以排除哪些依赖项jar


这仍然不能让Maven处理包到AWS的实际部署(创建或更新)。部署和捕获部署信息(ARN、API网关应用程序id url等)似乎是亚马逊尚未提供非常明确答案或解决方案的下一件事。

根据此AWS,似乎使用shade插件构建的独立jar文件就足够了。

您好,谢谢回复。我有一个疑问。如果我直接从eclipse调用AmazonS3 bucket,每次我的代码需要25分钟才能上传,带宽为6mbps。如果我使用maven&如果我只想在项目中包含amazonaws相关的libs,这将生成34MB的jar文件,上传同样需要15分钟。每次如果我做任何小的代码更改,我需要为两个选项遵循相同的步骤。这很乏味,对吧?。或者你会建议的任何替代方案?以6Mbps的速度上传35Mb只需47秒。显而易见的解决办法是不使用互联网连接。我的部署方式是使用运行在EC2实例上的Jenkins,因此我只需要在本地将代码传输到我的git存储库,Jenkins负责构建并上传到S3,并进行必要的API调用来部署代码。好的,很好,但是如果我通过eclipse将代码部署到S3存储桶。我的日食也需要更长的时间。即使是一个小小的java文件更改,也可以将完整的二进制文件上传到s3 bucket。那么根据你的说法,只有詹金吗?。我对这个很陌生,如果我错了,请纠正我。感谢您必须部署更大的版本,因为这是在Lambda中实际运行代码所必需的。然而,我猜你是在包含“aws java sdk”依赖项,而你可能需要的只是“aws java sdk dynamodb”,这将减少部署规模。是的,你是对的,我已经删除了它,我使用了这个ie。。这一个将大小从35mb减少到了5MB,是否还有其他与maven中的dynamodb函数相关的库可以进一步减少我的jar文件大小?您能发布POM依赖项的样子吗?如果您只与DynamoDB交互,那么35MB似乎有点大。根据我的经验,您应该能够将其降低到11MB。相关的Maven Assembly插件在我的案例中是补充性的(例如,
excludes
指令)。如果您想知道为什么要包含特定的依赖项,那么命令
mvn dependency:tree
非常有用。