はじめに
この記事では Google Compute Engine のスナップショットの作成を gcloud CLI でおこないます。
スナップショットは、ある時点の永続ディスクから、増分的にデータをバックアップしたものです。スナップショットで現在の状態を取得しておくと、それを使って新しいディスクにデータを復元できるようになります。
また、スナップショットの取得は、毎時、毎日から毎週といった単位でスケジューリングが可能です。
gcloud CLI の実行は、Cloud Shell で行えますし、またインストールすることでローカル環境でも実行することができます。
この記事で使用したソースコードは次の GitHub から利用できます。
変数の定義
今回使用するコマンドは以下 7つのシェルスクリプトに分けています。
.
├── attach_schedule_to_disk.sh
├── create_snapshot.sh
├── create_snapshot_schedule.sh
├── delete_all.sh
├── params.sh
├── setup_vm.sh
└── setup_vm_from_snapshot.sh
まず、コマンド実行に必要な変数を params.sh
にまとめます。
#!/bin/bash
VM_NAME='demo-vm'
REGION='asia-northeast1'
ZONE='asia-northeast1-a'
MACHINE_TYPE='e2-micro'
IMAGE_PROJECT='ubuntu-os-cloud'
IMAGE_FAMILY='ubuntu-2204-lts'
BOOT_DISK_TYPE='pd-balanced'
BOOT_DISK_SIZE='10GB'
SNAPSHOT_NAME='demo-snapshot'
NEW_VM_NAME='demo-vm-new'
SCHEDULE_NAME='demo-schedule'
START_TIME_UTC='13:00'
MAX_RETENTION_DAYS='3'
スタップショットをとる Compute Engine を作成する
次にCompute Engine を gcloud コマンドで作成しましょう。これは以下 ▼ の記事でも述べています
Compute Engine を次の setup_vm.sh
を実行して作成します。
#!/bin/bash
source ./params.sh
gcloud compute instances create ${VM_NAME} \
--zone ${ZONE} \
--machine-type ${MACHINE_TYPE} \
--image-project ${IMAGE_PROJECT} \
--image-family ${IMAGE_FAMILY} \
--boot-disk-type ${BOOT_DISK_TYPE} \
--boot-disk-size ${BOOT_DISK_SIZE}
## 出力 Created. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS demo-vm asia-northeast1-a e2-micro 10.146.0.16 34.146.195.193 RUNNINGhttps://www.googleapis.com/compute/v1/projects/your_project/zones/asia-northeast1-a/instances/demo-vm
Compute Engine が作成されたら、ssh 接続します。
gcloud compute ssh demo-vm
作成した Compute Engine にログインしたら、確認として、適当なテキストファイルを作成しておきます。
your_username@demo-vm:~$ echo hello! > hello.txt
テキストファイルを作成したら準備完了です。Compute Engine からログアウトします。
your_username@demo-vm:~$ exit
gcloud CLI でスナップショットを作成する
先ほど作成した Compute Engine のスナップショットを作成します。
スナップショットは、Compute Engine を作った時に同時に作成されるディスクからつくられます。
ディスクは次のコマンドで確認することができます。
$ gcloud compute disks list
## 出力 NAME LOCATION LOCATION_SCOPE SIZE_GB TYPE STATUS demo-vm asia-northeast1-a zone 10 pd-balanced READY
このように、先ほど作った Compute Engine と同じ名前のディスクが作成されています。
スナップショットは、インスタンス demo-vm
を停止することなく作成することができます。
次の create_snapshot.sh
を実行してカスタムイメージを作成します。
#!/bin/bash
source ./params.sh
gcloud compute snapshots create ${SNAPSHOT_NAME} \
--source-disk ${VM_NAME}
## 出力 Creating gce snapshot demo-snapshot...done.
これでスナップショットが作成されました。
スナップショット一覧は次のコマンドで確認することができます。
$ gcloud compute snapshots list
## 出力 NAME DISK_SIZE_GB SRC_DISK STATUS demo-snapshot 10 asia-northeast1-a/disks/demo-vm READY
スナップショットから Compute Engine を作成する
先ほど作成したカスタムイメージから Compute Engine を作成してみます。
次の setup_vm_from_snapshot.sh
を実行しましょう。
#!/bin/bash
source ./params.sh
gcloud compute instances create ${NEW_VM_NAME} \
--source-snapshot ${SNAPSHOT_NAME} \
--zone ${ZONE} \
--machine-type ${MACHINE_TYPE} \
--boot-disk-type ${BOOT_DISK_TYPE} \
--boot-disk-size ${BOOT_DISK_SIZE}
## 出力 Created. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS demo-vm-new asia-northeast1-a e2-micro 10.146.0.17 35.200.119.154 RUNNINGhttps://www.googleapis.com/compute/v1/projects/your_project/zones/asia-northeast1-a/instances/demo-vm-new
これでスナップショットから Compute Engine が作成されました。
作成した Compute Engine に ssh 接続してみます。
$ gcloud compute ssh demo-vm-new
ls
コマンドでファイル一覧を確認すると、元となった Compute Engine で作成した hello.txt
ファイルが存在しています。
your_username@demo-vm-new:~$ ls
hello.txt
your_username@demo-vm-new:~$ cat hello.txt
hello!
gcloud CLI でスナップショットのスケジュールを作成する
スナップショットのスケジュールを作成すれば、毎時 / 毎日 / 毎週 単位で自動的にバックアップするためのスナップショットを作成することができます。
手順としては、
- スナップショットスケジュールを作成する
- 作成したスナップショットスケジュールをバックアップしたいディスクにアタッチする
となります。
スナップショットスケジュールの作成
では、まずスナップショットスケジュールを次の create_snapshot_schedule.sh
を実行して作成します。
#!/bin/bash
source ./params.sh
gcloud compute resource-policies create snapshot-schedule ${SCHEDULE_NAME} \
--start-time ${START_TIME_UTC} \
--max-retention-days ${MAX_RETENTION_DAYS} \
--daily-schedule \
--region ${REGION}
## 出力 Created.https://www.googleapis.com/compute/v1/projects/your_project/regions/asia-northeast1/resourcePolicies/demo-schedule
これでスナップショットスケジュールが作成されました。
スナップショットスケジュール一覧は次のコマンドで確認することができます。
$ gcloud compute resource-policies list
## 出力 NAME DESCRIPTION REGION CREATION_TIMESTAMP demo-schedule https://www.googleapis.com/compute/v1/projects/your_project/regions/asia-northeast1 2022-10-22T19:25:31.117-07:00
また、スナップショットスケジュールの詳細は次のコマンドで確認できます。
$ gcloud compute resource-policies describe demo-schedule
## 出力 creationTimestamp: '2022-10-22T19:25:31.117-07:00' id: '4377071229752383732' kind: compute#resourcePolicy name: demo-schedule region: https://www.googleapis.com/compute/v1/projects/your_project/regions/asia-northeast1 selfLink: https://www.googleapis.com/compute/v1/projects/your_project/regions/asia-northeast1/resourcePolicies/demo-schedule snapshotSchedulePolicy: retentionPolicy: maxRetentionDays: 3 onSourceDiskDelete: KEEP_AUTO_SNAPSHOTS schedule: dailySchedule: daysInCycle: 1 duration: PT14400S startTime: 22:00 status: READY
今回作成したスケジュールは、『毎日 UTC時刻 13:00 (日本時刻 22:00) にスナップショットをとる』ものとなります。
毎週単位等のその他の設定は公式ドキュメントを参照してください。
スケジュールをディスクにアタッチ
作成したスナップショットスケジュールをバックアップしたいディスクにアタッチするには、次の attach_schedule_to_disk.sh
を実行します。
#!/bin/bash
source ./params.sh
gcloud compute disks add-resource-policies ${NEW_VM_NAME} \
--resource-policies ${SCHEDULE_NAME} \
--zone ${ZONE}
## 出力 Updated.https://www.googleapis.com/compute/v1/projects/your_project/zones/asia-northeast1-a/disks/demo-vm-new
これで対象のディスクが、所定のスケジュールに基づいて自動的にバックアップされます。
次のコマンドで紐づいているスケジュールを確認することができます。
$ gcloud compute disks describe demo-vm-new
## 出力 architecture: X86_64 creationTimestamp: '2022-10-22T19:15:26.230-07:00' guestOsFeatures: - type: VIRTIO_SCSI_MULTIQUEUE - type: SEV_CAPABLE - type: UEFI_COMPATIBLE - type: GVNIC id: '5974777876790713682' kind: compute#disk labelFingerprint: 42WmSpB8rSM= lastAttachTimestamp: '2022-10-22T19:15:26.230-07:00' licenseCodes: - '5511465778777431107' licenses: - https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/licenses/ubuntu-2204-lts name: demo-vm-new physicalBlockSizeBytes: '4096' resourcePolicies: - https://www.googleapis.com/compute/v1/projects/your_project/regions/asia-northeast1/resourcePolicies/demo-schedule selfLink: https://www.googleapis.com/compute/v1/projects/your_project/zones/asia-northeast1-a/disks/demo-vm-new sizeGb: '10' sourceSnapshot: https://www.googleapis.com/compute/v1/projects/your_project/global/snapshots/demo-snapshot sourceSnapshotId: '8840891540042227923' status: READY type: https://www.googleapis.com/compute/v1/projects/your_project/zones/asia-northeast1-a/diskTypes/pd-balanced users: - https://www.googleapis.com/compute/v1/projects/your_project/zones/asia-northeast1-a/instances/demo-vm-new zone: https://www.googleapis.com/compute/v1/projects/your_project/zones/asia-northeast1-a
作成したリソースの削除
次の delete_all.sh
を実行して、後片付けしましょう。
#!/bin/bash
source ./params.sh
gcloud compute instances delete ${VM_NAME} \
--quiet
gcloud compute instances delete ${NEW_VM_NAME} \
--quiet
gcloud compute snapshots delete ${SNAPSHOT_NAME} \
--quiet
gcloud compute snapshots list --filter=${NEW_VM_NAME} --uri |
xargs gcloud compute snapshots delete \
--quiet
gcloud compute resource-policies delete ${SCHEDULE_NAME} \
--region ${REGION} \
--quiet
ここでは複数のスナップショットを削除するために、xargs
コマンドを使用しています。