Article original : How to go serverless with Rust and API Gateway

Par Michael Habib

Avant l'AWS re:Invent de cette année, il n'existait aucun moyen pris en charge pour écrire des fonctions AWS Lambda avec Rust. Je rencontre souvent l'utilisation du runtime Go comme wrapper pour le code Rust sous-jacent. Lors de re:Invent, AWS a annoncé que ses fonctions lambda pourront désormais prendre en charge n'importe quel langage. Les utilisateurs pourront en profiter en utilisant la nouvelle API runtime. Parallèlement à cette annonce, AWS a également open sourcé un runtime Rust et publié un guide rapide ici.

L'objectif de cet article est de fournir suffisamment d'informations pour démarrer avec API Gateway et Rust. Nous allons créer une simple fonction AWS Lambda qui servira une seule ressource API Gateway. Un exemple plus intermédiaire utilisant DynamoDB sera publié sur YouTube en mars. Si vous êtes intéressé à être notifié lorsque cela sera publié, suivez-moi sur Twitter. Bien que toujours en cours, le code utilisé dans cette vidéo se trouve sur la branche intermediate du dépôt.

Prérequis

  1. Docker
  2. Git
  3. Compte AWS
  4. AWS CLI (optionnel)
  5. Rust (optionnel)
  6. Terraform (optionnel)

Clonez et forkez le dépôt depuis ici. Les instructions de configuration AWS peuvent être trouvées ici.

Gestion des requêtes

Pour commencer, exécutez git checkout scratch et modifiez le Cargo.toml dans le dossier users.

La section [[bin]] en bas du fichier indique à cargo de générer un exécutable avec ce nom. Cela est nécessaire car les packages de déploiement AWS Lambda attendent un fichier bootstrap. Concentrons-nous maintenant sur le code réel qui gérera les requêtes entrantes de l'API Gateway. Modifiez users/src/main.rs pour qu'il corresponde au fichier ci-dessous.

Nous commençons par déclarer une structure User qui sera utilisée pour nos réponses. Nous définissons ensuite un routeur qui correspond à la méthode de requête. Les trois fonctions responsables de la création des réponses sont not_allowed, add_user et get_users. Chaque fonction construit une réponse, gère une éventuelle erreur et envoie enfin la réponse.

Le crate lambda_http nous permet commodément de transformer des valeurs JSON de serveur en une réponse avec into_response(). Cela est fait dans add_user et get_users lorsque nous passons d'un utilisateur à une valeur JSON puis enfin à une réponse.

Gardez à l'esprit que aucune des requêtes POST n'ajoutera réellement d'utilisateurs à une base de données. Tout ce que fait la méthode add_user ici est de désérialiser le corps et de le renvoyer.

Opérations — Build & Deploy

Bundler votre code et ses dépendances pour lambda peut parfois être délicat. Au moment de la rédaction de cet article, SAM ne dispose pas d'une commande de build pour bundler les projets cargo. Au lieu de SAM, nous allons utiliser Docker et Terraform pour créer ces packages de déploiement et plus encore. Ajoutez un Dockerfile au dossier users avec le contenu suivant.

Une image de build lambci est utilisée comme image de base car elles fournissent un processus de build assez transparent. Le Dockerfile ci-dessus peut être divisé en cinq parties principales :

  1. Installation de l'édition nightly de Rust
  2. Ajout des fichiers du projet
  3. Compilation du projet
  4. Compression de l'exécutable
  5. Création du plan Terraform

Nous avons également besoin d'un Dockerfile qui sera spécifiquement utilisé pour déployer nos ressources API Gateway. Créez un fichier appelé Dockerfile.api avec le contenu suivant.

Créons maintenant un script de build qui pilotera le processus de création et d'application de nos plans Terraform. Un plan Terraform est simplement une proposition des ressources qu'il souhaite créer. Ajoutez le contenu suivant à un build.sh et deploy.sh.

Les scripts de build et de déploiement utilisent Docker et Terraform pour créer ou mettre à jour nos ressources AWS. En résumé, le plan Terraform pour provisionner les ressources est créé lorsque build.sh est exécuté et ce plan est ensuite appliqué lors de l'exécution de deploy.sh. Terraform est hors du scope de cet article, mais vous pouvez consulter tout le code dans users/terraform. Pour build et déployer nos ressources lambda, exécutez ./build.sh && ./deploy.sh.

Si tout s'est bien passé, vous devriez voir la fin de votre sortie comme celle ci-dessous. Gardez à l'esprit que les Dockerfiles supposent que les identifiants AWS_* sont définis comme variables d'environnement.

Image ./build.sh && ./deploy.sh

Pour déployer nos ressources API Gateway, exécutez ./build.sh --api && ./deploy.sh --api. Comme la commande ci-dessus, si tout s'est bien passé, vous devriez voir la fin de votre sortie comme celle ci-dessous.

Image ./build.sh --api && ./deploy.sh --api

Assurez-vous de noter le base_url qui est affiché après le déploiement. Pour tester l'API, nous devons envoyer une requête GET et POST à <base_url>/users. Vous pouvez utiliser un programme comme Postman ou la ligne de commande comme dans la capture d'écran ci-dessous. Les deux commandes montrées dans l'image supposent que jq est installé.

Image

Pour détruire toutes les ressources créées dans cet article, exécutez ./destroy.sh && ./destroy.sh --state.

J'espère que vous avez trouvé cet article utile pour démarrer avec API Gateway et Rust. N'hésitez pas à commenter, poser des questions ou suggérer un sujet que je pourrais aborder ensuite.

_P.S. Suivez-moi sur Twitter_