Лямбда-обработчики AWS на Java, пакет недоступен - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь реализовать обработчик Lambda AWS в Java. Я использую эту зависимость в моем pom.xml:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-lambda</artifactId>
    <version>1.11.487</version>
</dependency>

В моем коде Java:

import com.amazonaws.services.lambda.runtimeContext;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEven;

IDE жалуется, что нет пакета com.amazonaws.services.lambda (и подпакетов). Пробовал проект реимпортировать - без разницы.

Полные имена классов взяты из документации AWS здесь: https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-handler-types.html

Я подозреваю, что использую какую-то неправильную зависимость. Какая зависимость Maven здесь на самом деле нужна?

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Материал Java Lambda немного сбивает с толку.Существует одна библиотека, в которой вам нужно написать Lambda, и необязательную библиотеку для обработки событий на основе Amazon.

Эти библиотеки несколько документированы на этой странице .

Для использованиябиблиотеку aws-lambda-java-core в maven, которую вы захотите использовать:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.2.0</version>
</dependency>

в качестве зависимости от Maven.

Для использования aws-lambda-java-events (библиотека событий Lambda) использует зависимость

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-events</artifactId>
    <version>2.2.5</version>
</dependency>

в вашем pom.xml.

В вашем примере приходят com.amazonaws.services.lambda.runtime.Context и com.amazonaws.services.lambda.runtime.RequestHandlerиз библиотеки aws-lambda-java-core. Ваше сообщение выглядит так, как будто у вас проблема с копированием / вставкой при первом импорте .

Но com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent и com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent (опять же, ваше сообщение содержит опечатку) происходят из aws-lambda-java-events.Эта библиотека упрощает работу с событиями AWS.Ваш код выглядит так, как будто он хочет обрабатывать события API Gateway Proxy .

Однако имейте в виду, что, потянув библиотеку aws-lambda-java-events, вы получаете огромное количество библиотек AWS.Например, даже если ваша Lambda хочет только события API Gateway, вы все равно получите зависимость от библиотеки S3, поскольку библиотека событий также обрабатывает события S3.Таким образом, ваш пакет развертывания Lambda будет значительно больше, чем если бы вы его не включили.

В качестве альтернативы библиотеке событий вы можете использовать что-то вроде JsonPath , чтобы извлечь то, что вы хотитесобытия.Ваша лямбда будет выглядеть примерно так:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.jayway.jsonpath.JsonPath;

public class YourLambdaHandler implements RequestStreamHandler {
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
        String accountId = JsonPath.read(inputStream, "$.requestContext.accountId");

Что будет читать accountId из события API Gateway.

Нет никаких сомнений в том, что этот способ немного сложнее, но если вы вытаскиваете из соревнования только несколько предметов, то это может быть более легкий способ.

РЕДАКТИРОВАТЬ

Похоже, у вас есть проблема сборки / IDE.Итак, наименьшее количество кода, которое я могу показать, это сначала работающий pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yourpackage.handler</groupId>
    <artifactId>apigateway</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-events</artifactId>
            <version>2.2.5</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

и обработчик лямбды:

package com.yourpackage.handler;

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

@SuppressWarnings("unused")
public class DemoHandler implements RequestHandler<APIGatewayProxyResponseEvent, String> {
    public String handleRequest(APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent, Context context) {
        return "hello";
    }
}

Можете ли вы начать с новой среды и попробоватьэто из?

0 голосов
/ 02 мая 2019

Следующие зависимости работали для меня

<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-events</artifactId>
        <version>2.2.6</version>
    </dependency>
</dependencies>
0 голосов
/ 26 января 2019

Пробовали ли вы весь AWS SDK?

<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.11.489</version>
</dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...