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

时间:2018-03-04 20:43:08

标签: java node.js amazon-web-services amazon-s3 lambda

我正在使用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有关。有什么建议?

1 个答案:

答案 0 :(得分:0)

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

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