Migrer des fonctions Cloud vers des environnements d'exécution Node.js plus récents

Ce document décrit les différences existant entre les versions de l'environnement d'exécution Node.js, afin de vous aider à migrer votre code Cloud Functions.

Migrer vers un environnement d'exécution plus récent

Pour migrer vers un environnement d'exécution plus récent, procédez comme suit :

  1. Prenez connaissance dans ce document des différences induites par votre environnement d'exécution cible, puis apportez les modifications nécessaires à votre code. Veillez plus particulièrement à tenir compte des modifications sur les variables d'environnement introduites dans l'environnement d'exécution Node.js 10.
  2. Déployez votre fonction en spécifiant votre environnement d'exécution Node.js cible :

    gcloud functions deploy FUNCTION_NAME --runtime NODE_RUNTIME...

Différences dans l'environnement d'exécution Node.js 14

Node.js 14 introduit de nouvelles fonctionnalités et de nouveaux concepts. Points clés :

  • Chaînage facultatif. Le chaînage facultatif se présente comme suit : {"hello": null}?.hello?.neat. Il permet d'accéder en toute sécurité à des clés profondes sur des objets qui n'existent peut-être pas.
  • Coalescence nulle : Cette approche ?? est plus sûre que l'utilisation de || pour l'attribution (qui n'évalue que false pour null ou undefined).

Pour en savoir plus sur les fonctionnalités de Node.js 14, cliquez ici.

Différences dans l'environnement d'exécution Node.js 12

Node.js 12 utilise npm ci, qui exécute toujours le script prepare dans package.json.

Les principales différences entre l'utilisation de npm install et de npm ci sont les suivantes :

  • Le projet doit disposer d'un fichier package-lock.json ou npm-shrinkwrap.json existant.
  • Si les dépendances du verrou de package ne correspondent pas à celles de package.json, npm ci quitte sur un message d'erreur au lieu de mettre à jour le verrouillage du package.
  • Si un élément node_modules est déjà présent, il sera automatiquement supprimé avant que npm ci ne commence son installation.

Pour passer de Node.js 10 à Node.js 12, déplacez les dépendances utilisées dans le fichier prepare de devDependencies vers dependencies.

Pour Node.js 12 et versions ultérieures, les fonctions dont les limites de mémoire peuvent être définies au-delà de 2 Gio exigent que les utilisateurs configurent NODE_OPTIONS avec l'attribut max_old_space_space. Exemple :

gcloud functions deploy envVarMemory \
--runtime nodejs14 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http

Différences dans l'environnement d'exécution Node.js 10

L'environnement d'exécution Node.js 10 introduit des modifications pouvant vous obliger à modifier le code source de votre fonction afin d'utiliser les derniers environnements d'exécution.

Pour la majorité des applications, la mise à niveau de Node 8 vers Node 10 n'entraîne aucune modification du code (la différence majeure concerne les variables d'environnement de GCF).

Node 10 introduit plusieurs nouvelles fonctionnalités intéressantes, telles que des itérateurs asynchrones et une API de fichiers basée sur des promesses, ainsi qu'une amélioration des performances et des correctifs de sécurité.

Logging

Si vous n'avez pas utilisé JSON.stringify lors de la journalisation d'objets et/ou de collections dans Node.js 8, vous constaterez peut-être une augmentation du volume des journaux lors de la mise à niveau vers Node.js 10. Cela peut entraîner des coûts supplémentaires. Nous vous recommandons d'utiliser JSON.stringify pour regrouper les instructions de journalisation, comme indiqué dans la section Écrire, afficher des journaux et y répondre.

Modifications des variables d'environnement

L'environnement d'exécution Node.js 10 a apporté des modifications aux variables d'environnement prédéfinies par l'environnement d'exécution. Consultez la section Variables d'environnement définies automatiquement pour connaître les différences entre les variables d'environnement définies par Node.js 10 et celles des précédents environnements d'exécution.

Pour exécuter vos anciennes fonctions Node.js dans Node.js 10, vous devrez peut-être modifier les variables d'environnement prédéfinies que vous utilisez. Modifiez le code de sorte qu'il utilise les variables de remplacement lorsque c'est possible, ou définissez-les vous-même lorsque vous déployez votre fonction. Il est déconseillé de dépendre de variables d'environnement que vous n'avez pas définies explicitement.

Les variables d'environnement suivantes ne sont plus automatiquement définies dans l'environnement d'exécution Node.js 10 :

Variable d'environnement Migration
CODE_LOCATION Définissez-la lorsque vous déployez la fonction. Votre code se situe à l'emplacement suivant : /srv.
ENTRY_POINT Utilisez la variable d'environnement FUNCTION_TARGET à la place.
GOOGLE_CLOUD_PROJECT Définissez-la lorsque vous déployez la fonction.
GCP_PROJECT Définissez-la lorsque vous déployez la fonction.
GCLOUD_PROJECT Définissez-la lorsque vous déployez la fonction.
GOOGLE_CLOUD_REGION Définissez-la lorsque vous déployez la fonction.
FUNCTION_REGION Définissez-la lorsque vous déployez la fonction.
FUNCTION_NAME Utilisez la variable d'environnement K_SERVICE à la place.
FUNCTION_IDENTITY Définissez-la lorsque vous déployez la fonction.
FUNCTION_MEMORY_MB Définissez-la lorsque vous déployez la fonction.
FUNCTION_TIMEOUT_SEC Définissez-la lorsque vous déployez la fonction.
FUNCTION_TRIGGER_TYPE Utilisez plutôt la variable d'environnement FUNCTION_SIGNATURE_TYPE. Consultez la page Utiliser des variables d'environnement pour en savoir plus.
OLDPWD Cette variable n'est plus disponible.
SHLVL Cette variable n'est plus disponible.

Différences dans l'environnement d'exécution Node.js 8

Le processus de signature des fonctions d'arrière-plan a été modifié entre les environnements d'exécution Node.js 6 et Node.js 8, et cette modification persiste dans Node.js 10.

Prenons un exemple de fonction d'arrière-plan Node.js 6 :

exports.nodejs6BackgroundFunction = (event, callback) => {
  let data = event.data;
  let context = event.context;
  // ... the rest of your function
};

Notez que l'argument event contient les propriétés data et context. Dans Node.js 10, les propriétés data et context sont extraites de l'objet event et incluses dans la signature de la fonction :

exports.nodejs8AndAboveBackgroundFunction = (data, context, callback) => {
  // ... the rest of your function is unchanged
};

Cette modification simplifie les références aux objets data et context, précédemment contenus dans l'argument event. Pour plus d'informations, consultez la section Paramètres des fonctions d'arrière-plan.

Si vous utilisez le processus de signature des fonctions d'arrière-plan de Node.js 6, apportez les modifications suivantes pour exécuter votre fonction dans un environnement d'exécution Node.js plus récent :

  1. Remplacez la signature de la fonction (event, callback) par (data, context, callback).

  2. Remplacez les références à event.data et à event.context par data et context, respectivement.

Abandons : Node.js 6 et Node.js 8

Les environnements d'exécution Node.js 6 et Node.js 8 sont désormais obsolètes. Pour vous assurer que vos fonctions s'exécutent sur une version compatible de Node.js, migrez-les vers Node.js 10 ou version ultérieure.

À compter du 5 août 2020, les déploiements de fonctions utilisant Node.js 6 seront bloqués. Les fonctions Cloud Functions qui continueront à utiliser Node.js 6 après cette date pourront être désactivées.