Подтвердить что ты не робот

AWS Lambda: Как получить доступ к ведро S3 от функции Lambda с помощью java

Я написал функцию Лямбды. Эта функция загружается в s3Bucket = "my-lambda", которая отображается на роль hello-lambda-role и regionName = "us-west-2".

Теперь я хотел получить доступ к s3Bucket = "some-other", где мы сопоставили Политику с 'hello-lambda-role', и она находится в регионе "eu-west-1".

Вот класс API, который я использую AmazonS3Client. Мое намерение состоит в том, чтобы получить некоторый файл из ведра "некоторые-другие". Но до этого мне нужно установить соединение.

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;
    }
}
4b9b3361

Ответ 1

Используйте тот же код, что и в вашем тесте, за исключением того, что вам не нужно предоставлять учетные данные при создании AmazonS3Client. Обратите внимание, что роль, которую использует ваша лямбда, имеет право доступа к вашему ведерке S3. Область ведра S3 не должна иметь значения; имя ведра однозначно определяет ведро независимо от региона.

Lambdas обычно запускается событием, но вы можете вызвать AWSLambdaClient.invoke(), чтобы запустить его вручную.

Например:

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

Разверните это для AWS как "mylambda", а затем вызовите удаленно с помощью:

lambdaClient.invoke(new InvokeRequest().withFunctionName("mylambda").withPayload("input"));