Qu'est-ce qu' AWS Lambda ?
AWS Lambda est un des nouveaux services AWS annoncés durant le RE:invent 2014, la grande messe annuelle d'Amazon organisée chaque année à Las Vegas. Encore en version beta, AWS Lambda est un service de calcul qui exécute votre code en réponse à des événements et gère automatiquement les ressources de calcul pour vous, facilitant ainsi le développement d'applications capables de réagir rapidement aux nouvelles informations. Et ce service risque de changer beaucoup de choses dans le monde du Cloud. Voyons pourquoi.
But
Comme d'habitude, j'aime travailler à partir d'exemples concrets. Ici, notre but sera le suivant : faire en sorte que lorsqu'une image est poussée dans un bucket S3, une vignette soit créée et palcée dans un second bucket.
Avant :
Avant, pour traiter ce genre de problèmes, nous avions le choix :
Méthode lourde
Sur une instance dédiée, un cron se déclenche toutes les minutes, va lister le contenu du bucket S3 si une nouvelle image est présente, la télécharge, fait le traitement de redimensionnement, puis la pousse dans le second bucket.
Méthode "Best practice"
La méthode propre est typiquement basée sur Amazon SQS. Lors de l'upload de l'image, un message est envoyé dans une file SQS. Sur une instance dédiée, on lit en permanance cette file. Dès qu'un nouveau message arrive, alors on lance le traitement de redimensionnement et d'upload.
Maintenant :
... suspense... Maintenant, on utilise... Lambda ! Bravo!
Concrètement, Lambda s'appelle Lambda à cause des fonctions lambda. Ici une fonctione lambda est une fonction javascript qui va être exécutée en réponse à un évenement. Dans notre exemple, l'événement "Une nouvelle image est arrivée dans le bucket S3".
Vous remarquerez que je ne parle plus d'instance dédiée... Et oui ! C'est là que se trouve la révolution Lambda. Il n'est plus nécessaire d'avoir une instance EC2 dédiée au traitement. AWS s'en charge pour nous. Notre fonction lambda est exécutée dans le cloud. Si la fonction ne prend que 300ms à s'éxecuter, on ne payera que 300ms.
Étape 1 - Hello World
Il faut bien passer par là. Nous allons faire un simple Hello World avec Lambda. Pour commencer, cette fonction sera déclenchée à la main, par nous, via la ligne de commande.
Création de la fonction
On commence par écrire une fonction en Javascript très compliquée qui affichera Bonjour Prénom Nom !
exports.handler = function (event, context)
{
var nom = event.nom ;
var prenom = event.prenom ;
context.done (null, "Bonjour "+ prenom + " " + nom +" !") ;
}
Rien de bien compliqué. La fonction exécutée en réponse à un évenement se trouve dans handler
.
La sortie de la fonction est enregistrée dans CloudWatch logs.
Autorisations IAM
Comme notre fonction va écrire dans CloudWatch logs, il faut qu'elle ait les bons droits
cat > /tmp/iam << EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {"Service":"lambda.amazonaws.com"},
"Action": "sts:AssumeRole"
}
]
}
EOF
aws iam create-role \
--role-name lambda-exec \
--assume-role-policy-document file:///tmp/iam
Notez bien ici l'ARN du rôle que l'on vient de créer. On en aura besoin par la suite. Dans notre cas, on obtient :
arn:aws:iam::397960517128:role/lambda-exec
.
cat > /tmp/iam << EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:*"
],
"Effect": "Allow",
"Resource": "arn:aws:logs:*:*:*"
}
]
}
EOF
aws iam put-role-policy \
--role-name lambda-exec \
--policy-name acces-a-cloudwatch \
--policy-document file:///tmp/iam
Envoi de la fonction Lambda
Il faut maintenant uploader notre fonction Lambda. Mais avant ça, il faut packager notre code dans un fichier ZIP. Ceci permet en fait d'envoyer des applications Node.js complètes, avec toutes les librairies nécessaires. Nous c'est simple, nous n'avons qu'un fichier.
zip hello.zip hello.js
aws lambda upload-function \
--region eu-west-1 \
--function-name hello \
--function-zip hello.zip \
--role arn:aws:iam::397960517128:role/lambda-exec \
--mode event \
--handler hello.handler \
--runtime nodejs \
Et voilà, notre fontion lambda est envoyée. Il ne reste plus qu'a l'utiliser.
Appel de la fonction lambda
Nous allons appeler la fonction Lambda via la ligne de commande.
On ommence par écrire un fichier avec nos paramètres (mon prénom et mon nom) au format JSON.
cat > /tmp/input << EOF
{
"prenom": "Alexis",
"nom": "GÜNST HORN"
}
EOF
Puis, on appelle notre fonction lambda, avec les paramètres définis plus haut.
aws lambda invoke-async \
--function-name hello \
--invoke-args /tmp/input
Comme son nom l'indique, invoke-async
fait un appel asynchrone à notre fonctione lambda. On n'a donc ici comme
retour, si tout s'est bien passé, qu'un code :
{
"Status": 202
}
Pour lire la sortie de notre fonction, il va falloir aller fouiller dans CloudWatch logs.
On commence par récuperer le nom du stream
aws logs describe-log-streams \
--log-group-name /aws/lambda/hello \
--query 'logStreams[*].logStreamName' \
--output text'
Puis on va lire le stream
aws logs get-log-events \
--log-group-name /aws/lambda/hello \
--log-stream-name 170ab6bfaa344bb5984cff1330bcccd8 \
--query 'events[*].message'
Et on voit bien ceci :
START RequestId: af3(...)b1b
2015-03-02T10:05:42.469Z af36(...)b1b Message: "Bonjour Alexis GÜNST HORN !
END RequestId: af36(...)b1b
REPORT RequestId: af36(...)b1b Duration: 7.60 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 9 MB
Et voilà, on a bien notre message !
La fonction a bien été appelée, et on obtient en prime quelques informations :
- la fonction a mis 7,60 ms a s'éxecuter (mais AWS nous facture 100ms)
- la fonction a eu besoin de 9 Mo de RAM pour fonctionner
Lire l'Étape 2 - redimensionnement d'images
Alexis GÜNST
Encore un peu de temps ? Lisez nos autres articles :
- On a testé Amazon Elastic File System (EFS).
- Container as a Service avec Amazon EC2 Container Service (ECS).
Vous avez des projets sur AWS ? N'hésitez pas à visiter notre site internet.
Vous avez des questions ? Rejoignez la discussion sur le groupe LinkedIn des Utilisateurs Francophones d'Amazon Web Services (AWS).
Découvrez les derniers articles d'alter way
- Big Data & AI Paris 2024 : L'IA au cœur de toutes les transformations.
- Un retour vers l'open-source ? Vos outils DevOps préférés et leurs equivalents open-source.
- Prowler : L'outil de sécurité multi-cloud indispensable pour renforcer votre infrastructure
- Kubernetes : plateforme "star" de l'IT et levier d'innovation des entreprises
- AI_dev2024
- : DirectPV : Avoir du stockage bloc distribué facilement dans kubernetes