如何在aws lambda java中仅从s3下载一次s3文件

如何在aws lambda java中仅从s3下载一次s3文件,java,amazon-web-services,amazon-s3,aws-lambda,Java,Amazon Web Services,Amazon S3,Aws Lambda,我正在创建一个aws lambda函数,它下载一个s3文件,并根据每次收到的事件进行处理。但是我不想每次都从s3下载s3文件。有谁能建议我如何只下载一次s3文件并处理传入的事件,而不必每次都下载s3文件 目前,即使我将代码从lambdFunctionHandler类的构造函数中的s3加载到dowload,每次都会下载它 如果您有任何代码引用或示例,请使用java。 提前感谢我认为您可以在Java上使用静态块,该代码块将只执行一次,如下所示 // code from https://www.gee

我正在创建一个aws lambda函数,它下载一个s3文件,并根据每次收到的事件进行处理。但是我不想每次都从s3下载s3文件。有谁能建议我如何只下载一次s3文件并处理传入的事件,而不必每次都下载s3文件

目前,即使我将代码从lambdFunctionHandler类的构造函数中的s3加载到dowload,每次都会下载它

如果您有任何代码引用或示例,请使用java。
提前感谢

我认为您可以在Java上使用静态块,该代码块将只执行一次,如下所示

// code from https://www.geeksforgeeks.org/g-fact-79/
class Test { 
    static int i; 
    int j; 
    static { 
        i = 10; 
        // File download logic here , will be called only once
        System.out.println("static block called "); 
    } 
    Test(){ 
        System.out.println("Constructor called"); 
    } 
} 

class Main { 
    public static void main(String args[]) { 

       // Although we have two objects, static block is executed only once. 
       Test t1 = new Test(); 
       Test t2 = new Test(); 
    } 
} 

如果并行运行多个lamdba,则不会重用上下文。因此,您需要下载所有lambda中的文件。要存储文件,请使用/tmp/。它有512MB的限制

但是,如果您在另一个lamdba之后运行一个lamdba,则上下文可能会被重用,因此该文件将存在。记住冷靴

摘自

执行Lambda函数后,AWS Lambda将维护 执行上下文一段时间,以期待另一个Lambda 函数调用。实际上,服务冻结了执行 Lambda函数完成后的上下文,并解冻 重用,如果AWS Lambda选择在Lambda 函数再次被调用。这种执行上下文重用方法具有以下优点: 以下影响:

在函数的handler方法之外声明的对象保持初始化状态,在函数运行时提供额外的优化 再次调用。例如,如果Lambda函数建立 数据库连接,而不是重新建立连接 原始连接用于后续调用。我们建议 在代码中添加逻辑以检查之前是否存在连接 创建一个。 每个执行上下文在/tmp目录中提供512 MB的额外磁盘空间。当 执行上下文被冻结,提供了可以 用于多次调用。您可以添加额外的代码来检查 缓存包含您存储的数据。有关 部署限制,请参见AWS Lambda限制。 Lambda函数启动的后台进程或回调在函数结束时未完成,如果 AWS Lambda选择重用执行上下文。你应该 确保代码中的任何后台进程或回调都是正确的 在代码退出之前完成。 从S3下载obejct的示例代码:

AmazonS3 s3client = AmazonS3ClientBuilder
                  .standard()
                  .withRegion(Regions.EU_WEST_1)
                  .build();

        //S3 download file

        GetObjectRequest getObjectRequest = new GetObjectRequest(System.getenv("bucket"), "key");
        s3client.getObject(getObjectRequest, new File("/tmp/example.png")); 
编辑1:
对于需要在不同调用之间保持状态的应用程序,通常不建议使用lambda和Serverless。您的意思是,您只想在lambda处于热态时下载一次文件吗?基于VPC的lambda函数会保持热态15分钟

如果是,则如果在处理程序函数的外侧调用下载函数,则在lambda处于预热状态时,代码将只执行一次

在函数的handler方法之外声明的对象保持初始化状态,在再次调用函数时提供额外的优化。例如,如果Lambda函数建立数据库连接,而不是重新建立连接,则在后续调用中使用原始连接。我们建议在代码中添加逻辑,以便在创建连接之前检查连接是否存在


您是在不同的事件上下载单个文件还是多个文件?我希望每次在不同的事件上使用相同的文件。因此,我只想从s3下载一次该文件。这可能会有所帮助:我想这是在讨论s3级别的缓存。。这在这里有什么帮助呢?所以我想如果对aws lambda的请求/事件不是连续的,那么每次都会建立数据库连接。。我仍然觉得应该有一种方法来至少维护aws资源/服务的状态。是的,每次都会建立数据库连接。对于需要维护状态的应用程序,不建议使用Lambda函数。问题是Lambda上下文仅在某些子序列请求中共享,而不是在每个子序列请求中共享。因此,您可以编写一个代码,查看该文件是否存在,在这种情况下不会再次下载。但是,我不建议这样做,因为无服务器和lambda不用于需要在调用之间维护状态的应用程序。