背景
最近、L4 が人気なのか、余っていない。どこが空いているか、見つける。 さらに現在のブートディスクからスナップショットを作成して、別のzone で復元し、前のブートディスクを削除する。
チェックスクリプト
#!/bin/bash # チェック対象のゾーン ZONES=("us-west1-a" "us-west1-b" "us-west1-c" "us-central1-c" "us-central1-a" "us-central1-b" ) # プロジェクト ID PROJECT="your-project-id" # 共通パラメータ MACHINE="g2-standard-4" GPU_TYPE="nvidia-l4" IMAGE_FAMILY="ubuntu-2204-lts" IMAGE_PROJECT="ubuntu-os-cloud" for ZONE in "${ZONES[@]}"; do echo "===== Checking zone: $ZONE =====" if gcloud compute instances create test-l4-check \ --project="$PROJECT" \ --zone="$ZONE" \ --machine-type="$MACHINE" \ --accelerator="type=$GPU_TYPE,count=1" \ --image-family="$IMAGE_FAMILY" \ --image-project="$IMAGE_PROJECT" \ --boot-disk-size=10GB \ --maintenance-policy=TERMINATE \ --provisioning-model=STANDARD \ --quiet; then echo "✅ $ZONE: L4 available" # 成功したらすぐ削除 gcloud compute instances delete test-l4-check --zone "$ZONE" --quiet else echo "❌ $ZONE: L4 unavailable" fi echo done
スナップショットコマンド
こんなようなコマンドを使って、利用可能な別のzoneへ移っています 。 移ったあとは、古いインスタンスを削除するとよいでしょう。 (古いブートディスクの削除も忘れずに。下のコマンドの設定ではインスタンスが削除されると自動でブートディスクが削除されます。)
#!/bin/bash # ============================================================ # GCP VM Migration Script # Creates a snapshot of current VM's boot disk # and recreates it in a new zone with auto cleanup. # ============================================================ # ---- 設定 ---- SOURCE_ZONE="us-west1-b" TARGET_ZONE="us-west1-a" PROJECT="your-project-id" VM_BASE_NAME="your-vm-name" BOOT_DISK_TYPE="pd-balanced" MACHINE_TYPE="g2-standard-4" SOURCE_DISK="${VM_BASE_NAME}-${SOURCE_ZONE}" # はじめは、元のマシン名にする必要がある。 TARGET_VM_NAME="${VM_BASE_NAME}-${TARGET_ZONE}" # ---- スナップショット名 ---- SNAPSHOT_NAME="${SOURCE_DISK}-snapshot-$(date +%Y%m%d-%H%M)" echo "🔹 Creating snapshot: ${SNAPSHOT_NAME} from ${SOURCE_DISK} ..." gcloud compute disks snapshot "$SOURCE_DISK" \ --snapshot-names="$SNAPSHOT_NAME" \ --zone="$SOURCE_ZONE" \ --project="$PROJECT" \ --storage-location=us \ --quiet if [ $? -ne 0 ]; then echo "❌ Snapshot creation failed." exit 1 fi # ---- スナップショットがREADYになるまで待機 ---- echo "⏳ Waiting for snapshot to become ready..." while true; do STATUS=$(gcloud compute snapshots describe "$SNAPSHOT_NAME" \ --project="$PROJECT" \ --format="value(status)") if [ "$STATUS" == "READY" ]; then echo "✅ Snapshot is ready." break fi echo " → Current status: $STATUS" sleep 10 done # ---- 新しいVMの作成 ---- BOOT_DISK_NAME="${TARGET_VM_NAME}-boot-$(date +%Y%m%d)" echo "🚀 Creating new VM (${TARGET_VM_NAME}) in ${TARGET_ZONE} ..." gcloud compute instances create "$TARGET_VM_NAME" \ --zone="$TARGET_ZONE" \ --machine-type="$MACHINE_TYPE" \ --boot-disk-type="$BOOT_DISK_TYPE" \ --boot-disk-device-name="$BOOT_DISK_NAME" \ --source-snapshot="$SNAPSHOT_NAME" \ --boot-disk-auto-delete \ --maintenance-policy=TERMINATE \ --restart-on-failure \ --project="$PROJECT" \ --quiet if [ $? -eq 0 ]; then echo "✅ VM created successfully in ${TARGET_ZONE}!" else echo "❌ VM creation failed." exit 1 fi # ---- VMの状態とIPを確認 ---- echo "🔎 Checking VM status and IP..." gcloud compute instances describe "$TARGET_VM_NAME" \ --zone="$TARGET_ZONE" \ --project="$PROJECT" \ --format="table(name,status,networkInterfaces[0].accessConfigs[0].natIP)"