GCEで1発Image作成

grasys長谷川です!

GCEでのImage作成はめんどい

VM Instanceに関連付けられているDiskからImageは生成できない!

手順

  1. DiskのSnapshotを取得する
  2. SnapshotからDiskを生成する
  3. 上記で作成したDiskからImageを生成する
  4. 上記でテンポラリで作成したSnapshot, Diskを削除する

ほんとめんどい!

弊社加藤が書いているようにgrasysでは主にTerraformを活用しています。

Terraformを活用する上で、毎回Provisioningを流すのもいいけど
ケースバイケースかつメリット・デメリットあるんでポリシー次第かな・・・

DiskのSnapshotを取得する

Parameter Description Sample
[instance name] Instanceの名前 $HOSTNAME とか?
[snapshot name] Snapshotの名前 temp_snapshot 今存在しない適当な名前でOK
[zone] Instance(というよりDisk)のZone asia-east1-a とか
gcloud compute disks snapshot [instance name] \
      --snapshot-names [snapshot name] \
      --zone [zone]

SnapshotからDiskを生成する

Parameter Description Sample
[disk name] 生成するDiskの名前 temp_disk 今存在しない適当な名前でOK
[snapshot name] Snapshotの名前 temp_snapshot “DiskのSnapshotを取得する”で作成したsnapshot名
[zone] 生成するDiskのZone asia-east1-a とか
[description] 生成するDiskの説明 grasys src disk とか適当でOK
gcloud compute disks create [disk name] \
      --source-snapshot [snapshot name] \
      --zone [zone] \
      --description [description]

上記で作成したDiskからImageを生成する

Parameter Description Sample
[image name] 生成するImageの名前 original_image 今存在しない適当な名前でOK
[disk name] ソースとなるDiskの名前 temp_disk “SnapshotからDiskを生成する”で作成したDisk名
[zone] ソースとなるDiskのZone asia-east1-a SnapshotからDiskを生成する”で作成したDiskのZone
[description] 生成するImageの説明 grasys original image とか適当でOK
gcloud compute images create [image name] \
      --source-disk [disk name] \
      --source-disk-zone [zone] \
      --description [description]

上記でテンポラリで作成したSnapshot, Diskを削除する

Parameter Description Sample
[snapshot name] 生成したsnapshotの名前 temp_snapshot “DiskのSnapshotを取得する”で作成したsnapshot名
[disk name] 生成したDiskの名前 temp_disk “SnapshotからDiskを生成する”で作成したDisk名
[zone] 生成したDiskのZone asia-east1-a “SnapshotからDiskを生成する”で作成したDiskのZone
gcloud compute snapshots delete [snapshot name]
gcloud compute disks delete [disk name] \
      --zone [zone]

めんどい・・・はげしくめんどい!

こんなことやってたら歳取ってしまう

1発で実行する

grasysではrerunというCommand Line Frameworkを利用しています。
rerunについては機会があれば説明しますが
簡単に説明するとModules/Commandsという形で体系的に管理してくれます。

ModulesのDirectoryを別途Gitで管理しており
別のところで作った/利用したrerunにModules化されたCommand群をどこでもgitの更新のみで利用できるようにしています。

ZONE=`curl -s -H "X-Google-Metadata-Request: True" -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/zone | xargs basename`

DATETIME=`date +%Y%m%d%H%M`
SNAPSHOTNAME="${HOSTNAME}-${DATETIME}"
IMAGENAME="${HOSTNAME}-${DATETIME}"
DISKNAME="temporary-disk-${DATETIME}"

gcloud compute disks snapshot ${HOSTNAME} \
  --snapshot-names ${SNAPSHOTNAME} \
  --zone ${ZONE}

gcloud compute disks create ${DISKNAME} \
  --source-snapshot ${SNAPSHOTNAME} \
  --zone ${ZONE} \
  --description "grasys src disk"

gcloud compute snapshots delete --quiet ${SNAPSHOTNAME}

gcloud compute images create ${IMAGENAME} \
  --source-disk ${DISKNAME} \
  --source-disk-zone ${ZONE} \
  --description "grasys src image"

gcloud compute disks delete \
  --quiet ${DISKNAME} \
  --zone ${ZONE}

VM Instanceのscopeに注意!

これで1発で実行できます。

grasysでは上で説明したとおりrerunで管理しているので
今の瞬間のInstanceのImageは以下で取得できます。

rerun gcp-images: current

取得したImageはTerraformに渡すなり
煮るなり焼くなり、Backup的な活用法なり適当に!


Google Cloud Storageで公開バケットとか作って
gcloud sdkとかhomebrewとかtd-agentみたいに
http経由でshellに渡しても良いかもね

shellのcompletionが効かないから不便だし記憶できないし
どっかからshellにコピペするのもめんどくさいので
grasysではやりません