本日も乙

ただの自己満足な備忘録。

GCEのMachine images(マシンイメージ)を使ってみた

今年の3月に GCE の Machine images(以下、(マシンイメージ)がベータ版でリリースされたとの発表がありました。個人的にはかなり待ち望んだ機能なのですが、意外と反応が薄い気がします。おそらく GCP を使う人は GKE や Cloud Run、GAE などコンテナメインなのであまり GCE のアップデートに響かないのかもしれません。

cloud.google.com

日本語記事

cloud.google.com

従来のイメージとは何がちがうのか

元々 GCP にはカスタムイメージという機能があります。今回リリースされたのはマシンイメージでカスタムイメージとは別機能として切り出されています。

何が異なるのかを説明する前に、カスタムイメージで何が問題だったのかを説明します。カスタムイメージはディスク単位でイメージをとるため、複数ディスクがアタッチされた GCE インスタンスのイメージが作成できませんでした。そのため、複数ディスクがアタッチされた GCE インスタンスのバックアップをとるときはディスクごとにスナップショットかカスタムイメージを作成する必要がありました。AWS と比較するなら「カスタムイメージ ≒ EBS スナップショット + α(起動に必要な最低限のデータ)」となります。

マシンイメージは GCE インスタンスを包括したイメージを作成します。具体的には以下の情報がマシンイメージに含まれます。AWS と比較するなら「マシンイメージ ≒ AMI + α(メタデータやパーミッションなどの付加データ)」となります。

  • インスタンスプロパティ(マシンタイプ、ラベル*1、ボリュームマッピング、ネットワークタグなど)
  • インスタンスにアタッチされた複数のディスク
  • メタデータ
  • パーミッション(サービスアカウントなど)

ユースケース

バックアップやインスタンスの複製、レプリケーション用途を想定しているとのことです。スナップショット、カスタムイメージ、インスタンステンプレートとの違いがドキュメントにありましたので転載します。

different-from-machine-images
ドキュメントより引用)

現時点(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 ページが表示されることを確認します。

machine-images

machine-images

グローバル 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

マシンイメージの作成

[マシンイメージ]を選択し[マシンイメージを作成]をクリックします。

machine-images

次のように各項目を入力して [CREATE] をクリックします。

項目名
名前 test-instance-backup
説明 (空白)
ソース VM インスタンス test-instance
ロケーション リージョン
ロケーションを選択 asia-northeast1(東京)
暗号化 Google が管理する鍵

しばらく待つとマシンイメージの作成が完了しますので、先ほど作成した待つと test-instance-backup を選択します。

GCE インスタンス作成時に指定したプロパティ(インスタンスタイプ、ネットワークタグ、メタデータなど)が表記されていることが確認できます。

machine-images

マシンイメージから GCE インスタンスを作成

作成したマシンイメージから GCE インスタンスを作成してみます。画面上にある[インスタンスを作成]をクリックします。

必要な情報はすべてマシンイメージから取得されているので、このまま[作成]をクリックします。

machine-images

しばらく待つと下図のように 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:実際に試したらラベルが付与されませんでした。ベータ版なのでバグかもしれません