Fonctions Lambda événementielles
Introduction
Au cours du chapitre précédent, nous avons examiné en détail le développement de fonctions Lambda qui exposent des API REST. Ces fonctions sont synchrones, comme on a pu le voir. Mais une des caractéristiques essentielles des fonctions Lambda est leur caractère événementiel, c’est-à-dire leur capacité à se déclencher sur réception d’événements, de manière asynchrone, sans qu’un appel explicite soit nécessaire. Dans ce chapitre, nous allons donc étendre le scénario implémenté précédemment, afin de le compléter avec une nouvelle fonction Lambda événementielle, qui sera déclenchée par l’arrivée dans un compartiment S3 d’un fichier contenant des ordres de virement bancaire.
Pour mémoire, notre scénario général est reproduit dans la figure ci-dessous :
Le scénario général
Et voici le scénario qui sera implémenté à la fin de ce chapitre.
Le scénario courant
Voici les étapes de notre scénario :
-
Un fichier XML contenant des ordres de virement bancaire sera transféré dans un compartiment S3 par un script AWS CLI.
-
Ceci provoquera le déclenchement d’une fonction Lambda, définie de manière à...
Le projet Java
Créez un nouveau répertoire destiné à contenir le projet associé au présent chapitre et positionnez-vous dedans.
Clonez le repository GIT ainsi :
$ git clone https://github.com/nicolasduminil/aws-lambda.git
...
$ cd chapter5
Ouvrez votre IDE si ce n’est pas déjà fait. Allez à File - New - Project from existing sources et sélectionnez le sous-répertoire nommé chapter5 dans lequel vous aviez cloné le projet. Cliquez sur OK.
Dans le nouvel écran Import Project qui s’affiche, cochez l’option Import project from external model et, dans la liste déroulante en dessous, sélectionnez Maven. Cliquez sur Finish.
Vous venez d’importer dans votre IDE le projet Java associé à ce chapitre. Il s’agit bien évidemment d’un projet Maven, comme tous les autres.
1. Le fichier pom.xml
Ouvrez maintenant le fichier pom.xml du projet :
<?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>fr.simplex-software.aws.lambda</groupId>
<artifactId>chapter5</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Money Transfer :: The S3 upload module</name>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-bom</artifactId> ...
Déploiement et exécution
Le déploiement du projet est fait, comme d’habitude, avec le scriptdeploy.sh, que voici :
#!/bin/bash
RANDOM=$$
BUCKET_NAME=bucketname-$RANDOM
STAGE_NAME=dev
AWS_REGION=$(aws configure list | grep region | awk '{print $2}')
aws s3 mb s3://$BUCKET_NAME
echo $BUCKET_NAME > bucket-name.txt
sam deploy --s3-bucket $BUCKET_NAME --stack-name chapter5-stack
--capabilities
CAPABILITY_IAM --parameter-overrides BucketName=
$AWS_REGION-$STAGE_NAME-$BUCKET_NAME
aws cloudformation wait stack-create-complete --stack-name
chapter5-stack
C’est presque le même script utilisé précédemment qui crée un compartiment S3, pour y stocker le JAR à déployer et qui utilise la commande sam deploy pour effectuer le déploiement proprement dit. À noter l’argument -parameter-overrides qui définit le nom d’un deuxième compartiment S3, celui qui déclenchera l’exécution de la fonction lorsqu’un fichier y sera déposé. Ce nom combine la région courante, le nom de l’étape de déploiement (par exemple dev, test, prod, etc.) ainsi que le nom généré aléatoirement.
Exécuter ce script produira le résultat suivant :
nicolas@BEL20:~/AWSLambda/projects/aws-lambda/chapter5$ ./deploy.sh
make_bucket: bucketname-11382
Deploying with following values
===============================
Stack name : chapter5-stack
Region : None
Confirm changeset : False
Deployment...