Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Cette page décrit quand et pourquoi créer des modèles d'instances déterministes. Les modèles d'instances déterministes décrivent clairement le type de services ou d'applications tiers à installer sur vos instances, lorsque le modèle d'instance est déployé. En créant des modèles d'instances déterministes, vous réduisez le comportement ambigu ou inattendu de vos modèles d'instances.
Pourquoi créer des modèles d'instances déterministes ?
En général, il vaut mieux que les propriétés de votre modèle d'instance soient aussi explicites et déterministes que possible. Si vous utilisez des scripts de démarrage dans vos modèles d'instances, qui installent ou utilisent des services tiers, assurez-vous que ces scripts fournissent des informations explicites, comme la version de l'application à installer. Compute Engine ne peut s'appuyer que sur les informations définies dans le modèle et n'a aucun contrôle sur les services tiers référencés. Si votre modèle est trop vague, votre modèle d'instance peut se comporter de manière inattendue.
Prenons comme exemple la commande suivante, qui permet de créer un modèle d'instance avec un script de démarrage, qui installe apache2 et utilise un fichier hébergé sur un serveur externe :
Ce script de démarrage présente deux problèmes potentiels :
Le script ne définit pas explicitement la version d'Apache2 à installer et s'appuie sur la version actuelle disponible dans le dépôt apt.
Le script repose sur un fichier hébergé sur une ressource tierce, qui ne gère pas les versions et qui a pu être modifié depuis la dernière utilisation du modèle d'instance.
Si vous utilisez un autoscaler, un modèle d'instance non déterministe peut conduire votre autoscaler à ajouter de nouvelles instances à un groupe d'instances géré, avec une configuration différente, comme une version différente d'Apache2.
De même, si vous avez appliqué ce modèle à un groupe d'instances géré, mis à jour le groupe avec un autre service de modèle, puis décidé de revenir au modèle précédent, vous risquez de vous retrouver avec des versions d'apache2 ou du fichier index.php différentes de celles précédant la mise à jour, car vos instances récupéreront toujours la version la plus récente au démarrage.
Éviter un comportement ambigu ou inattendu du modèle d'instance
Pour éviter un comportement inattendu du modèle, utilisez les méthodes suivantes:
Utilisez des images optimisées pour les conteneurs ou des images Docker, avec des tags Docker. Par exemple, nous vous recommandons d'attribuer de nouveaux tags à chaque nouvelle version de votre image Docker et d'utiliser ces tags dans vos modèles d'instances, plutôt que le dernier tag par défaut. Pour une image optimisée pour les conteneurs, vous pouvez explicitement référencer une version particulière de votre image dans votre fichier manifeste. L'exemple ci-dessous utilise l'image Docker "myimage", avec le tag de version "version_2_1_3" :
Créez une image personnalisée qui servira d'image pour le modèle. Cette méthode est préférable aux scripts de démarrage, car elle garantit la constance des instances. Les scripts de démarrage peuvent engendrer des résultats différents après les mises à jour du paquet de distribution. Utilisez des scripts de démarrage dans vos modèles d'instances pour le prototypage et le développement rapide, et utilisez des images personnalisées lorsque vous êtes prêt à déployer des services de production professionnels.
Si vous utilisez des scripts de démarrage, envisagez de les mettre à jour pour qu'ils soient déterministes. Par exemple, créez une autre version du modèle précédent et spécifiez un script de démarrage déterministe comme suit :
Où "version_2_1_3" correspond à un sous-répertoire contenant des scripts PHP pour la version 2.1.3 de votre service.
Lorsque vous spécifiez un modèle d'instance (par exemple, lorsque vous créez ou mettez à jour un groupe d'instances géré), Google vous recommande de spécifier la valeur d'ID du modèle plutôt que sa valeur de nom. Bien que les deux valeurs soient valides, l'ID est unique, ce qui signifie que le modèle d'instance que vous spécifiez est celui qui est utilisé lors de la création de VM à partir de ce modèle d'instance. L'utilisation d'un ID au lieu d'un nom permet de limiter les failles de sécurité potentielles, par exemple les failles TOCTOU, dans lesquelles un pirate informatique peut supprimer un modèle et le recréer avec le même nom avant son utilisation.
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/18 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Difficile à comprendre","hardToUnderstand","thumb-down"],["Informations ou exemple de code incorrects","incorrectInformationOrSampleCode","thumb-down"],["Il n'y a pas l'information/les exemples dont j'ai besoin","missingTheInformationSamplesINeed","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/08/18 (UTC)."],[[["\u003cp\u003eDeterministic instance templates ensure clarity on the third-party services or apps installed on instances during deployment, minimizing ambiguity.\u003c/p\u003e\n"],["\u003cp\u003eUsing explicit versioning in startup scripts, such as specifying the exact version of Apache2 to install, helps avoid unexpected behavior due to changes in third-party services.\u003c/p\u003e\n"],["\u003cp\u003eNon-deterministic templates can cause autoscalers to deploy instances with varying configurations, such as different software versions, potentially leading to inconsistencies.\u003c/p\u003e\n"],["\u003cp\u003eTo maintain consistency and predictability, use container-optimized images with specific Docker tags, or create custom images instead of relying heavily on startup scripts.\u003c/p\u003e\n"],["\u003cp\u003eWhen using startup scripts, make them deterministic by specifying exact versions of software and files, like \u003ccode\u003eapache2=2.2.20-1ubuntu1\u003c/code\u003e, and versioned directories for hosted files.\u003c/p\u003e\n"]]],[],null,["*** ** * ** ***\n\nThis page describes when and why to create deterministic instance\ntemplates. Deterministic instance templates make explicitly clear\nthe type of third-party services or apps to install on\nyour instances when the instance template is deployed. By creating deterministic\ninstance templates, you minimize ambiguity and unexpected behavior from your\ninstance templates.\n\nWhy create deterministic instance templates\n\nIn general, we recommend that the properties of your instance template be as\nexplicit and deterministic as possible. If you employ startup\nscripts in your instance templates that install or use third-party services,\nmake sure that these scripts provide explicit information, such as the\nversion of app to install. Compute Engine can only rely on\ninformation defined in the template and has no control over referenced\nthird-party services. If your template is too vague, your instance template\nmight behave unexpectedly.\n\nFor example, consider the following command to create an instance template with\na startup script that installs apache2 and uses a file that is hosted on an\nexternal server:\n**Note:** This is just an example snippet pointing to a non-existent server at 108.59.87.185. Copying this example directly fails when the script attempts to connect to 108.59.87.185. Instead, replace the last line with your own server information, if applicable. \n\n gcloud compute instance-templates create example-template-with-startup \\\n --image-family debian-9 \\\n --image-project debian-cloud \\\n --metadata startup-script='#! /bin/bash\n sudo apt install -y apache2\n scp myuser@108.59.87.185:index.php /var/www/'\n\nThere are two potential issues with this startup script:\n\n- The script does not explicitly define which version of apache2 to install, and relies on the current version available in the `apt` repository.\n- The script relies on a file hosted on a third-party that isn't versioned and could have been changed since the last time the instance template was used.\n\nIf you use an [autoscaler](/compute/docs/autoscaler), a non-deterministic\ninstance template can cause your autoscaler to add new instances to a\n[managed instance group](/compute/docs/instance-groups) with a different\nconfiguration, such as a different version of apache2.\n\nSimilarly, if you applied this template to a managed instance group, [updated\nthe group to a different template](/compute/docs/instance-groups/updating-migs)\nservice, and then decided to roll back to the previous template, you might end\nup with instances that use a different version of apache2 or index.php file\nthan before the update because your instances would always fetch the most recent\nversion at startup.\n\nAvoiding ambiguous or unexpected instance template behavior\n\nTo avoid unexpected template behavior, use the following methods:\n\n- Use [container-optimized images](/compute/docs/containers/container_vms) or\n Docker, with Docker tags. For example, we recommend that you assign new tags\n for every new build of your Docker image, and use these tags in your instance\n templates instead of the default latest tag. For a container-optimized image,\n you can explicitly reference a particular build of your image in your manifest\n file. The example below uses Docker image \"myimage\" at version tagged with\n \"version_2_1_3\":\n\n version: v1beta2\n containers:\n - name: simple-echo\n image: myimage:version_2_1_3\n [ rest of your manifest file ]\n\n- [Create a custom image](/compute/docs/images/create-delete-deprecate-private-images)\n to use as the image for the template. This is preferable to startup scripts\n because it guarantees that every instance is the same. Startup scripts might\n have different results after distribution package updates. Use startup scripts\n in your instance templates for prototyping and rapid development, and use\n custom images when you are ready to deploy production-quality services.\n\n- If you do use startup scripts, consider updating your scripts to be\n deterministic. For example, create a new version of the previous template, and\n specify a deterministic startup script as follows:\n\n gcloud compute instance-templates create example-template-with-startup-2-1-3 \\\n --image-family debian-9 \\\n --image-project debian-cloud \\\n --metadata startup-script='#! /bin/bash\n sudo apt install -y apache2=2.2.20-1ubuntu1\n scp myuser@108.59.87.185:version_2_1_3/index.php /var/www/'\n\n where \"version_2_1_3\" is a subdirectory containing PHP scripts for the\n version 2.1.3 of your service.\n- When specifying an instance template---for example when you are creating or\n updating a managed instance group---Google recommends that you specify the\n template's ID value instead of its name value. Although both values are valid,\n the ID is unique, which means that the instance template that you specify is\n the one that is used when creating VMs from that instance template. Using an\n ID instead of a name helps to mitigate potential security vulnerabilities---for\n example,\n [TOCTOU](https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use_vulnerability)\n vulnerabilities, where an attacker can delete a template and recreate it with\n the same name prior to its use.\n\n To view the ID of an instance template, see\n [Get information about an instance template](/compute/docs/instance-templates/get-list-delete-instance-templates#get_information_about_an_instance_template).\n\nWhat's next\n\n- [Create an instance template](/compute/docs/instance-templates/create-instance-templates).\n- [Manage your instance templates](/compute/docs/instance-templates/get-list-delete-instance-templates)."]]