Buat dan jalankan skrip shutdown yang menjalankan perintah tepat sebelum instance virtual machine (VM) dihentikan atau dimulai ulang. Hal ini berguna jika Anda mengandalkan skrip otomatis untuk memulai dan mematikan instance, sehingga instance memiliki waktu untuk membersihkan atau melakukan tugas, seperti mengekspor log, atau menyinkronkan dengan sistem lain.
Skrip shutdown sangat berguna untuk VM dalam grup instance terkelola dengan autoscaler. Jika autoscaler menghentikan VM dalam grup, skrip shutdown akan berjalan sebelum VM berhenti dan skrip shutdown akan melakukan tindakan apa pun yang Anda tentukan. Skrip ini berjalan selama periode shutdown terbatas sebelum VM berhenti. Misalnya, skrip shutdown Anda mungkin menyalin data yang diproses ke Cloud Storage atau mencadangkan log apa pun.
Skrip shutdown memiliki fungsi yang sangat mirip dengan skrip startup. Banyak dokumentasi untuk skrip startup juga berlaku untuk skrip shutdown.
Untuk tugas shutdown dan mulai ulang, VM selalu menjalankan skrip shutdown sebagai berikut:
- Untuk VM Linux, dengan menggunakan pengguna
root. - Untuk VM Windows, dengan menggunakan akun
System.
Prasyarat
Untuk menjalankan skrip yang disimpan dalam metadata pada instance VM, lingkungan tamu harus diinstal dan dijalankan.
- Lingkungan tamu mencakup agen tamu (misalnya, google-guest-agent di Linux) yang membaca konten skrip atau URL dari metadata instance dan memulai eksekusi.
- Semua image Compute Engine publik dilengkapi dengan lingkungan tamu yang telah diinstal sebelumnya.
- Jika Anda membuat image kustom, Anda harus menginstal Lingkungan Tamu Google secara manual untuk memastikan skrip dari metadata dan fitur Google Cloud lainnya berfungsi dengan baik.
Sebelum memulai
- Pelajari Skrip startup.
- Pahami apa itu server metadata.
-
Siapkan autentikasi jika Anda belum melakukannya.
Autentikasi memverifikasi identitas Anda untuk mengakses layanan Google Cloud dan API. Untuk menjalankan
kode atau contoh dari lingkungan pengembangan lokal, Anda dapat melakukan autentikasi ke
Compute Engine dengan memilih salah satu opsi berikut:
Pilih tab untuk melihat bagaimana Anda berencana menggunakan contoh di halaman ini:
Konsol
Saat menggunakan konsol Google Cloud untuk mengakses layanan dan API Google Cloud , Anda tidak perlu menyiapkan autentikasi.
gcloud
-
Instal Google Cloud CLI. Setelah penginstalan, lakukan inisialisasi Google Cloud CLI dengan menjalankan perintah berikut:
gcloud initJika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
- Tetapkan region dan zona default.
-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Jika Anda menggunakan shell lokal, buat kredensial autentikasi lokal untuk akun pengguna Anda:
gcloud auth application-default login
Anda tidak perlu melakukannya jika menggunakan Cloud Shell.
Jika error autentikasi ditampilkan, dan Anda menggunakan penyedia identitas (IdP) eksternal, pastikan Anda telah login ke gcloud CLI dengan identitas gabungan Anda.
Terraform
Untuk menggunakan contoh Terraform di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.
Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
REST
Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.
Instal Google Cloud CLI.
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
Untuk mengetahui informasi selengkapnya, lihat Melakukan autentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud .
Izin yang diperlukan untuk langkah ini
Untuk melakukan tugas ini, Anda harus memiliki izin berikut:
- Semua izin yang diperlukan untuk membuat instance
compute.instances.setMetadatapada instance
Spesifikasi
Bagian berikut menguraikan spesifikasi untuk skrip shutdown.
Batasan
Ada beberapa batasan yang perlu diperhatikan saat menggunakan skrip shutdown:
- Compute Engine menjalankan skrip shutdown hanya berdasarkan upaya terbaik. Dalam kasus yang jarang terjadi, Compute Engine tidak dapat menjamin bahwa skrip shutdown akan selesai.
- Di Windows, Local Group Policy digunakan untuk meluncurkan skrip shutdown.
- Paket penginstalan mengonfigurasi setelan Local Group Policy
Computer Configuration/Windows Setting/Scripts (Startup/Shutdown)untuk meluncurkan skrip setelah penonaktifan sistem.
- Paket penginstalan mengonfigurasi setelan Local Group Policy
Menghentikan pemanggilan skrip
Skrip shutdown dipicu saat instance dimatikan setelah salah satu peristiwa berikut terjadi:
Anda melakukan hal berikut:
Hentikan atau mulai ulang instance dari dalam OS tamu.
Compute Engine menghentikan instance sebagai bagian dari operasi penghentian atau penghapusan terprogram.
Compute Engine menghentikan Spot VM atau preemptible instance sebagai bagian dari proses preemption.
Skrip shutdown dapat berupa jenis file apa pun. Jika ada skrip shutdown dalam instance, Compute Engine akan melakukan hal berikut:
- Menyalin skrip ke file lokal dalam instance.
- Menetapkan izin pada file agar skrip dapat dieksekusi.
- Menjalankan file saat instance dihentikan.
Misalnya, Anda dapat menyediakan skrip Python alih-alih skrip bash. Perlu diingat bahwa Compute Engine menjalankan skrip kata demi kata, apa pun jenis skripnya.
Untuk menjalankan skrip yang bukan merupakan bash, tambahkan baris shebang di bagian atas file untuk memberi tahu sistem operasi mana yang akan digunakan penafsir. Misalnya, untuk skrip Python, Anda dapat menambahkan baris Shebang seperti:
#!/usr/bin/python
Menghentikan waktu eksekusi skrip
Skrip shutdown Anda mulai berjalan saat Compute Engine menetapkan status instance ke STOPPING. Skrip Anda harus selesai sebelum instance
dihentikan sepenuhnya, yaitu saat statusnya berubah menjadi TERMINATED. Waktu yang diperlukan instance untuk mencapai status TERMINATED bervariasi, bergantung pada jenis instance.
Jika skrip Anda memerlukan waktu lebih lama daripada waktu yang diperlukan instance untuk berhenti,
Compute Engine akan menghentikan skrip secara paksa, yang dapat menyebabkan
kehilangan data atau tugas yang tidak selesai. Untuk mencegah hal ini,
hentikan instance dari dalam OS tamu.
Pendekatan ini mempertahankan status instance ke STOPPING hingga skrip shutdown Anda selesai berjalan.
Menggunakan skrip shutdown lokal
Skrip shutdown lokal adalah skrip yang ada di komputer lokal Anda. Teruskan skrip shutdown lokal sebagai file atau dengan memberikan kontennya secara langsung ke Compute Engine.
Skrip shutdown dapat melakukan tindakan sebanyak yang Anda butuhkan, tetapi jika Anda meneruskan file secara lokal, skrip Anda tidak boleh melebihi batas panjang nilai metadata sebesar 256 KB. Untuk menggunakan skrip yang melebihi batas panjang, simpan file Anda di Cloud Storage. Lihat Menggunakan skrip shutdown dari Cloud Storage untuk informasi lebih lanjut.
Memberikan file skrip shutdown
Anda hanya dapat meneruskan file skrip shutdown lokal melalui alat command line gcloud.
gcloud
Untuk meneruskan file skrip shutdown lokal, berikan flag --metadata-from-file, diikuti dengan pasangan kunci metadata, shutdown-script=PATH/TO/FILE, dengan PATH/TO/FILE sebagai jalur relatif ke skrip shutdown. Contoh:
gcloud compute instances create example-instance \
--metadata-from-file shutdown-script=examples/scripts/install.sh
Terraform
Untuk menentukan skrip shutdown secara langsung, gunakan resource google_compute_instance dengan jalur ke skrip shutdown di metadata.
Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.
Menyediakan konten skrip shutdown secara langsung
Atau, Anda dapat meneruskan konten skrip shutdown secara langsung.
Konsol
Di konsol Google Cloud , tentukan skrip shutdown secara langsung menggunakan
kunci metadata shutdown-script:
Buka halaman Create an instance.
Tentukan detail VM.
Luaskan bagian Advanced options.
Luaskan Management, dan lakukan tindakan berikut:
- Di bagian Metadata, klik Add item.
- Di kolom Key, masukkan
shutdown-scriptuntuk kunci metadata. - Di kolom Value, tambahkan konten skrip shutdown Anda.
Lanjutkan dengan proses pembuatan VM.
gcloud
Dengan menggunakan Google Cloud CLI, gunakan flag --metadata untuk memberikan isi skrip shutdown Anda, diikuti dengan pasangan kunci shutdown-script=CONTENTS, dengan CONTENTS sebagai konten skrip shutdown Anda.
gcloud compute instances create example-instance --metadata shutdown-script="#! /bin/bash
> # Shuts down Apache server
> /etc/init.d/apache2 stop"
Terraform
Untuk menentukan skrip shutdown secara langsung, gunakan resource google_compute_instance dengan skrip shutdown di metadata.
Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.
REST
Di API, berikan skrip shutdown sebagai bagian dari properti metadata dalam permintaan saat Anda membuat instance. Gunakan shutdown-script sebagai
kunci metadata:
POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances
{...
"metadata": {
"items": [
{
"key": "shutdown-script",
"value": "#! /bin/bash\n\n# Shuts down Apache server\n/etc/init.d/apache2 stop"
}
]
}...
}
Menyediakan skrip shutdown pada instance Windows
Jalankan skrip shutdown pada instance Windows menggunakan kunci metadata khusus Windows berikut. Pilih dari salah satu tombol khusus yang tercantum di bawah. Setiap kunci harus cocok dengan jenis skrip yang ingin dijalankan.
Anda dapat menentukan beberapa skrip shutdown dengan meneruskan kunci yang berbeda ke instance, tetapi setiap kunci hanya dapat ditentukan sekali per virtual machine.
Kunci berikut dapat digunakan dengan skrip shutdown lokal, menggunakan petunjuk yang sama sebelumnya dalam dokumen ini.
Skrip shutdown cmd |
Skrip shutdown bat |
Skrip shutdown ps1 |
|---|---|---|
windows-shutdown-script-cmd |
windows-shutdown-script-bat |
windows-shutdown-script-ps1 |
Menggunakan skrip shutdown dari Cloud Storage
Anda dapat menyimpan dan menggunakan skrip shutdown dari Cloud Storage. Ikuti
petunjuk dalam dokumentasi Skrip startup,
tetapi ganti startup-script-url dengan shutdown-script-url.
Untuk instance Windows, ganti windows-startup-script-url dengan
windows-shutdown-script-url.
Menerapkan skrip shutdown ke instance yang sedang berjalan
Untuk menambahkan skrip shutdown ke instance yang sedang berjalan, ikuti petunjuk dalam dokumentasi Menerapkan skrip startup ke instance yang berjalan, tetapi ganti kunci metadata dengan salah satu kunci berikut:
shutdown-script: Menyediakan konten skrip shutdown secara langsung dengan kunci ini. Dengan Google Cloud CLI, Anda dapat memberikan jalur ke file skrip shutdown, menggunakan flag--metadata-from-filedan kunci metadatashutdown-script.shutdown-script-url: Menyediakan URL Cloud Storage ke file skrip shutdown dengan kunci ini.
Menjalankan skrip shutdown selama penghentian normal
Secara default, jika instance komputasi mengaktifkan penghentian normal, skrip shutdown yang Anda konfigurasi di kunci metadata akan berjalan setelah penghentian normal berakhir.
Untuk menjalankan perintah selama penghentian normal, Anda harus menggunakan skrip watcher kustom yang terus-menerus melakukan polling ke server metadata di latar belakang, seperti yang ditunjukkan di bagian ini. Untuk memberi skrip Anda cukup waktu untuk menyelesaikan dan menghindari potensi kehilangan data atau tugas yang tidak lengkap, sebaiknya ubah skrip shutdown dengan memindahkan logika ke skrip watcher ini.
Untuk menjalankan skrip shutdown selama penghentian normal, pilih salah satu opsi berikut berdasarkan OS tamu yang digunakan instance komputasi Anda:
Linux
Jika Anda belum melakukannya, hubungkan ke instance komputasi.
Jalankan skrip watcher, atau konfigurasikan untuk dijalankan saat booting, seperti berikut. Tambahkan logika penonaktifan spesifik Anda di tempat yang ditunjukkan:
#!/bin/bash # -------------------------------------------------------- # Script for graceful shutdown based on the metadata value # -------------------------------------------------------- # # This script monitors the metadata key `shutdown-status` and # waits for its value to change to `PENDING_STOP`. After the script # runs a series of user-defined commands, it runs `sudo shutdown -h now` # to signal to Compute Engine that the shutdown process is # complete. # # To run this script, you must have passwordless sudo privileges. METADATA_URL="http://metadata.google.internal/computeMetadata/v1/instance/attributes/shutdown-status" LAST_ETAG="0" echo "Starting shutdown status watcher" while true; do # Wait for the metadata value to change. # The metadata server blocks the request until a change occurs or a timeout is reached. RESPONSE=$(curl -H "Metadata-Flavor: Google" -s -i "${METADATA_URL}?wait_for_change=true&last_etag=${LAST_ETAG}") CURL_EXIT_STATUS=$? if [[ ${CURL_EXIT_STATUS} -ne 0 ]]; then echo "Error: curl command failed with exit status ${CURL_EXIT_STATUS}. Retrying in 5 seconds..." sleep 5 continue fi # Strip carriage returns (\r) immediately to prevent CRLF line endings from corrupting string comparisons RESPONSE=$(echo "$RESPONSE" | tr -d '\r') # Extract the HTTP status code from the first line of the response HTTP_STATUS=$(echo "$RESPONSE" | head -n 1 | awk '{print $2}') if [[ "${HTTP_STATUS}" -eq 200 ]]; then # Read the new etag value to re-subscribe on the next poll. NEW_ETAG=$(echo "$RESPONSE" | grep -i "^ETag:" | awk '{print $2}') if [[ -n "${NEW_ETAG}" ]]; then LAST_ETAG="${NEW_ETAG}" fi # Extract the value of the shutdown status from the last line of the response body. SHUTDOWN_STATUS=$(echo "$RESPONSE" | tail -n 1) echo "Metadata changed. New ETag: ${LAST_ETAG}, shutdown-status: '${SHUTDOWN_STATUS}'" if [[ "${SHUTDOWN_STATUS}" == "PENDING_STOP" ]]; then echo "Shutdown signal 'PENDING_STOP' received. Exiting watcher loop." break fi elif [[ "${HTTP_STATUS}" -eq 503 ]]; then # 503 Service Unavailable: wait_for_change timed out with no change. Sleep and loop again. echo "Service temporarily unavailable or request timed out. Retrying in 2 seconds..." sleep 2 continue else # Unexpected HTTP status echo "Warning: Unexpected HTTP status ${HTTP_STATUS}. Retrying in 5 seconds..." sleep 5 fi done # -------------------------------------------------------- # Graceful shutdown commands section # -------------------------------------------------------- echo "Watcher loop exited. Starting graceful shutdown procedures..." # --- ADD YOUR GRACEFUL SHUTDOWN COMMANDS HERE --- echo "Graceful shutdown commands executed." # -------------------------------------------------------- # Signal OS to stop # -------------------------------------------------------- echo "Shutting down the guest OS to turn off the compute instance..." sudo shutdown -h now
Windows
Jika belum, hubungkan ke instance komputasi menggunakan salah satu metode berikut:
Jalankan skrip watcher, atau konfigurasikan untuk dijalankan saat booting, seperti berikut. Tambahkan logika penonaktifan spesifik Anda di tempat yang ditunjukkan:
<# .SYNOPSIS pre-shutdown-script.ps1 #> # -------------------------------------------------------- # Script for graceful shutdown based on the metadata value # -------------------------------------------------------- # # This script monitors the metadata key `shutdown-status` and # waits for its value to change to `PENDING_STOP`. After the script # runs a series of user-defined commands, it runs `Stop-Computer -Force` # to signal to Compute Engine that the shutdown process is # complete. $METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/instance/attributes/shutdown-status" $LAST_ETAG = "0" Write-Host "Starting shutdown status watcher" while ($true) { $Response = $null $HTTP_STATUS = 0 # Wait for the metadata value to change. # The metadata server blocks the request until a change occurs or a timeout is reached. try { $Response = Invoke-WebRequest ` -Headers @{"Metadata-Flavor" = "Google"} ` -Uri "${METADATA_URL}?wait_for_change=true&last_etag=${LAST_ETAG}" ` -TimeoutSec 320 ` -ErrorAction Stop if ($null -ne $Response) { $HTTP_STATUS = [int]$Response.StatusCode } } catch { # Invoke-WebRequest throws an error for non-2xx status codes or connection failures. $Exception = $_.Exception if ($null -ne $Exception -and $null -ne $Exception.Response) { $HTTP_STATUS = [int]$Exception.Response.StatusCode } else { $HTTP_STATUS = 0 } } if ($HTTP_STATUS -eq 0) { Write-Host "Error: Request failed. Retrying in 5 seconds..." Start-Sleep -Seconds 5 continue } if ($HTTP_STATUS -eq 200) { # Read the new etag value to re-subscribe on the next poll. $NEW_ETAG = $Response.Headers["ETag"] if ($null -ne $NEW_ETAG) { $LAST_ETAG = $NEW_ETAG } # Extract the value of the shutdown status from the response body. $SHUTDOWN_STATUS = $Response.Content.Trim() Write-Host "Metadata changed. New ETag: ${LAST_ETAG}, shutdown-status: '${SHUTDOWN_STATUS}'" if ($SHUTDOWN_STATUS -eq "PENDING_STOP") { Write-Host "Shutdown signal 'PENDING_STOP' received. Exiting watcher loop." break } } elseif ($HTTP_STATUS -eq 503) { # 503 Service Unavailable: wait_for_change timed out with no change. Sleep and loop again. Write-Host "Service temporarily unavailable or request timed out. Retrying in 2 seconds..." Start-Sleep -Seconds 2 continue } else { # Unexpected HTTP status Write-Host "Warning: Unexpected HTTP status ${HTTP_STATUS}. Retrying in 5 seconds..." Start-Sleep -Seconds 5 } } # -------------------------------------------------------- # Graceful shutdown commands section # -------------------------------------------------------- Write-Host "Watcher loop exited. Starting graceful shutdown procedures..." # --- ADD YOUR GRACEFUL SHUTDOWN COMMANDS HERE --- Write-Host "Graceful shutdown commands executed." # -------------------------------------------------------- # Signal OS to Halt # -------------------------------------------------------- Write-Host "Shutting down the guest OS to turn off the compute instance..." Stop-Computer -Force
Melihat output skrip shutdown
Linux
Anda dapat melihat output dari skrip shutdown Linux dengan melakukan salah satu hal berikut:
Menghubungkan ke instance dan menjalankan perintah berikut:
sudo journalctl -u google-shutdown-scripts.serviceMelihat output melalui port serial 1 di konsol Google Cloud dan memeriksa peristiwa
google_metadata_script_runner.Desktop IAP dari workstation Windows. Untuk mengetahui informasi selengkapnya, lihat repositori GoogleCloudPlatform/iap-desktop di GitHub.
Windows
Lihat output dari skrip shutdown Windows Server menggunakan salah satu dari yang berikut dan memeriksa peristiwa GCEMetadataScripts:
Port serial 1 di konsol Google Cloud . Untuk mengetahui informasi selengkapnya, lihat Melihat output port serial.
Log Aplikasi Penampil Acara Windows.
Desktop IAP dari workstation Windows. Untuk mengetahui informasi selengkapnya, lihat repositori GoogleCloudPlatform/iap-desktop di GitHub.