AWS Lambda:如何使用java从Lambda函数访问S3 bucket

AWS Lambda:如何使用java从Lambda函数访问S3 bucket,java,amazon-web-services,amazon-s3,aws-lambda,Java,Amazon Web Services,Amazon S3,Aws Lambda,我已经写了一个Lambda函数。 此函数上传到s3Bucket=“my lambda”中,该函数映射到角色hello lambda角色和regionName=“us-west-2” 现在,我想访问s3Bucket=“some other”,我们将政策映射为“hello lambda role”,它位于“eu-west-1”区域 这是我正在使用的API类。我的意图是从“其他人”的桶中获取一些文件。但在此之前,我需要建立连接 import com.amazonaws.services.lambda.

我已经写了一个Lambda函数。 此函数上传到s3Bucket=“my lambda”中,该函数映射到角色hello lambda角色和regionName=“us-west-2”

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

这是我正在使用的API类。我的意图是从“其他人”的桶中获取一些文件。但在此之前,我需要建立连接

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);
    }

}
import com.amazonaws.services.lambda.runtime.Context;
导入com.amazonaws.services.lambda.runtime.RequestHandler;
公共类lambdFunctionHandler实现RequestHandler{
公共响应handleRequest(请求、请求、上下文){
String greetingString=String.format(“你好%s%s.”,
request.firstName,request.lastName);
返回新的响应(greetingString);
}
}
下面是列出bucket的类

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;
    }
}
公共类测试{
私有静态最终日志记录器=LogFactory.getLog(InvokeLambda.class);
私有静态最终字符串awsAccessKeyId=“XXXXX”;
私有静态最终字符串awsSecretAccessKey=“XXXXX”;
私有静态最终字符串regionName=“eu-west-1”;
私有静态区域;
专用静态AWSCredentials凭证;
私有静态awslambda客户端lambda客户端;
私有静态AmazonS3客户端S3客户端;
私有静态void init(){
凭证=新的基本凭证(awsAccessKeyId,
awsSecretAccessKey);
s3Client=(凭据==null)?新建AmazonS3Client()
:新AmazonS3Client(凭据);
region=region.getRegion(Regions.fromName(regionName));
s3Client.setRegion(region);
lambdClient=(凭据==null)?新的AWSLambdClient()
:新的AWSLambda客户端(凭据);
lambdaClient.setRegion(区域);
//lambdClient.configureRegion(Regions.US\u WEST\u 2);
}
/**
*AWS lambda函数的入口点。
*/
公共静态void main(字符串…参数){
init();
getExistingBucket();
}
私有静态Bucket getExistingBucket(){
List bucket=s3Client.listbakes();
用于(铲斗:铲斗){
logger.error(bucket.getName());
}
返回null;
}
}

使用与测试中相同的代码,只是在创建
AmazonS3Client
时不需要提供凭据。请注意,lambda使用的角色需要访问S3存储桶的权限。S3桶的区域应该无关紧要;bucket名称唯一标识bucket,而不考虑区域

lambda通常由事件触发,但您可以调用以手动运行它

例如:

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"));

您遇到了什么问题?在代码中放置访问密钥和密钥是一种反模式。在aws之外运行代码时,您应该将其放入
~/.aws/credentials
文件中,并在EC2或Lambda上运行时使用IAM角色。那么,还有什么事情可能会导致S3拒绝访问?我基本上使用了上面的代码(使用AmazonS3ClientBuilder.defaultClient()来构建客户机,但在其他情况下…),但仍然拒绝访问(服务:AmazonS3;状态代码:403;错误代码)