L'environnement d'exécution Node.js est la pile logicielle chargée d'installer le code de votre service Web et ses dépendances, et d'exécuter votre service.
L'environnement d'exécution de Node.js pour App Engine dans l'environnement standard est déclaré dans le fichier app.yaml
:
runtime: nodejsVERSION
Où VERSION est le numéro de version MAJOR
de Node.js. Par exemple, pour utiliser la dernière version de Node.js, Node.js 20, spécifiez 20
.
Pour connaître les autres versions de Node.js compatibles, ainsi que la version d'Ubuntu correspondante pour votre version de Node.js, consultez le Calendrier de compatibilité des environnements d'exécution.
Version Node.js
L'environnement d'exécution Node.js utilise la dernière version stable de la version spécifiée dans votre fichier app.yaml
. App Engine se met automatiquement à jour en cas de nouvelle version de correctif ou de version mineure, mais il ne met pas automatiquement à jour la version majeure.
Par exemple, votre application peut être déployée sur Node.js 10.9.4 et faire ultérieurement l'objet d'une mise à jour automatique vers la version 10.10.0, mais elle ne sera pas automatiquement mise à jour vers Node.js 12.x.x.
Comme les versions mineures et correctives sont automatiquement mises à jour, la propriété engines.node
de votre fichier package.json
ne peut que spécifier la version majeure et être compatible avec la version de Node.js spécifiée dans le fichier app.yaml
.
Par exemple, pour 20 :
20.x.x
^20.0.0
~20
>=6
Si vous spécifiez une version incompatible de Node.js dans le fichier package.json
, le déploiement échouera avec un message d'erreur.
Dépendances
Pendant le déploiement, l'environnement d'exécution installe vos dépendances à l'aide de la commande npm install
. L'environnement d'exécution est également compatible avec les gestionnaires de packages Yarn (yarn.lock
) et Pnpm (pnpm-lock.yaml
).
Pour plus d'informations, consultez la page Spécifier des dépendances.
Étant donné que l'environnement d'exécution effectue une nouvelle installation, vous n'avez pas besoin de transférer le dossier node_modules
.
Pour assurer la compatibilité avec les packages Node.js nécessitant des extensions natives, l'environnement d'exécution inclut des packages système vous permettant d'utiliser des outils comme ImageMagick, FFmpeg et Chrome sans interface graphique. Consultez la liste complète des packages sur la page Packages système inclus. Pour demander un package, envoyez une demande dans l'outil de suivi des problèmes.
Script de compilation NPM
Par défaut, l'environnement d'exécution Node.js exécute npm run build
si un script build
est détecté dans le projet package.json
. Si vous avez besoin d'exercer un contrôle supplémentaire sur vos étapes de compilation avant de démarrer votre application, vous pouvez fournir une étape de compilation personnalisée en ajoutant un script gcp-build
à votre fichier package.json
.
Pour empêcher votre compilation d'exécuter le script npm run build
, vous devez effectuer l'une des opérations suivantes :
- Ajoutez un script
gcp-build
avec une valeur vide dans votre fichierpackage.json
:"gcp-build":""
. Pour en savoir plus sur la configuration depackage.json
, consultez la page Configurations des buildpacks Node.js. Ajoutez la variable d'environnement de compilation
GOOGLE_NODE_RUN_SCRIPTS
avec une valeur vide dans votre fichierapp.yaml
.build_env_variables: GOOGLE_NODE_RUN_SCRIPTS: ''
build_env_variables
du fichier app.yaml
.
Démarrage de l'application
Par défaut, l'environnement d'exécution démarre votre application en exécutant node server.js
.
Mais si vous spécifiez un script start
dans votre fichier package.json
, l'environnement d'exécution exécute le script de démarrage spécifié. Exemple :
"scripts": {
"start": "node app.js"
}
Pour que votre application reçoive des requêtes HTTP, votre script start
doit démarrer un serveur Web écoutant l'hôte 0.0.0.0
et le port spécifié par la variable d'environnement PORT
, accessible dans Node.js en tant que process.env.PORT
.
Pour des performances optimales, le script start
doit être léger et exclure les étapes de compilation, car il s'exécute chaque fois qu'une instance de votre application est créée.
Vous pouvez ignorer ce comportement en spécifiant un script dans le champ entrypoint
de app.yaml
. Au lieu d'exécuter node server.js
ou un script de démarrage, l'environnement d'exécution démarre votre application à l'aide de la commande spécifiée dans entrypoint
.
Variables d'environnement
Les variables d'environnement suivantes sont définies par l'environnement d'exécution :
Variable d'environnement | Description |
---|---|
GAE_APPLICATION
|
ID de votre application App Engine. Cet ID est précédé du préfixe "region code~", tel que "e~" pour les applications déployées en Europe. |
GAE_DEPLOYMENT_ID |
ID du déploiement actuel. |
GAE_ENV |
Environnement App Engine. Variable définie sur standard . |
GAE_INSTANCE |
ID de l'instance sur laquelle votre service est en cours d'exécution. |
GAE_MEMORY_MB |
Quantité de mémoire disponible pour le processus d'application, en Mo. |
GAE_RUNTIME |
Environnement d'exécution spécifié dans le fichier app.yaml . |
GAE_SERVICE |
Nom de service spécifié dans le fichier app.yaml . Si aucun nom de service n'est spécifié, il est défini par défaut sur default . |
GAE_VERSION |
Libellé de la version actuelle du service. |
GOOGLE_CLOUD_PROJECT |
ID du projet Google Cloud associé à votre application. |
PORT |
Port qui reçoit les requêtes HTTP. |
NODE_ENV (disponible uniquement dans l'environnement d'exécution Node.js) |
Variable définie sur production lorsque votre service est déployé. |
Vous pouvez définir des variables d'environnement supplémentaires dans le fichier app.yaml
, mais les valeurs ci-dessus ne peuvent pas être remplacées, sauf NODE_ENV
.
HTTPS et proxy de transfert
App Engine met fin aux connexions HTTPS au niveau de l'équilibreur de charge et transfère les requêtes à votre application. Certaines applications doivent déterminer l'adresse IP et le protocole de la requête d'origine. L'adresse IP de l'utilisateur est disponible dans l'en-tête standard X-Forwarded-For
. Les applications nécessitant ces informations doivent configurer leur framework Web pour qu'il fasse confiance au proxy.
Avec Express.js, utilisez le paramètre trust proxy
:
app.set('trust proxy', true);
Notez que la définition de trust proxy
sur true
peut exposer la propriété req.ip
à une vulnérabilité d'usurpation d'adresse IP.
Système de fichiers
L'environnement d'exécution comprend un système de fichiers complet. Le système de fichiers est en lecture seule, à l'exception de l'emplacement /tmp
, qui est un disque virtuel stockant les données dans la mémoire RAM de votre instance App Engine.
Serveur de métadonnées
Chaque instance de votre application peut demander des informations sur l'instance et votre projet à l'aide du serveur de métadonnées App Engine.
Vous pouvez accéder au serveur de métadonnées via les points de terminaison suivants :
http://metadata
http://metadata.google.internal
Les requêtes envoyées au serveur de métadonnées doivent inclure l'en-tête de requête Metadata-Flavor: Google
. Cet en-tête indique que la requête a été envoyée dans le but de récupérer les valeurs de métadonnées.
La table suivante répertorie les points de terminaison sur lesquels vous pouvez effectuer des requêtes HTTP pour des métadonnées spécifiques :
Point de terminaison des métadonnées | Description |
---|---|
/computeMetadata/v1/project/numeric-project-id |
Numéro de projet attribué à votre projet. |
/computeMetadata/v1/project/project-id |
ID de projet attribué à votre projet. |
/computeMetadata/v1/instance/region |
Région dans laquelle l'instance est en cours d'exécution. |
/computeMetadata/v1/instance/service-accounts/default/aliases |
|
/computeMetadata/v1/instance/service-accounts/default/email |
Adresse e-mail du compte de service par défaut attribué à votre projet. |
/computeMetadata/v1/instance/service-accounts/default/ |
Répertorie tous les comptes de service par défaut pour votre projet. |
/computeMetadata/v1/instance/service-accounts/default/scopes |
Répertorie tous les champs d'application disponibles pour les comptes de service par défaut. |
/computeMetadata/v1/instance/service-accounts/default/token |
Renvoie le jeton d'authentification pouvant servir à authentifier votre application auprès d'autres API Google Cloud. |
Par exemple, pour récupérer votre ID de projet, envoyez une requête à http://metadata.google.internal/computeMetadata/v1/project/project-id
.