【Google Cloud (GCP)】Compute Engine のスナップショットを作成

プログラミング

はじめに

この記事では Google Compute Engine のスナップショットの作成を gcloud CLI でおこないます。

スナップショットは、ある時点の永続ディスクから、増分的にデータをバックアップしたものです。スナップショットで現在の状態を取得しておくと、それを使って新しいディスクにデータを復元できるようになります。

また、スナップショットの取得は、毎時、毎日から毎週といった単位でスケジューリングが可能です。

gcloud CLI の実行は、Cloud Shell で行えますし、またインストールすることでローカル環境でも実行することができます。

gcloud CLI をインストールする  |  Google Cloud

この記事で使用したソースコードは次の GitHub から利用できます。

GitHub - Joichiro433/Blog-gcp-snapshot
Contribute to Joichiro433/Blog-gcp-snapshot development by creating an account on 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 
https://www.googleapis.com/compute/v1/projects/your_project/zones/asia-northeast1-a/instances/demo-vm
. 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 RUNNING

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 
https://www.googleapis.com/compute/v1/projects/your_project/zones/asia-northeast1-a/instances/demo-vm-new
. 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 RUNNING

これでスナップショットから 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 でスナップショットのスケジュールを作成する

スナップショットのスケジュールを作成すれば、毎時 / 毎日 / 毎週 単位で自動的にバックアップするためのスナップショットを作成することができます。

手順としては、

  1. スナップショットスケジュールを作成する
  2. 作成したスナップショットスケジュールをバックアップしたいディスクにアタッチする

となります。

スナップショットスケジュールの作成

では、まずスナップショットスケジュールを次の 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}

これでスナップショットスケジュールが作成されました。

スナップショットスケジュール一覧は次のコマンドで確認することができます。

$ 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) にスナップショットをとる』ものとなります。

毎週単位等のその他の設定は公式ドキュメントを参照してください。

Creating scheduled snapshots for persistent disk  |  Compute Engine Documentation  |  Google Cloud

スケジュールをディスクにアタッチ

作成したスナップショットスケジュールをバックアップしたいディスクにアタッチするには、次の 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}

これで対象のディスクが、所定のスケジュールに基づいて自動的にバックアップされます。

次のコマンドで紐づいているスケジュールを確認することができます。

$ 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 コマンドを使用しています。

ディスク スナップショットを作成して管理する  |  Compute Engine ドキュメント  |  Google Cloud

タイトルとURLをコピーしました