簡體   English   中英

如何在aws lambda java中僅從s3下載s3文件一次

[英]how to download s3 file from s3 only once in aws lambda java

我正在創建一個 aws lambda 函數,它下載一個 s3 文件並根據它每次收到的事件處理它。 但是我不想每次都從 s3 下載 s3 文件。 誰能建議我如何只下載一次 s3 文件並處理傳入的事件而不必每次都下載 s3 文件?

目前,即使我將代碼從 s3 下載到 lambdafunctionhandler 類的構造函數中,它也每次都會下載

如果您做任何代碼參考或示例,請使用java。 提前致謝

如果您並行運行多個 lamdbas,則不會重用上下文。 所以你需要下載所有 lambdas 中的文件。 使用 /tmp/ 存儲文件。 它的限制為 512MB。

但是,如果您一個接一個地運行 lamdba,則上下文可能會被重用,因此該文件將存在。 記住冷啟動。

摘自AWS Lamdba DOC

在執行 Lambda 函數后,AWS Lambda 會在一段時間內維護執行上下文,以期待另一個 Lambda 函數調用。 實際上,如果 AWS Lambda 在再次調用 Lambda 函數時選擇重用上下文,則該服務會在 Lambda 函數完成后凍結執行上下文,並解凍上下文以供重用。 這種執行上下文重用方法具有以下含義:

  • 在函數的處理程序方法之外聲明的對象保持初始化狀態,在函數執行時提供額外的優化
    再次調用。 例如,如果您的 Lambda 函數建立了一個
    數據庫連接,而不是重新建立連接,
    原始連接用於后續調用。 我們建議
    在代碼中添加邏輯以檢查之前是否存在連接
    創造一個。 每個執行上下文在 /tmp 目錄中提供 512 MB 的額外磁盤空間。 當執行上下文被凍結時,目錄內容仍然存在,提供可用於多次調用的臨時緩存。 您可以添加額外的代碼來檢查緩存是否包含您存儲的數據。 有關部署限制的信息,請參閱 AWS Lambda 限制。 如果 AWS Lambda 選擇重用執行上下文,則由您的 Lambda 函數啟動但在函數結束時未完成的后台進程或回調將恢復。 在代碼退出之前,您應該確保代碼中的任何后台進程或回調都已完成。

從 S3 下載對象的示例代碼:

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:對於需要在不同調用之間維護狀態的應用程序,一般不建議使用 Lambdas 和無服務器。

您的意思是,您只想在 lambda 熱的時候下載文件一次?基於 VPC 的 lambda 函數會保持熱 15 分鍾。

如果是,如果您在處理程序函數之外調用下載函數,則代碼只會在 lambda 熱時執行一次。

在函數的處理程序方法之外聲明的對象保持初始化狀態,從而在再次調用函數時提供額外的優化。 例如,如果您的 Lambda 函數建立了數據庫連接,而不是重新建立連接,而是在后續調用中使用原始連接。 我們建議在您的代碼中添加邏輯以在創建連接之前檢查連接是否存在。

https://docs.aws.amazon.com/lambda/latest/dg/running-lambda-code.html

我認為您可以在 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(); 
    } 
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM