Configurer les mises à jour automatiques des images de base

Configurer les mises à jour automatiques des images de base pour Cloud Run permet à Google d'appliquer automatiquement des correctifs de sécurité au système d'exploitation et aux composants d'exécution de l'image de l'application. Vous n'avez pas besoin de recompiler ou de redéployer votre service.

Pour configurer les mises à jour automatiques des images de base, procédez comme suit :

  • Sélectionnez une image de base compatible avec Cloud Run.
  • Créez et déployez l'image de votre application de manière à préserver la possibilité de redéfinir en toute sécurité votre service en cours d'exécution.

Sélectionner une image de base

Une image de base est le point de départ de la plupart des workflows de développement basés sur des conteneurs. Les développeurs commencent par une image de base, sur laquelle sont superposées les bibliothèques, les fichiers binaires et les fichiers de configuration nécessaires à l'exécution de leur application.

Les buildpacks de Google Cloud publient et gèrent des images de base pour la création d'applications sans serveur. Ces images de base sont créées sur la distribution Linux Ubuntu.

Cloud Run n'est compatible qu'avec les images de base automatiques qui utilisent des images de base des buildpacks de Google Cloud.

Lorsque vous choisissez un buildpack Google Cloud, vous devez tenir compte des points suivants :

  • Pile : une pile se compose d'une version de distribution Linux et de packages système, tels que OpenSSL et curl.
  • Langage : version spécifique du langage de programmation utilisé par votre application.

Consultez la section images de base de l'environnement d'exécution pour en savoir plus sur les variantes d'images de base.

Créer l'image de l'application

Les services pour lesquels les mises à jour automatiques sont activées doivent fournir une image d'application qui omet les couches de base du système d'exploitation. Pour ce faire, deux moyens s'offrent à vous :

Déployer une fonction à partir d'une source

Vous pouvez utiliser la fonctionnalité de déploiement à partir de la source de Cloud Run pour créer votre application afin qu'elle soit compatible avec les mises à jour automatiques. Pour ce faire, vous devez fournir l'option --base-image lorsque vous créez votre application.

Par exemple, pour déployer un service ou une fonction Python avec les mises à jour automatiques des images de base activées, utilisez la commande suivante :

gcloud beta run deploy python-application \
  --source . \
  --base-image=python312

Créer à partir de scratch

Vous pouvez également utiliser votre chaîne d'outils de compilation pour créer une image d'application compatible avec les mises à jour automatiques des images de base. Pour ce faire, vous devrez :

  1. Créer un Dockerfile en plusieurs étapes
    1. Créer l'application en utilisant une image de base appropriée avec les dépendances requises
    2. Copier les composants compilés sur une image scratch.
  2. Créer les images de l'application et les publier dans Artifact Registry
  3. Déployer l'application avec Cloud Run

Créer un Dockerfile en plusieurs étapes

Nous utiliserons une application Node.js pour ce guide. Ce guide n'est pas spécifique à un langage et peut être personnalisé pour votre application et votre langage.

  • Créez un fichier Dockerfile dans le répertoire racine de notre projet avec les éléments suivants :

    FROM node:18-slim as builder
    
    # Create and change to the app directory.
    WORKDIR /usr/src/app
    
    # Copy application dependency manifests to the container image and install
    # production dependencies.
    COPY package*.json ./
    RUN npm install --only=production
    
    # Copy local code to the container image.
    COPY . ./
    
    # Copy the application source code and depenencies onto a scratch image.
    FROM scratch
    COPY --from=builder --chown=33:33 /usr/src/app/ ./
    
    # Run the web service on container startup.
    CMD [ "node", "index.js" ]
    

Ce fichier Dockerfile utilise une création en plusieurs étapes pour copier le code source et les dépendances de l'application sur une image scratch qui omet le système d'exploitation, les packages et les composants d'exécution qui seront fournis au moment de l'exécution par l'image de base gérée par Cloud Run.

Créer l'image de votre application

Créez l'image de votre application et importez-la dans Artifact Registry. Consultez la section Créer des conteneurs pour apprendre à créer un fichier Dockerfile avec Cloud Build et à l'importer dans Artifact Registry.

Déployer l'image de l'application

Vous êtes maintenant prêt à déployer l'image de votre application avec les mises à jour automatiques activées à l'aide de l'image de base la plus compatible pour votre application. Nous allons utiliser nodejs18 pour cet exemple.

Pour en savoir plus sur les rôles et les autorisations requis, consultez la page Déployer des images de conteneurs sur Cloud Run.

gcloud beta run deploy SERVICE \
  --image=IMAGE \
  --base-image=nodejs18

Remplacez :

  • SERVICE par le nom du service sur lequel vous souhaitez déployer l'image. Les noms de service doivent comporter un maximum de 49 caractères et être uniques par région et par projet. Si le service n'existe pas encore, cette commande le crée lors du déploiement. Vous pouvez omettre ce paramètre, mais dans ce cas le nom du service vous sera demandé.
  • IMAGE par l'URL de votre image de conteneur ;

Champs et annotations de service

En activant les mises à jour de sécurité automatiques, la configuration de votre service sera enrichie des données suivantes.

YAML

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: SERVICE
annotations:
    ...
    run.googleapis.com/build-base-image: BASE_IMAGE_URL
    run.googleapis.com/launch-stage: BETA
    ...
spec:
...
runtimeClassName: run.googleapis.com/linux-base-image-update

Remplacez :

  • SERVICE par le nom du service sur lequel vous souhaitez déployer l'image. Les noms de service doivent comporter un maximum de 49 caractères et être uniques par région et par projet. Si le service n'existe pas encore, cette commande le crée lors du déploiement. Vous pouvez omettre ce paramètre, mais dans ce cas le nom du service vous sera demandé.
  • BASE_IMAGE_URL par l'image de base qui sera utilisée lors du prochain déploiement. BASE_IMAGE_URL sera utilisé lors du prochain déploiement d'une source ou d'une fonction. Consultez la section Images de base de l'environnement d'exécution pour en savoir plus sur les variantes d'images de base.

Désactiver les mises à jour automatiques

Vous pouvez désactiver les mises à jour de sécurité automatiques en mettant à jour la définition de votre service.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Pour désactiver les mises à jour automatiques de l'environnement d'exécution Node.js 18, exécutez la commande suivante :

gcloud beta run deploy SERVICE \
    --image=IMAGE \
    --base-image=nodejs18 \
    --no-automatic-updates

Remplacez :

  • SERVICE par le nom du service sur lequel vous souhaitez déployer l'image. Les noms de service doivent comporter un maximum de 49 caractères et être uniques par région et par projet. Si le service n'existe pas encore, cette commande le crée lors du déploiement. Vous pouvez omettre ce paramètre, mais dans ce cas le nom du service vous sera demandé.
  • IMAGE par l'URL de votre image de conteneur.

YAML

  1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

    gcloud run services describe SERVICE --format export > service.yaml
  2. Supprimez la ligne run.googleapis.com/build-base-image: BASE_IMAGE_URL. Vous pouvez éventuellement supprimer la ligne runtimeClassName.

  3. Remplacez la configuration du service en exécutant la commande suivante :

    gcloud run services replace service.yaml

Limitations connues

  • Cloud Run n'est compatible qu'avec les images de base des buildpacks de Google Cloud.

  • Les applications utilisant des langages compilés ne seront pas recompilées suite à la mise à jour automatique de l'image de base.

  • Les analyses de sécurité de l'image de votre application peuvent être incomplètes. Étant donné que l'image de votre application est désormais basée sur scratch, les analyseurs de sécurité se concentrent sur la partie application de votre image. Pour obtenir une image plus complète de la sécurité de vos conteneurs, vous devez également exécuter des analyses sur l'image de base correspondante fournie par Google. Vous pouvez télécharger l'image de base et utiliser des outils Open Source pour effectuer une analyse.