![](/img/trans.png)
[英]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.