今年の3月に GCE の Machine images(以下、(マシンイメージ)がベータ版でリリースされたとの発表がありました。個人的にはかなり待ち望んだ機能なのですが、意外と反応が薄い気がします。おそらく GCP を使う人は GKE や Cloud Run、GAE などコンテナメインなのであまり GCE のアップデートに響かないのかもしれません。
日本語記事
従来のイメージとは何がちがうのか
元々 GCP にはカスタムイメージという機能があります。今回リリースされたのはマシンイメージでカスタムイメージとは別機能として切り出されています。
何が異なるのかを説明する前に、カスタムイメージで何が問題だったのかを説明します。カスタムイメージはディスク単位でイメージをとるため、複数ディスクがアタッチされた GCE インスタンスのイメージが作成できませんでした。そのため、複数ディスクがアタッチされた GCE インスタンスのバックアップをとるときはディスクごとにスナップショットかカスタムイメージを作成する必要がありました。AWS と比較するなら「カスタムイメージ ≒ EBS スナップショット + α(起動に必要な最低限のデータ)」となります。
マシンイメージは GCE インスタンスを包括したイメージを作成します。具体的には以下の情報がマシンイメージに含まれます。AWS と比較するなら「マシンイメージ ≒ AMI + α(メタデータやパーミッションなどの付加データ)」となります。
- インスタンスプロパティ(マシンタイプ、ラベル*1、ボリュームマッピング、ネットワークタグなど)
- インスタンスにアタッチされた複数のディスク
- メタデータ
- パーミッション(サービスアカウントなど)
ユースケース
バックアップやインスタンスの複製、レプリケーション用途を想定しているとのことです。スナップショット、カスタムイメージ、インスタンステンプレートとの違いがドキュメントにありましたので転載します。
(ドキュメントより引用)
現時点(2020年6月)ではインスタンステンプレートにマシンイメージを選択できないため、マシンイメージをゴールデンイメージとして複数のインスタンスを作成する用途に限られるようです。
マシンイメージを試してみる
実際にマシンイメージを試してみました。
GCE インスタンスの起動
まず、マシンイメージをつくる素となる GCE インスタンスを作成します。以下のようなコマンドで作成します。<プロジェクト名>
やサービスアカウント名は適宜修正ください。
$ gcloud beta compute instances create test-instance \ --zone=asia-northeast1-a \ --machine-type=custom-2-4096 \ --min-cpu-platform="Intel Skylake" \ --subnet=default \ --service-account=123456789012-compute@developer.gserviceaccount.com \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=http-server \ --metadata=env=prod,startup-script='#! /bin/bash # Installs apache and a custom homepage sudo su - apt-get update apt-get install -y apache2 cat <<EOF > /var/www/html/index.html <html><body><h1>Hello World</h1> <p>This page was created from a simple start up script!</p> </body></html> EOF' \ --image=ubuntu-1804-bionic-v20200529 \ --image-project=ubuntu-os-cloud \ --boot-disk-size=10GB \ --boot-disk-type=pd-standard \ --boot-disk-device-name=test-instance \ --create-disk=mode=rw,size=10,type=projects/<プロジェクト名>/zones/asia-northeast1-a/diskTypes/pd-standard,name=extent,device-name=extent \ --no-shielded-secure-boot \ --shielded-vtpm \ --shielded-integrity-monitoring \ --labels=application=apache \ --reservation-affinity=any \ --network-tier=PREMIUM \ --maintenance-policy=MIGRATE \ --project=<プロジェクト名>
起動スクリプトによって起動時に Apache をインストールするようにします。また、次の付加情報をつけています。
- 追加ディスク:10GB(extent)
- ラベル:
application : apache
- メタデータ:
env : prod
- ネットワークタグ:
http-server
実行後しばらく待つと GCE コンソールで下図のように表示されますので、赤枠で囲ったグローバル IP アドレスをクリックして Web ページが表示されることを確認します。
グローバル IP アドレスの横にある[SSH]をクリックして GCE インスタンスにログインし、追加したディスクを自動マウントするように設定します。
$ sudo su - % mkfs -t ext4 /dev/sdb % echo '/dev/sdb /extent ext4 defaults,nofail 0 2' >> /etc/fstab % mount -a % df -h | grep extent /dev/sdb 9.8G 37M 9.3G 1% /extent
マシンイメージの作成
[マシンイメージ]を選択し[マシンイメージを作成]をクリックします。
次のように各項目を入力して [CREATE] をクリックします。
項目名 | 値 |
---|---|
名前 | test-instance-backup |
説明 | (空白) |
ソース VM インスタンス | test-instance |
ロケーション | リージョン |
ロケーションを選択 | asia-northeast1(東京) |
暗号化 | Google が管理する鍵 |
しばらく待つとマシンイメージの作成が完了しますので、先ほど作成した待つと test-instance-backup
を選択します。
GCE インスタンス作成時に指定したプロパティ(インスタンスタイプ、ネットワークタグ、メタデータなど)が表記されていることが確認できます。
マシンイメージから GCE インスタンスを作成
作成したマシンイメージから GCE インスタンスを作成してみます。画面上にある[インスタンスを作成]をクリックします。
必要な情報はすべてマシンイメージから取得されているので、このまま[作成]をクリックします。
しばらく待つと下図のように test-instance-backup-1
というインスタンスが作成されるので赤枠のグローバル IP アドレスをクリックして Web ページが表示されることを確認します。
グローバル IP アドレスの横にある[SSH]をクリックして GCE インスタンスにログインし、追加ディスクがマウントされていることを確認します。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 55M 1 loop /snap/core18/1754 loop1 7:1 0 93.9M 1 loop /snap/core/9066 loop2 7:2 0 115M 1 loop /snap/google-cloud-sdk/133 sda 8:0 0 10G 0 disk ├─sda1 8:1 0 9.9G 0 part / ├─sda14 8:14 0 4M 0 part └─sda15 8:15 0 106M 0 part /boot/efi sdb 8:16 0 10G 0 disk /extent
まとめ
本記事では新しくリリースされたマシンイメージについての説明と作成方法について紹介しました。個人的には待ち望んでいた機能ですが、カスタムイメージにあったイメージファミリーやインスタンステンプレートへの組み込みがあるともっと嬉しいです!
参考文献
*1:実際に試したらラベルが付与されませんでした。ベータ版なのでバグかもしれません