Cet article a été rédigé par l’ingénieur développeur logiciel senior d’AWS, Tim McNamara, et publié avec autorisation.
Beaucoup de gens ont enquêté sur Rust récemment. Cela soulève une question importante : « Est-ce que Rust est vraiment utile pour moi ? » Bien que nous ne puissions pas vous dire si cela convient à votre cas d’utilisation, nous pouvons partager quelques exemples où cela nous a été utile.
Ces projets servent d’échantillon représentatif de ce que nous avons créé jusqu’à présent et donnent un aperçu de notre utilisation de Rust. Nous espérons qu’en inspectant le code, vous pourrez apprendre de notre travail et vous inspirer pour expérimenter Rust sur votre lieu de travail.
Gardez à l’esprit que cette liste n’est pas exhaustive : il existe d’autres projets open source à explorer, en particulier au sein des organisations AWS et AWS Labs dans GitHub. Nous espérons que vous trouverez ces projets informatifs et utiles !
Programmation des systèmes
Rust a pris de l’importance en tant que langage de programmation système, offrant des avantages de sécurité de la mémoire qui ne sont pas disponibles dans ses langages homologues, tels que C et C++. C’est dans ce domaine, en particulier la virtualisation, qu’AWS a utilisé Rust pour la première fois pour des projets à grande échelle.
Fusée en bouteille
Bottlerocket est un système d’exploitation conçu pour héberger des conteneurs. Il inclut uniquement les logiciels essentiels requis pour exécuter des conteneurs et garantit que le logiciel sous-jacent est toujours sécurisé. Par exemple, il est impossible de se connecter en SSH à un conteneur s’exécutant dans Bottlerocket : les conteneurs en cours d’exécution n’ont même pas de shell, et encore moins sshd.
Pétard
Firecracker alimente AWS Lambda et AWS Fargate. Il exécute des charges de travail dans des machines virtuelles légères appelées micro VM, qui combinent vitesse et flexibilité (auxquelles nous sommes habitués avec les conteneurs) avec sécurité et isolation (auxquelles nous sommes habitués avec les machines virtuelles).
Services Web
Au fur et à mesure que Rust devenait de plus en plus courant au sein d’AWS, des projets ont commencé à apparaître qui étaient plus larges que le domaine de programmation système initial. C’est maintenant un langage qui dispose d’une solide base d’utilisateurs développant des services Web.
Exécution de Rust pour AWS Lambda
Le sans serveur est de plus en plus courant dans l’industrie technologique, et Rust sans serveur est un excellent moyen d’utiliser ce nouveau paradigme. Le runtime Rust pour AWS Lambda fournit un runtime personnalisé pour AWS Lambda qui est ergonomique à utiliser et offre une amélioration des performances par rapport aux autres runtimes.
forge-rs
Maintenir les serveurs et les clients à jour à mesure que les API changent est une tâche difficile. Le langage de définition d’interface Smithy (IDL) simplifie cela en déléguant la comptabilité à un logiciel. L’implémentation de Rust s’appelle smithy-rs. Il peut générer des clients et des serveurs dans Rust tout en permettant à la logique métier d’être implémentée dans les langages préférés des développeurs tels que Python. smithy-rs est un projet intéressant en interne, car c’est un exemple d’utilisation de Kotlin et Rust dans la même base de code. smithy-rs est utilisé pour générer les caisses open source qui appartiennent au kit AWS SDK pour Rust.
Kit SDK AWS pour Rust
Le kit AWS SDK pour Rust permet d’accéder par programme aux services AWS à partir des programmes Rust. L’ensemble du SDK comprend des dizaines de caisses, chacune correspondant à un service AWS, qui sont toutes disponibles pour inspection dans le référentiel GitHub du SDK.
Essai
Bien que le système de type de Rust offre de nombreuses garanties, il n’empêche pas tous les bugs. Nous avons créé quelques outils pour étendre la robustesse des logiciels écrits dans l’entreprise et au-delà.
Vérificateur de rouille Kani
Kani Rust Verifier fait partie d’une famille d’outils appelés « vérificateurs de modèles » pour permettre le raisonnement mathématique sur les logiciels. Kani fournit une vérification formelle légère dans les projets Rust. En fait, la sécurité de Firecracker est formellement vérifiée auprès de Kani. Vous pouvez utiliser Kani dans vos propres programmes pour augmenter leur robustesse aux erreurs que les tests unitaires et d’intégration sont susceptibles de manquer.
Navette
Shuttle est un outil de test de code concurrent qui fonctionne en contrôlant la planification de chaque thread et en programmant ces threads de manière aléatoire. En maîtrisant l’ordonnancement, Shuttle nous permet de reproduire de manière déterministe les tests défaillants.
Utilitaires CLI
Les développeurs d’Amazon ont également trouvé que l’écriture de CLI dans Rust en valait la peine. Le système de type évite de nombreuses erreurs d’exécution délicates pendant le développement. Les CLI écrites en Rust sont faciles à distribuer, s’exécutent très rapidement et utilisent très peu de mémoire.
Amazonion
Amazon Ion est un format de données fourni avec une CLI écrite en Rust. Qu’est-ce qu’un format de données ? Vous avez probablement déjà vu JSON — c’est un exemple de format de données. JSON est basé sur du texte, ce qui est lisible mais peut occuper un espace inutile. Il peut également être difficile de savoir, à la réception d’un fichier, s’il contient les champs et les types de données corrects. Contrairement à JSON, Ion fournit à la fois des formes textuelles et binaires de son modèle de données, pour faciliter l’inspection des données à la volée. La CLI vous permet également de valider un fichier par rapport à un schéma.
Garde AWS CloudFormation
AWS CloudFormation Guard valide les spécifications CloudFormation. Cela peut vous permettre d’éviter les erreurs entrant en production pour les personnes qui suivent une infrastructure en tant que méthodologie de code en l’incluant comme crochet de pré-commit.
Interface de ligne de commande Nitro Enclaves (Nitro CLI)
Nitro CLI est un outil de gestion du cycle de vie des Nitro Enclaves. Les enclaves permettent aux clients AWS de protéger leurs données les plus sensibles en les hébergeant dans un environnement isolé, renforcé et fortement contraint.
Autres utilitaires
La rouille s’est également avérée utile dans des endroits moins importants. coldsnap facilite le chargement et le téléchargement d’instantanés EBS à partir de la ligne de commande, tandis que dynein fournit une CLI pour Amazon DynamoDB. Flowgger peut ingérer, transformer et exporter des journaux à partir de plusieurs sources. Pour fournir des horodatages limités par les erreurs, ClockBound fonctionne avec le serveur chrony NTP pour permettre de classer des événements disparates, indépendamment des emplacements géographiques de la source.
Bibliothèques et outils de développement
Au fur et à mesure que l’expérience s’acquiert, il est courant que les gens partagent ce qu’ils ont appris. En inspectant les organisations AWS et AWS Labs Github, il est clair que le nombre de bibliothèques écrites en Rust augmente.
s2n-quic
Les applications cryptographiques étaient un autre domaine où les premières expériences ont été menées avec Rust. L’un des résultats en aval de ce travail est notre implémentation open source de l’échange de clés post-quantique pour TLS, qui se trouve dans l’implémentation s2n-quic QUIC.
cargo-check-external-types
cargo-check-external-types
est un plugin Cargo pour les auteurs de la bibliothèque Rust. Cela permet de s’assurer que l’API de la bibliothèque reste cohérente, même si une dépendance change. Essentiellement, il vérifie quels types d’autres bibliothèques peuvent faire partie de leur API publique, de sorte qu’une modification d’une dépendance ne casse pas leur bibliothèque.
Primitives de couleur DCV
Pour convertir entre les modèles de couleurs dans différentes applications, une bibliothèque commune a beaucoup de sens. La bibliothèque DCV Color Primitives peut convertir entre plusieurs formats de pixels, tout en prenant en charge la facilité de compilation vers plusieurs architectures cibles, notamment ARM (qui comprend la famille de processeurs Graviton) et WebAssembly.