A la découverte d'AWS Lambda, Partie 1 - Mercredi 25 mars 2015

Amazon Lambda

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!


AWS Lambda

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.


AWS Lambda

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 :

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).

Banniere

La discussion continue !

Nous attendons vos questions, remarques & mots doux sur notre Twitter :