Comment démarrer avec les fonctions sans serveur de DigitalOcean
Functions est l’un des derniers ajouts à la plate-forme cloud DigitalOcean. Il fournit une méthode de premier ordre pour développer des fonctions sans serveur sans quitter DigitalOcean. Votre code est exécuté à la demande lorsqu’il est appelé, ce qui élimine le provisionnement et la maintenance manuels du serveur.
Dans cet article, nous expliquerons ce que DigitalOcean Functions prend en charge et présenterons une démonstration de la création de votre propre fonction simple. Functions a un niveau gratuit qui fournit 25 Gio-heures par mois, avec un Gio-seconde calculé comme la consommation de mémoire multipliée par le temps d’exécution de chaque appel de fonction.
Sommaire
Fonctionnalités prises en charge
Lancé en mai 2022, Functions offre aux clients de DigitalOcean une option intégrée pour exécuter des charges de travail sans serveur. Chaque fonction obtient son propre point de terminaison d’API qui exécute le code que vous avez créé. Vous n’avez pas besoin de configurer vos propres serveurs ou de conteneuriser le projet avant le déploiement. Les fonctions en direct sont hébergées par le backend de la plate-forme d’applications de DigitalOcean.
Les fonctions peuvent s’intégrer aux bases de données gérées de DigitalOcean pour faciliter le stockage persistant des données. Ils sont également livrés avec une CLI complète qui vous permet de déployer et de tester votre code dans votre terminal.
La version initiale de la plate-forme prend en charge cinq environnements de programmation différents :
- Aller 1.17
- Node.js 14
- Node.js 14 (compatible avec les fonctions AWS Lambda)
- PHP 8
- Python 3.9
Vous devrez être à l’aise pour écrire votre code dans l’un de ces langages pour le déployer en tant que fonction. D’autres runtimes pourraient être pris en charge à l’avenir.
Mise en place
Il est possible de lancer de nouvelles fonctions à l’aide du panneau de contrôle Web de DigitalOcean ou de Doctl, sa CLI orientée développeur. Nous nous concentrons sur l’approche Doctl basée sur les terminaux pour les besoins de cet article. Cela expose toutes les fonctionnalités de Functions et constitue la voie prévue pour tous les cas d’utilisation, sauf les plus simples. Assurez-vous que la dernière version de Doctl est installée et authentifiée sur votre compte DigitalOcean avant de continuer.
Vous devrez effectuer d’autres étapes de configuration si c’est la première fois que vous utilisez les fonctions DigitalOcean. Terminez d’abord l’installation de Doctl’s serverless
extension. Cela ajoute un support complet pour le développement et le déploiement de fonctions.
$ doctl serverless install Downloading...Unpacking...Installing...Cleaning up... Done
Connectez ensuite les fonctionnalités sans serveur à votre compte DigitalOcean :
$ doctl serverless connect Connected to function namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a' on API host 'https://faas-lon1-917a94a7.doserverless.co'
Vous devriez maintenant être prêt à commencer à écrire des fonctions. Exécutez le serverless status
commande pour vérifier que tout fonctionne :
$ doctl serverless status Connected to function namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a' on API host 'https://faas-lon1-917a94a7.doserverless.co' Sandbox version is 3.1.1-1.2.1
La sortie ci-dessus confirme que la prise en charge des fonctions est installée et prête à être utilisée.
La serverless
la commande est un alias de sandbox
. Au moment de la rédaction, les deux mots clés ont des fonctionnalités identiques et sont utilisés de manière interchangeable dans la documentation de DigitalOcean. Nous standardisons sur serverless
pour ce guide.
Création d’une fonction
Utilisez la commande suivante pour créer un nouveau projet Functions :
$ doctl serverless init --language js demo-project A local sandbox area 'demo-project' was created for you. You may deploy it by running the command shown on the next line: doctl sandbox deploy demo-project
Cette commande crée une nouvelle fonction JavaScript dans demo-project
dans votre répertoire de travail. Inspectez le contenu de ce répertoire pour voir ce que Doctl a échafaudé pour vous :
$ tree demo-project demo-project ├── packages │ └── sample │ └── hello │ └── hello.js └── project.yml 3 directories, 2 files
La project.yml
est l’endroit où vous configurez votre projet de fonctions et les points de terminaison qu’il fournit.
targetNamespace: '' parameters: {} packages: - name: sample environment: {} parameters: {} annotations: {} actions: - name: hello binary: false main: '' runtime: 'nodejs:default' web: true parameters: {} environment: {} annotations: {} limits: {}
Le modèle de démarrage configure un package appelé sample
. Dans ce package, il y a une seule action (endpoint) nommée hello
qui est exécuté à l’aide du runtime Node. Le code source de cette action est stocké dans packages/sample/hello/hello.js
. Regardons ensuite ce fichier :
function main(args) { let name = args.name || 'stranger' let greeting = 'Hello ' + name + '!' console.log(greeting) return {"body": greeting} }
Ceci est du code JavaScript normal. La main()
La fonction sera invoquée chaque fois que votre fonction sera appelée. Il reçoit un objet contenant des arguments soumis en tant que données HTTP GET et POST dans la demande de l’utilisateur. Vous pouvez également configurer des arguments statiques, en utilisant le parameters
sur les actions, les packages et le projet de niveau supérieur dans votre project.yml
dossier.
Les fonctions doivent renvoyer un objet décrivant la réponse HTTP à émettre. La body
devient les données incluses dans la réponse.
Invoquer et déployer des fonctions
Ce projet est prêt à fonctionner. Utilisez cette commande pour déployer votre fonction :
$ doctl serverless deploy . Deploying '/home/james/@scratch/demo-project' to namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a' on host 'https://faas-lon1-917a94a7.doserverless.co' Deployment status recorded in '.nimbella' Deployed functions ('doctl sbx fn get <funcName> --url' for URL): - sample/hello
La serverless deploy
La commande prend un argument, le chemin d’accès au répertoire qui contient vos fonctions. Utilisation .
lorsque la racine de votre projet est déjà votre répertoire de travail.
Vous pouvez maintenant tester votre fonction à l’aide de la CLI :
$ doctl serverless functions invoke sample/hello -p name:howtogeek { "body": "Hello howtogeek!" }
La -p
paramètre définit un argument qui est transmis à votre code. Cet exemple montre comment la valeur de retour de votre fonction devient le corps de la réponse HTTP.
Essayez ensuite de faire une vraie requête API à votre fonction. Vous pouvez découvrir son URL avec la commande suivante :
$ URL=$(doctl serverless functions get sample/hello --url)
Utilisation curl
ou votre propre client HTTP préféré pour atteindre ce point de terminaison :
$ curl $URL?name=howtogeek Hello howtogeek!
La name
Le paramètre de chaîne de requête a été transmis avec succès à la fonction.
Modification de votre fonction
Jusqu’à présent, nous utilisons l’exemple de code de DigitalOcean sans aucune modification. Cela ne vous mènera pas loin dans votre voyage sans serveur ! Modifiez votre hello.js
fichier donc il ressemble à ceci:
function main(args) { return { body: { value: (args.value * 2), timestamp: Date.now() }, headers: { "Content-Type": "application/json" } }; }
Redéployez votre fonction :
$ doctl serverless deploy .
Cette fonction double naïvement le nombre donné par le value
paramètre de requête. Il inclut également un horodatage avec chaque corps de réponse. La headers
champ est utilisé dans l’objet de réponse pour appliquer un JSON correct Content-Type
.
Vous pouvez appeler cette fonction en utilisant Doctl ou curl
dans le même style que précédemment :
$ curl $URL?value=2 { "timestamp": 1654784122966, "value": 4 }
Redéployer manuellement votre fonction après chaque changement est fastidieux et chronophage. Exécutez le watch
pendant que vous travaillez pour déployer automatiquement les modifications après avoir modifié vos fichiers :
$ doctl serverless watch . Watching '.' [use Control-C to terminate]
Gardez la fenêtre du terminal ouverte pendant que vous développez votre fonction. Chaque nouveau déploiement enregistrera un message afin que vous sachiez quand vous pourrez tester vos modifications. Cela facilite une itération efficace au fur et à mesure que vous développez vos fonctions.
Vous pouvez également diffuser les journaux de vos fonctions. Ceci est inestimable lorsqu’une fonction se bloque ou ne se comporte pas comme prévu. Exécutez cette commande pour accéder aux journaux associés à votre fonction de démonstration :
$ doctl serverless activations logs --follow --function sample/hello
Une nouvelle ligne sera imprimée chaque fois que vous appelez votre fonction. Les journaux incluent également les messages que votre code émet vers la sortie standard et les flux d’erreurs de l’environnement.
Déploiement en production
La serverless deploy
La commande est actuellement conçue pour une utilisation en développement uniquement. Vous pouvez déployer en production en créant un référentiel Git pour votre projet Functions et en le lançant à l’aide de la plateforme d’applications de DigitalOcean.
Créez un nouveau projet sur GitHub ou GitLab et poussez votre code :
$ git init $ git remote add origin git@github.com:user/repo.git $ git add . $ git commit -m "initial commit" $ git push -u origin master
Ensuite, dirigez-vous vers votre panneau de contrôle DigitalOcean et cliquez sur le lien « Applications » dans la barre latérale gauche. Cliquez sur le bouton « Créer une application » qui apparaît. Sur l’écran suivant, suivez les invites pour vous connecter à votre compte GitHub et sélectionnez votre nouveau référentiel. Appuyez sur le bouton bleu « Suivant ».
DigitalOcean détectera automatiquement votre référentiel en tant que projet Functions si vous avez un project.yml
à sa racine. Cliquez sur le bouton « Passer à la révision » pour continuer.
L’écran suivant devrait confirmer que vous serez facturé avec le forfait Fonctions.
Appuyez sur « Créer des ressources » pour provisionner votre application et démarrer son premier déploiement. Les progrès seront affichés sur le tableau de bord.
Les points de terminaison de votre fonction seront accessibles publiquement une fois le déploiement terminé. Vous pouvez trouver la valeur par défaut de votre application ondigitalocean.app
domaine en faisant défiler la page Paramètres de l’application dans votre tableau de bord. Dans notre exemple, le domaine de l’application est sea-lion-app.7ougx.ondigitalocean.app
.
Les fonctions sont automatiquement exposées en tant qu’URI au format suivant :
<app>.ondigitalocean.app/<function-package>/<function-action>
Vous pouvez appeler l’exemple de fonction créé précédemment en effectuant la requête suivante :
$ curl https://sea-lion-app.7ougx.ondigitalocean.app/sample/hello?value=2 { "timestamp": 1654786505969, "value": 4 }
La fonction a été déployée avec succès ! Vous pouvez désormais utiliser l’onglet Domaines dans les paramètres de votre application pour associer un domaine personnalisé au lieu de celui par défaut.
Sommaire
DigitalOcean Functions est le nouveau concurrent dans le domaine des fonctions sans serveur de plus en plus encombré. La plate-forme vous permet de développer des fonctionnalités côté serveur sans gérer les machines virtuelles ni conteneuriser manuellement votre code.
Functions fournit une CLI complète pour créer et tester vos points de terminaison. Vous pouvez ensuite déployer vos fonctions sur la solution App Platform existante de DigitalOcean, soit en tant que projet autonome, soit dans le cadre d’une application plus large.
Une fois que vous avez une fonction de base opérationnelle, vous pouvez vous référer à la documentation de DigitalOcean pour commencer à configurer des comportements plus avancés. Vous pouvez configurer des variables d’environnement, plusieurs actions et des limites de ressources à l’aide des champs de votre project.yml
fichier, vous donnant un moyen rapide et facile de créer des points de terminaison à la demande relativement complexes.