Déployer une application NodeJs sur App Engine
Tags: node, googlecloud
Published: 2023-07-04 14:37:05

App Engine est l'un des produits que proposent Google dans la Google Cloud Platform. Il est placé dans la catégorie des services Serverless, du fait qu'il permet de déployer son application sans se soucier de tonne de configurations que l'on fait généralement pour déployer une application.

> Je vous recommande de lire [cet article](https://dev.to/kadea-academy/utiliser-google-cloud-platform-4lhj) avant de continuer, c'est une brève explication de Google Cloud Platform.

 .

> Il est important d’ajouter un compte de facturation pour pouvoir utiliser ce produit. Pour le faire, accédez au service **Facturation**, et suivez les instructions.
> ![Service Facturation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/547tgltcunlvn3vncc2j.png)


## Activer l’API App Engine et Créer une application

Ouvrez Google Cloud Platform Console, dans le panneau latéral entrez dans **App Engine**. Cliquez ensuite sur Activer l’API

![Activer App Engine](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6zixjfk5j9biv2s43paf.png)

Vous pourrez ensuite créer une nouvelle application App Engine dans la GCP Console.

Choisissez le langage à utiliser (Node.js pour JavaScript). L’environnement Standard est moins coûteux, votre application sera mise en veille (0 instance démarrée) en cas de non utilisation. L’environnement Flexible permet de booster les ressources pour les adapter au mieux à l’application, l’application n’est jamais mise en veille (au moins 1 instance en cours, même après plusieurs mois d’inactivité).


![Langage utilisé](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ek6hufhbetmysuzcteay.png)

> Notez qu'à ce niveau il n'y a pas de bouton **Enregistrer**. L'enregistrement se fera automatiquement lors du déploiement.
> Par contre l'on nous propose d'installer le SDK gcloud, c'est la prochaine étape.

## Installer SDK gcloud

Le SDK gcloud est une application **en ligne de commande** qui nous permet d'**interagir avec Google Cloud Platform** sans passer par la GCP Console (Interface Web). Elle est nécessaire pour déployer votre application Node.js avec App Engine.

Selon votre système, suivez la procédure indiquée [ici](https://cloud.google.com/sdk/docs/install?hl=fr) ([Install gcloud CLI](https://cloud.google.com/sdk/docs/install?hl=fr)).


Sur Ubuntu (version LTS) exécutez ces commandes:

```bash
sudo apt-get update

sudo apt-get install apt-transport-https ca-certificates gnupg curl sudo

echo "deb https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update && sudo apt-get install google-cloud-cli

```
Ces commandes installent gcloud et les outils nécessaires à son fonctionnement.
![Install gcloud](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fomo7tyt4s5oii57pu1y.png)

## Configurer son déploiement

Pour déployer son application il faut indiquer à gcloud certains détails, notamment le compte Google à utiliser, le projet GCP relié à notre application, ….

### Pour notre cas commençons par connecter le compte à gcloud

Connecter son compte à gcloud se fait aussi simplement qu'en une ligne de commande. Dans votre ligne de commande, executez 

```bash
gcloud auth login
```
Cette commande ouvre votre navigateur web, il suffit alors de choisir le compte que vous souhaitez connecter et d'accepter les autorisations demandées.

### Ensuite connecter un projet GCP à gcloud.

L'étape suivante est d'indiquer à gcloud le projet Google Cloud que l'on va utiliser. Pour cela, executer la commande

```bash
gcloud config set projet PROJECT_ID
```

Remplacer PROJECT_ID par l’identifiant de votre projet. Il peut être trouver dans la GCP Console. Sur l'image le projet Learning Cloud a comme PROJECT_ID `learning-cloud-386212`


![Obtenir PROJECT_ID](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/92dtx6s2z79asgwhs2i9.png)

### Écrire le fichier app.yaml

Si vous n’avez pas encore d'application, vous pouvez cloner celle-ci sur github: [https://github.com/lexnotor/gcloud-dev.git](https://github.com/lexnotor/gcloud-dev.git)


> ![Project Structure](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qy9iupnudy8vjrzndd7.png)
> App engine fournit le port sur lequel votre application peut être démarré, on y accède à partir de process.env.PORT.


App Engine aura besoin de quelques informations (le langage utilisé, …) pour démarrer votre application en ligne. Ces informations sont spécifiées dans un fichier app.yaml et ce fichier est placé à la racine du projet. Ajoutez-le à la racine de votre application.

Voici un exemple du contenue de ce fichier

```yaml
runtime: nodejs18

# le nom du service, par defaut le nom est default
service: test-deploy

# nombre d'instance maximum
automatic_scaling:
    max_instances: 1

# indique à app engine de diriger tous les paths (URL) vers l'application
handlers:
    - url: /.*
      secure: always
      redirect_http_response_code: 301
      script: auto

# commande pour demarrer son application
entrypoint: "npm run start:prod"
```

Dans cet exemple:

- **runtime**: indique que l’on utilise la version `18 de Nodejs`.
- **service**: indique le nom que l’on souhaite donner à notre service
- **automatic_scaling**: un objet qui indique les paramètres de scalabilité
 - **max_instances**: cette clé indique le nombre maximum d’instance qui seront créées, pour notre petite application une instance suffit.
- **handlers**: un tableau d’objets qui indiquent comment app engine gère les requêtes
 - **url**: les paths d’url que la configuration gère. `/.*` = tous les paths
 - **secure**: configure l’utilisation de https et http. `always` = redirige toutes les requêtes vers https
 - **redirect_http_response_code**: le _code de statut_ de la redirection
 - **script**: si `auto` alors les requêtes sont adressées à l’application
- **entrypoint**: la commande que App engine exécutera pour lancer l’application. Notez que app engine exécute lui même `npm build` avant cette commande. Pour notre cas, c’est une application NestJs que nous allons déployer.

## Déployer
La dernière étape est d'envoyer notre projet sur Google Cloud, encore là gcloud nous facilite grandement la tâche en une commande.

```bash
gcloud app deploy
```
Cette commande envoi l'ensemble de vos code dans le cloud, et déploie l'application.

Pour voir le lien du déploiement, rendez-vous sur la GCP Console, dans le service App Engine.

**Félicitations vous venez de déployer une application NodeJs sur Google Cloud Platform via App Engine**. Notez qu'il ne s'agit pas de la seule façon de le faire.

---

**Alexandre Chambu**
- [LinkedIn](https://www.linkedin.com/in/lexnotor/)

- [Github](https://github.com/lexnotor)