Déployer un site Web avec Cloud Run

L'exécution de sites Web peut être complexe, car la création et la gestion d'instances de machines virtuelles (VM), de clusters, de pods, de services et bien d'autres tâches sont fastidieuses. Cela ne pose aucun problème pour les applications multiniveaux de plus grande taille, mais si vous essayez de déployer et de rendre visible votre site Web, cela représente beaucoup de travail.

Avec Cloud Run, l'implémentation Google Cloud de Knative, vous pouvez gérer et déployer votre site Web sans les frais liés aux déploiements de VM ou de Kubernetes. Non seulement il s'agit d'une approche plus simple du point de vue de la gestion, mais elle vous donne également la possibilité d'effectuer un scaling à zéro instance en l'absence de demandes sur votre site Web.

Cloud Run permet non seulement le développement sans serveur aux conteneurs, mais il peut également être exécuté sur vos propres clusters Google Kubernetes Engine (GKE) ou sur une solution PaaS (Platform as a Service) entièrement gérée fournie par Cloud Run. Vous allez tester le dernier scénario dans cet atelier de programmation.

Le schéma suivant illustre le flux du déploiement et de l'hébergement dans Cloud Run. Vous allez commencer par une image Docker créée via Cloud Build, que vous déclencherez dans Cloud Shell. Ensuite, déployez cette image dans Cloud Run à l'aide d'une commande dans Cloud Shell.

Prerequisites

Points abordés

  • Créer une image Docker à l'aide de Cloud Build et l'importer dans gcr.io
  • Le déploiement d'images Docker dans Cloud Run
  • La gestion des déploiements dans Cloud Run
  • Configurer un point de terminaison pour une application exécutée sur Cloud Run

Ce que vous allez faire

  • Site Web statique qui s'exécute dans un conteneur Docker
  • Une version de ce conteneur stockée dans Container Registry
  • Un déploiement Cloud Run pour votre site Web statique

Ce dont vous avez besoin

  • Un compte Google avec un accès administrateur pour créer des projets ou un projet avec un rôle de propriétaire de projet

Configuration de l'environnement d'auto-formation

Si vous n'avez pas encore de compte Google, vous devez en créer un. Connectez-vous ensuite à Google Cloud Console, puis cliquez sur Project (Projet) > Create project (Créer un projet).

Prenez note de l'ID, qui est automatiquement renseigné sous le nom de votre projet. L'ID de projet est un nom unique parmi tous les projets Google Cloud. Par conséquent, le nom figurant dans la capture d'écran est déjà utilisé et ne fonctionnera pas. Il sera désigné plus tard par l'expression PROJECT_ID.

Vous devez ensuite activer la facturation dans Cloud Console pour utiliser les ressources Google Cloud et activer l'API Cloud Run.

Activer l'API Cloud Run

Cliquez sur le menu de navigation ⇥ > APIs & Services > Dashboard > Enable APIs & Services (Activer les API et les services). .

Recherchez "API Cloud Run", puis cliquez sur API Cloud Run > Activer.

Le coût de cet atelier de programmation ne devrait pas vous coûter plus que quelques dollars, mais il pourrait être plus élevé si vous décidez d'utiliser davantage de ressources ou de les laisser s'exécuter (voir Effectuer un nettoyage à la fin). Pour en savoir plus, consultez la section Tarifs.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai offert de 300 $.

Cloud Shell

Bien que Google Cloud et Cloud Run puissent être utilisés à distance depuis votre ordinateur portable, vous allez utiliser Cloud Shell, un environnement de ligne de commande fonctionnant dans Google Cloud. L'environnement est préconfiguré avec toutes les bibliothèques clientes et les frameworks dont vous avez besoin.

Cette machine virtuelle basée sur Debian contient tous les outils de développement dont vous aurez besoin. Elle intègre un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Cela signifie que tout ce dont vous avez besoin pour cet atelier de programmation est un navigateur (oui, tout fonctionne sur un Chromebook).

Pour activer Google Cloud Shell, cliquez sur le bouton en haut à droite de la Console pour les développeurs, qui ne devrait pas prendre quelques instants pour provisionner l'environnement et s'y connecter :

activateCloudShell.png

Cliquez sur le bouton "Démarrer Cloud Shell" :

Capture d'écran du 2017-06-14 à 10.13.43 PM.png

En principe, une fois que vous êtes connecté à Cloud Shell, vous êtes authentifié, et le projet est défini sur votre PROJECT_ID :

gcloud auth list

Résultat de la commande

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Résultat de la commande

[core]
project = <PROJECT_ID>

Cloud Shell définit également certaines variables d'environnement par défaut qui peuvent être utiles lorsque vous exécutez de futures commandes.

echo $GOOGLE_CLOUD_PROJECT

Résultat de la commande

<PROJECT_ID>

Si, pour une raison quelconque, le projet n'est pas défini, exécutez simplement la commande suivante :

gcloud config set project <PROJECT_ID>

Vous recherchez votre PROJECT_ID ? Consultez l'ID utilisé pour la configuration ou recherchez-le dans le tableau de bord de la console:

ID_projet.png

IMPORTANT: Enfin, définissez la zone et la configuration du projet par défaut:

gcloud config set compute/zone us-central1-f

Vous pouvez choisir parmi différentes zones. Pour en savoir plus, consultez la documentation sur les régions et les zones.

Étant donné que vous déployez un site Web existant, il vous suffit de cloner la source à partir de votre dépôt pour vous concentrer sur la création d'images Docker et sur le déploiement dans Cloud Run.

Exécutez les commandes suivantes pour cloner le dépôt dans votre instance Cloud Shell et accéder au répertoire approprié. Vous allez également installer les dépendances Node.js afin de pouvoir tester votre application avant le déploiement.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

Cette action clone votre dépôt, modifie le répertoire et installe les dépendances nécessaires à l'exécution locale de votre application. L'exécution du script peut prendre quelques minutes.

Appliquez la procédure de diligence raisonnable et testez votre application. Exécutez la commande suivante pour démarrer votre serveur Web:

cd ~/monolith-to-microservices/monolith
npm start

Output:

Monolith listening on port 8080!

Pour prévisualiser votre application, cliquez sur Aperçu sur le Web, puis sélectionnez Prévisualiser sur le port 8080.

Une nouvelle fenêtre vous montre votre magasin Fancy.

Vous pouvez fermer cette fenêtre après avoir consulté le site Web. Pour arrêter le processus du serveur Web, appuyez sur CONTROL+C (Command+C sur Macintosh) dans la fenêtre de terminal.

Maintenant que vos fichiers sources sont prêts, il est temps de Docker votre application.

Habituellement, vous devez adopter une approche en deux étapes qui consiste à créer un conteneur Docker et à le transférer vers un registre pour stocker l'image que GKE doit extraire. Toutefois, Cloud Build permet de créer le conteneur Docker et de placer l'image dans Container Registry en une seule commande. Pour découvrir comment créer et transférer un Dockerfile manuellement, consultez le guide de démarrage rapide pour Container Registry.

Cloud Build compresse les fichiers du répertoire et les déplace dans un bucket Cloud Storage. Le processus de compilation extrait ensuite tous les fichiers du bucket et utilise le Dockerfile, qui se trouve dans le même répertoire pour exécuter le processus de compilation de Docker. Comme vous avez spécifié l'option --tag pour l'hôte en tant que gcr.io pour l'image Docker, l'image Docker générée sera transférée vers Container Registry.

Tout d'abord, assurez-vous que l'API Cloud Build est activée. Exécutez la commande suivante pour l'activer :

gcloud services enable cloudbuild.googleapis.com

Une fois l'API activée, exécutez la commande suivante dans Cloud Shell pour démarrer le processus de compilation:

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

Ce processus prend quelques minutes, mais une fois le processus terminé, un résultat semblable aux lignes suivantes s'affiche dans le terminal:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

Pour afficher l'historique de vos compilations ou regarder le processus en temps réel, vous pouvez accéder à Cloud Console, puis cliquer sur le menu de navigation ☰, puis sur Cloud Build &gt ; Historique. La liste de toutes vos compilations précédentes s'affiche. Toutefois, seule celle que vous avez créée devrait s'afficher.

Cliquez sur l'ID de compilation pour afficher tous les détails de cette compilation, y compris la sortie du journal. Vous pouvez afficher l'image de conteneur créée en cliquant sur le lien situé à côté de Image.

Maintenant que vous avez conteneurisé votre site Web et l'avez transféré vers Container Registry, vous pouvez le déployer dans Cloud Run.

Deux approches sont possibles pour le déploiement dans Cloud Run :

  • Cloud Run (entièrement géré) est le modèle PaaS, qui permet de gérer l'intégralité du cycle de vie des conteneurs. Vous utiliserez cette approche pour cet atelier de programmation.
  • Cloud Run for Anthos est Cloud Run avec un niveau de contrôle supplémentaire, qui vous permet d'importer vos clusters et vos pods depuis GKE. Pour en savoir plus, consultez la page Configurer Cloud Run for Anthos sur Google Cloud.

Les exemples de ligne de commande se trouvent dans Cloud Shell à l'aide des variables d'environnement que vous avez configurées précédemment.

Ligne de commande

Exécutez la commande suivante pour déployer votre application :

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

Vous serez invité à indiquer la région dans laquelle vous souhaitez lancer votre campagne. Sélectionnez la région la plus proche, puis acceptez le nom de service suggéré (monolithique) par défaut.

À des fins de test, autorisez les requêtes non authentifiées dans l'application. Saisissez y à l'invite.

Vérifier le déploiement

Pour vérifier que le déploiement a bien été créé, exécutez la commande suivante. La mise à jour de Pod status peut prendre quelques instants : Running

gcloud run services list

Sélectionnez [1] Cloud Run (entièrement géré).

Output:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

Le résultat affiche plusieurs éléments. Vous pouvez voir votre déploiement, ainsi que l'utilisateur qui l'a déployé (votre adresse e-mail) et l'URL que vous pouvez utiliser pour accéder à l'application. Tout semble bien créé.

Ouvrez l'URL fournie dans la liste des services de votre navigateur Web pour afficher le même site Web que celui que vous avez prévisualisé localement.

Déployez à nouveau votre application, mais ajustez cette fois l'un des paramètres.

Par défaut, les applications Cloud Run sont associées à une valeur de simultanéité de 80, ce qui signifie que chaque instance de conteneur peut diffuser jusqu'à 80 requêtes à la fois. Cela constitue un grand départ pour le modèle FaaS (Functions as a Service), dans lequel une instance traite une requête à la fois.

redéployez la même image de conteneur avec une valeur de simultanéité de 1 (uniquement à des fins de test) et voyez ce qui se passe.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

Répondez aux questions suivantes comme vous l'avez fait la première fois. Une fois la commande exécutée, consultez le résultat dans Cloud Console.

Dans le tableau de bord Cloud Run, cliquez sur le service monolithique pour afficher les détails.

Cliquez sur l'onglet Révisions. Deux révisions doivent être créées. Cliquez sur monolith-00002 et examinez les détails. La valeur de simultanéité doit être réduite à 1.

]

Bien que cette configuration soit suffisante pour les tests, dans la plupart des scénarios de production, les conteneurs acceptent plusieurs requêtes simultanées.

À présent, restaurez la simultanéité d'origine sans redéploiement. Vous pouvez définir la valeur de simultanéité sur 80 ou 0, ce qui élimine les restrictions de simultanéité et la définir sur la valeur maximale par défaut (qui est de 80 au moment de cette rédaction).

Exécutez la commande suivante dans Cloud Shell pour mettre à jour la révision actuelle:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

Vous remarquerez qu'une nouvelle révision a été créée, que le trafic a été redirigé et que la simultanéité est de retour à 80.

Votre équipe marketing vous a demandé de modifier la page d'accueil du site Web de votre entreprise. La marque pense qu'elle doit fournir plus d'informations sur ce que l'entreprise vend et vend. Dans cette section, vous allez ajouter du texte pour satisfaire votre équipe marketing sur la page d'accueil.

Il semble que l'un de vos développeurs a déjà créé les modifications portant le nom index.js.new. Copiez simplement ce fichier dans index.js pour que vos modifications soient répercutées. Suivez les instructions pour effectuer les changements appropriés.

Exécutez les commandes suivantes, copiez le fichier mis à jour sous le nom correct, puis imprimez son contenu pour vérifier les modifications:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

Le code résultant doit se présenter comme suit :

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

Vous avez mis à jour les composants React, mais vous devez compiler l'application React pour générer les fichiers statiques. Exécutez la commande suivante pour compiler l'application React et la copier dans le répertoire public "monolith" :

cd ~/monolith-to-microservices/react-app
npm run build:monolith

Maintenant que votre code est à jour, vous devez recréer votre conteneur Docker et le publier dans Container Registry. Vous pouvez utiliser la même commande que précédemment, mais cette fois-ci, vous allez mettre à jour le libellé de version.

Exécutez la commande suivante pour déclencher un nouveau Cloud Build avec la version d'image mise à jour de 2.0.0 :

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

Dans la section suivante, vous allez utiliser cette image pour mettre à jour votre application sans aucun temps d'arrêt.

Les modifications ont été effectuées, puis validées par l'équipe marketing. Il est temps de mettre à jour le site Web sans interrompre les utilisateurs.

Cloud Run traite chaque déploiement comme une nouvelle révision, qui sera mis en ligne, puis dirigé vers le trafic.

Suivez les instructions ci-dessous pour mettre à jour votre site Web.

Ligne de commande

À partir de la ligne de commande, vous pouvez redéployer le service pour mettre à jour l'image vers une nouvelle version à l'aide de la commande suivante:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

Vérifier le déploiement

Validez la mise à jour de votre déploiement en exécutant la commande suivante:

gcloud run services describe monolith --platform managed 

Le résultat ressemble à ceci :

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

Vous verrez que votre service utilise désormais la dernière version de votre image déployée dans une nouvelle révision.

Pour valider vos modifications, accédez à nouveau à l'URL externe de votre service Cloud Run et notez que le titre de votre application a été mis à jour.

Exécutez la commande suivante pour afficher la liste des services et afficher l'adresse IP en cas d'oubli:

gcloud run services list

Votre site Web doit maintenant afficher le texte que vous avez ajouté au composant de la page d'accueil.

Supprimer des images Container Registry

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

Supprimer les artefacts Cloud Build de Cloud Storage

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}' 

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

Supprimer le service Cloud Run

gcloud run services delete monolith --platform managed

Vous avez déployé, mis à l'échelle et mis à jour votre site Web avec Cloud Run.

Learn more