NoSuchMethod при вызове AWS Lambda с помощью AWS Sdk

Я создал и развернул один простой GET API в API Gateway, и вот ARN, и в этой функции нет никакой аутентификации, я могу просто вызвать ее в своем браузере.

arn:aws:lambda:ap-southeast-1:XXXXXXXXXXXXXX:function:La

и общедоступный URL-адрес, который можно просмотреть с помощью браузера:

https://xxxxxxxxx.execute-api.ap-southeast-1.amazonaws.com/v1/lambda/geta

и я использую загрузочный проект Spring и приведенный ниже код для вызова API (после этот документ)

Интерфейс как лямбда-сервис

package com.xxxxxxx.services.interfaces;

import com.amazonaws.services.lambda.invoke.LambdaFunction;

public interface ILambdaGetBalance {

    @LambdaFunction(functionName="La")
        String getA();
    }

Служба, использующая этот интерфейс для вызова лямбда-функции

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.xxxxxxxx.services.interfaces.ILambdaGetBalance;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.lambda.AWSLambda;
import com.amazonaws.services.lambda.AWSLambdaClientBuilder;
import com.amazonaws.services.lambda.invoke.LambdaInvokerFactory;

@Service
public class LambdaService {

    @Value("${aws.access-key}")
    private String accessKey; 

    @Value("${aws.secret-key}")
    private String secretKey;

    @Value("${aws.lambda.region-name}") // this is ap-southeast-1
    private String regionName;

    public void test() {
        AWSCredentials credentials = new BasicAWSCredentials(accessKey,
                secretKey); 
        AWSLambda client = AWSLambdaClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(regionName)
                .build();

        final ILambdaGetBalance getBalance = LambdaInvokerFactory.builder()
                .lambdaClient(client)
                .build(ILambdaGetBalance.class);

        getBalance.getA();
    }
}

после вызова функции getA система выдаст следующее исключение:

java.lang.NoSuchMethodError: com.amazonaws.services.lambda.AWSLambdaClient.beforeClientExecution(Lcom/amazonaws/AmazonWebServiceRequest;)Lcom/amazonaws/AmazonWebServiceRequest;

Любая идея, почему это происходит? Что мне не хватает?


person arash moeen    schedule 14.04.2017    source источник


Ответы (1)


Похоже, ваши модули aws-java-sdk-lambda и aws-java-sdk-core могут иметь несовместимые версии. Как вы решаете зависимости для вашего проекта? Метод beforeClientExecution был добавлен в базовый класс AmazonWebServiceClient в версии 1.11.106 из aws-java-sdk-core — см. здесь: https://github.com/aws/aws-sdk-java/blame/master/aws-java-sdk-core/src/main/java/com/amazonaws/AmazonWebServiceClient.java#L590

person kiiadi    schedule 19.04.2017