Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Halaman ini menjelaskan kapan dan alasan pembuatan template instance deterministik. Template instance deterministik menjelaskan secara eksplisit jenis layanan atau aplikasi pihak ketiga yang akan diinstal di instance Anda saat template instance tersebut di-deploy. Dengan membuat template instance deterministik, Anda meminimalkan ambiguitas dan perilaku yang tidak terduga dari template instance Anda.
Alasan membuat template instance deterministik
Secara umum, sebaiknya properti template instance Anda se-eksplisit dan se-deterministik mungkin. Jika Anda men-deploy skrip startup dalam template instance yang menginstal atau menggunakan layanan pihak ketiga, pastikan skrip ini memberikan informasi eksplisit, seperti versi aplikasi yang akan diinstal. Compute Engine hanya dapat mengandalkan informasi yang ditentukan di dalam template dan tidak memiliki kontrol atas layanan pihak ketiga yang direferensikan. Jika template Anda terlalu samar, template instance Anda mungkin berperilaku tidak terduga.
Misalnya, pertimbangkan perintah berikut untuk membuat template instance dengan skrip startup yang menginstal apache2 dan menggunakan file yang dihosting di server eksternal:
Skrip ini tidak secara eksplisit menentukan versi apache2 yang akan diinstal, dan mengandalkan versi saat ini yang tersedia di repositori apt.
Skrip ini mengandalkan file yang dihosting di pihak ketiga yang tidak memiliki versi dan mungkin telah diubah sejak terakhir kali template instance digunakan.
Jika Anda menggunakan autoscaler, template instance non-deterministik dapat menyebabkan autoscaler menambahkan instance baru ke grup instance terkelola dengan konfigurasi berbeda, seperti versi yang berbeda dari apache2.
Demikian pula, jika Anda menerapkan template ini ke grup instance terkelola, memperbarui grup itu ke layanan template yang berbeda, lalu memutuskan untuk melakukan roll back ke template sebelumnya, mungkin akan ada instance yang menggunakan versi berbeda dari file apache2 atau index.php dibandingkan dengan sebelum pembaruan karena instance Anda akan selalu mengambil versi terbaru pada saat dimulai.
Menghindari perilaku template instance yang ambigu atau tidak terduga
Untuk menghindari perilaku template yang tidak terduga, gunakan metode berikut:
Gunakan image yang dioptimalkan untuk container atau Docker, dengan tag Docker. Misalnya, sebaiknya Anda menetapkan tag baru untuk setiap build baru image Docker, dan menggunakan tag ini di template instance Anda, bukan tag terbaru default. Jika menggunakan image yang dioptimalkan untuk container, Anda dapat secara eksplisit mereferensikan build tertentu dari image Anda dalam file manifes. Contoh di bawah ini menggunakan image Docker "myimage" pada versi yang diberi tag dengan "version_2_1_3":
Buat image kustom yang akan digunakan sebagai image untuk template. Opsi ini lebih disukai daripada skrip startup karena menjamin bahwa setiap instance akan sama. Skrip startup mungkin memiliki hasil yang berbeda setelah paket distribusi diperbarui. Gunakan skrip startup dalam template instance Anda untuk pembuatan prototipe dan pengembangan cepat, serta gunakan image kustom jika Anda sudah siap men-deploy layanan berkualitas produksi.
Jika Anda menggunakan skrip startup, pertimbangkan untuk memperbarui skrip Anda agar menjadi deterministik. Misalnya, buat versi baru dari template sebelumnya, dan tentukan skrip startup deterministik sebagai berikut:
di mana "version_2_1_3" adalah subdirektori yang berisi skrip PHP untuk versi 2.1.3 layanan Anda.
Saat menentukan template instance—misalnya saat Anda membuat atau
memperbarui grup instance terkelola—Google merekomendasikan agar Anda menentukan
nilai ID template, bukan nilai namanya. Meskipun kedua nilai tersebut valid, ID-nya unik, yang berarti template instance yang Anda tentukan adalah template yang digunakan saat membuat VM dari template instance tersebut. Menggunakan ID, bukan nama, membantu memitigasi potensi kerentanan keamanan—misalnya, kerentanan TOCTOU, saat penyerang dapat menghapus template dan membuatnya ulang dengan nama yang sama sebelum digunakan.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Sulit dipahami","hardToUnderstand","thumb-down"],["Informasi atau kode contoh salah","incorrectInformationOrSampleCode","thumb-down"],["Informasi/contoh yang saya butuhkan tidak ada","missingTheInformationSamplesINeed","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-09-04 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,["# Deterministic instance templates\n\n*** ** * ** ***\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-------------------------------------------\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-----------------------------------------------------------\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\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)."]]