2
votes

Gestionnaires AWS Lambda en Java, le package n'est pas disponible

J'essaie d'implémenter un gestionnaire AWS Lambda en Java. J'utilise cette dépendance dans mon pom.xml:

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;

Dans mon code Java:

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

L'EDI se plaint qu'il n'y a pas de com .amazonaws.services.lambda package (et sous-packages). J'ai essayé la réimportation du projet - aucune différence.

Les noms complets des classes sont tirés de la documentation AWS ici: https://docs.aws. amazon.com/lambda/latest/dg/java-programming-model-handler-types.html

Je soupçonne que j'utilise une mauvaise dépendance. Quelle dépendance Maven est réellement nécessaire ici?


4 commentaires

Voir la réponse de @ JacobG. La bibliothèque souhaitée ne se trouve pas dans le SDK normal. Vous avez inclus le SDK Lambda client dans votre pom.xml . Cette page explique bien les bibliothèques mais ce n'est pas clair à 100%.


Est-il possible qu'Amazon AWS ait modifié la présentation de ses packages Java (en particulier la bibliothèque AWS Lambda) et n'ait pas mis à jour la documentation?


J'ai ajouté une réponse qui étend les autres. Faites-moi savoir si cela répond à vos questions.


@stdunbar Répondu ci-dessous. Merci pour l'excellente explication. Il y a un problème étrange avec les dépendances Maven. J'ai même essayé de supprimer l'intégralité du dépôt local aujourd'hui, et cela n'a pas changé la situation.


3 Réponses :


-1
votes

Avez-vous essayé l'intégralité du kit 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>


1 commentaires

J'ai essayé la version 1.11.490 et cela n'a pas changé la situation.



2
votes

Le contenu de Java Lambda est un peu déroutant. Il existe une bibliothèque dont vous avez besoin pour écrire un Lambda et une bibliothèque facultative pour gérer les événements basés sur Amazon.

Ces bibliothèques sont quelque peu documentées sur cette page .

Pour utiliser la bibliothèque aws-lambda-java-core dans maven, vous voudrez utiliser:

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

comme dépendance Maven.

Pour utiliser aws-lambda-java-events strong> (la bibliothèque d'événements Lambda) utilise la dépendance

<?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>

dans votre pom.xml.

Dans votre exemple com.amazonaws.services.lambda.runtime.Context et com.amazonaws.services.lambda.runtime.RequestHandler proviennent de aws-lambda-java-core bibliothèque. Votre message semble avoir rencontré un problème de copier / coller lors de la première importation .

Mais com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent code > et com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent (encore une fois, votre message contient une faute de frappe) proviennent de aws-lambda-java-events . Cette bibliothèque simplifie la gestion des événements AWS. Votre code semble vouloir gérer Événements proxy de passerelle API .

Sachez cependant qu'en extrayant la bibliothèque aws-lambda-java-events , vous récupérez un grand nombre de bibliothèques AWS . Par exemple, même si votre Lambda ne souhaite que des événements API Gateway, vous extrairez toujours une dépendance sur la bibliothèque S3 car la bibliothèque d'événements gère également les événements S3. Ainsi, votre package de déploiement Lambda sera beaucoup plus volumineux que si vous ne le récupérez pas.

Comme alternative à la bibliothèque d'événements, vous pouvez utiliser quelque chose comme JsonPath pour extraire ce que vous voulez de l'événement. Votre Lambda serait quelque chose comme:

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

Qui lit le accountId à partir de l'événement API Gateway.

Il ne fait aucun doute que cette méthode demande un peu plus de travail, mais si vous ne retirez que quelques éléments de l'événement, cela peut être une solution plus légère.

MODIFIER

Il semble que vous ayez un problème de compilation / IDE. Ainsi, la plus petite quantité de code que je puisse afficher est d'abord un pom.xml fonctionnel :

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

Et un gestionnaire Lambda:

XXX

Pouvez-vous commencer avec un nouvel environnement et essayer ceci?


3 commentaires

Merci pour la bonne explication. Cependant, mon problème est plus étrange: les dépendances sont dans mon dépôt local, - elles ont été récupérées avec succès. Le package "com.amazonaws.services.lambda" et ses sous-packages sont là, dans les fichiers jar - aws-lambda-java - *. Jar (core, events). Malgré cela, la construction de Maven échoue: "impossible de trouver le symbole" (la classe APIGatewayProxyResponseEven dans le package com.amazonaws.services.lambda.runtime.events). Qu'est-ce qui pourrait mal tourner ici?


@ user3791111 - C'est parce que c'est APIGatewayProxyResponseEvent - vous avez manqué le t final dans le nom de la classe


Correction du nom. Cependant, lorsque j'essaye d'importer quoi que ce soit au-delà de "com.amazonaws.services.lambda", cela échoue. Dans l'EDI, je tape: "import com.amazonaws.services.", Et le "lambda" n'est pas là, comme il n'y a pas de bibliothèque avec ce package (le jar est là, les classes sont là, - Maven et IDE s'en moque).



1
votes

Les dépendances suivantes ont fonctionné pour moi

<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 commentaires