[英]AWS Lambda : How to access S3 bucket from Lambda function using java
[英]Access to AWS S3 from AWS Lambda fall into timeout (No VPC)
我目前正在研究一個使用AWS lambda和AWS S3的項目。 我想創建一個將寫入S3存儲桶的Lambda。 這是我用Java編寫的lambda:
public class WriteIntoBucketHandler implements RequestHandler<SNSEvent, PutObjectResult> {
@Override
public PutObjectResult handleRequest(SNSEvent snsEvent, Context context) {
System.out.println("Connect to S3...");
AmazonS3 client = AmazonS3ClientBuilder.defaultClient();
System.out.println("Connected to S3 !");
System.out.println("Send data to S3...");
PutObjectResult result = client.putObject(
"my-bucket",
"tata",
snsEvent.getRecords().get(0).getSNS().getMessage()
);
System.out.println("Data sent to S3 !");
return result;
}
}
此lambda日志正確Connect to S3...
但是此后立即進入超時狀態,因此不顯示Connected to S3 !
(超時設置為10秒)
我將lamda配置為具有AmazonS3FullAccess
且no VPC
。
我已經讀了很多關於互聯網和堆棧溢出的文章。 我什么也找不到解決的辦法。 有人有主意嗎?
編輯:
我將超時設置為一分鍾,並且在達到超時之前收到了此日志:
START RequestId: c300eec4-42bb-4985-9360-7e1e0d9fbdfb Version: $LATEST
Connect to S3...
Metaspace: java.lang.OutOfMemoryError java.lang.OutOfMemoryError: Metaspace at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at ja
Exception in thread "main" java.lang.Error: java.lang.OutOfMemoryError: Metaspace
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:66)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:114)
Caused by: java.lang.OutOfMemoryError: Metaspace
END RequestId: c300eec4-42bb-4985-9360-7e1e0d9fbdfb
REPORT RequestId: c300eec4-42bb-4985-9360-7e1e0d9fbdfb Duration: 13202.94 ms Billed Duration: 13300 ms Memory Size: 128 MB Max Memory Used: 103 MB
Metaspace java.lang.OutOfMemoryError
我找到了解決方案。 我將Lambda設置為在1分鍾后超時。 之后,我有了一個新的例外:
START RequestId: c300eec4-42bb-4985-9360-7e1e0d9fbdfb Version: $LATEST
Connect to S3...
Metaspace: java.lang.OutOfMemoryError java.lang.OutOfMemoryError: Metaspace at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at ja
Exception in thread "main" java.lang.Error: java.lang.OutOfMemoryError: Metaspace
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:66)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:114)
Caused by: java.lang.OutOfMemoryError: Metaspace
END RequestId: c300eec4-42bb-4985-9360-7e1e0d9fbdfb
REPORT RequestId: c300eec4-42bb-4985-9360-7e1e0d9fbdfb Duration: 13202.94 ms Billed Duration: 13300 ms Memory Size: 128 MB Max Memory Used: 103 MB
Metaspace java.lang.OutOfMemoryError
就像在例外中所說的那樣,128MB不足以實例化S3客戶端。 S3客戶端至少需要192MB,所以我不得不增加lambda大小的內存。
重要說明 :僅第一個實例要花費10秒鍾以上的時間才能執行。 在那之后,所有的lambda執行都將更快。 但是,在1小時之后,lambda將需要再次進行身份驗證,並且將花費10秒鍾以上的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.