AWS Lambda:如何使用java从Lambda函数访问S3存储桶

2024-03-21

我写了一个 Lambda 函数。 该函数上传到s3 Bucket =“by-lambda”中,映射到角色hello-lambda-role和region_Name =“us-west-2”。

现在我想访问 s3Bucket="some-other",我们已将策略映射为“hello-lambda-role”,并且它位于“eu-west-1”区域。

这是我正在使用的 API 类亚马逊S3客户端 http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html。我的目的是从“其他”存储桶中获取一些文件。但在此之前我需要建立联系。

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler implements RequestHandler<Request, Response> {

    public Response handleRequest(Request request, Context context) {
        String greetingString = String.format("Hello %s %s.",
                request.firstName, request.lastName);
        return new Response(greetingString);
    }

}

这是列出存储桶的类。

public class Test{
    private static final Log logger = LogFactory.getLog(InvokeLambda.class);
    private static final String awsAccessKeyId = "XXXXX";
    private static final String awsSecretAccessKey = "XXXXX";
    private static final String regionName = "eu-west-1";
    private static Region region;
    private static AWSCredentials credentials;
    private static AWSLambdaClient lambdaClient;
    private static AmazonS3Client s3Client;

    private static void init() {
        credentials = new BasicAWSCredentials(awsAccessKeyId,
                awsSecretAccessKey);
        s3Client = (credentials == null) ? new AmazonS3Client()
                : new AmazonS3Client(credentials);
        region = Region.getRegion(Regions.fromName(regionName));
        s3Client.setRegion(region);
        lambdaClient = (credentials == null) ? new AWSLambdaClient()
                : new AWSLambdaClient(credentials);

        lambdaClient.setRegion(region);
        // lambdaClient.configureRegion(Regions.US_WEST_2);
    }

    /**
     * The entry point into the AWS lambda function.
     */
    public static void main(String... args) {
        init();
        getExistingBucket();
    }

    private static Bucket getExistingBucket() {
        List<Bucket> buckets = s3Client.listBuckets();
        for (Bucket bucket : buckets) {
            logger.error(bucket.getName());
        }
        return null;
    }
}

使用与测试中相同的代码,除非您在创建时不需要提供凭据AmazonS3Client。请注意,您的 lambda 使用的角色需要有权访问您的 S3 存储桶。 S3 存储桶的区域并不重要;桶名唯一标识该桶,与地域无关。

Lambda 通常由事件触发,但您可以调用AWSLambdaClient.invoke() http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/lambda/AWSLambdaClient.html#invoke(com.amazonaws.services.lambda.model.InvokeRequest)手动运行它。

例如:

public Response handleRequest(Request request, Context context) {
    AmazonS3Client s3Client = new AmazonS3Client();
    S3Object = s3Client.getObject("some-other", request.getFilename());
    ....
    return new Response(result);
}

将其作为“mylambda”部署到 AWS,然后使用以下命令远程调用:

lambdaClient.invoke(new InvokeRequest().withFunctionName("mylambda").withPayload("input"));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Lambda:如何使用java从Lambda函数访问S3存储桶 的相关文章

随机推荐