带有Java的AWS Lambda无法从S3获取文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有Java的AWS Lambda无法从S3获取文件相关的知识,希望对你有一定的参考价值。

我正在使用AWS Lambda创建一个非常简单的示例,我在使用Java运行时时遇到了问题。我必须从我的一个桶中读取一个S3对象并使用NodeJS示例,如下所示我没有问题

var S3FS = require('s3fs');

exports.handler = (req, res) => {
    var s3Options = {
        region: 'eu-west-3',
        accessKeyId: 'key',
        secretAccessKey: 'secret'
    };

    var fsImpl = new S3FS('mybucket', s3Options);

    fsImpl.readFile("myfile",function (err,data) {
        if (err) throw err;
        console.log(data.toString());
    });
}

如果我尝试类似的Java示例,我的函数总是超时(即使我增加到1分钟)

context.getLogger().log("Before");
BasicAWSCredentials awsCreds = new BasicAWSCredentials("key", "secret");
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
        .withRegion("eu-west-3")
        .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
        .build();
context.getLogger().log("client created");
S3Object object = s3.getObject(
            new GetObjectRequest(bucketName, key));
context.getLogger().log("After");

创建S3客户端时,该功能始终会阻止。我知道我可以避免在Lambda中使用密钥和密钥,但也以这种方式使用功能块。这不是一个策略问题,因为我正在使用相同的Lambda配置测试这些示例,因此我认为它与Java AWS S3 API有关。有什么建议?

答案

Java lambda最终使用defaultClient()而不是AmazonS3ClientBuilder的standard()方法。

这两种方法之间的区别在于凭证,从env检索或作为参数传递。我可能没有看到错误的配置,但无论如何更明确的错误可能是有用的

以上是关于带有Java的AWS Lambda无法从S3获取文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 lambda 函数从 AWS s3 获取文本文件的内容?

使用带有 Node.js 的 AWS Lambda 函数从 S3 存储桶中提取 zip 文件并上传到另一个存储桶

AWS Lambda 返回权限被拒绝尝试从 S3 存储桶获取对象

AWS Lambda无法删除Amazon S3对象

Zip 文件在使用节点和 AWS lambda 从 SFTP 服务器发布到 S3 后无法展开

从 VPC 中的 Lambda 访问 AWS S3