grasys blog
grasysブログ

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を取得する

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

SnapshotからDiskを生成する

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

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

ParameterDescriptionSample
[image name]生成するImageの名前original_image 今存在しない適当な名前でOK
[disk name]ソースとなるDiskの名前temp_disk “SnapshotからDiskを生成する”で作成したDisk名
[zone]ソースとなるDiskのZoneasia-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を削除する

ParameterDescriptionSample
[snapshot name]生成したsnapshotの名前temp_snapshot “DiskのSnapshotを取得する”で作成したsnapshot名
[disk name]生成したDiskの名前temp_disk “SnapshotからDiskを生成する”で作成したDisk名
[zone]生成したDiskのZoneasia-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ではやりません


株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。

株式会社grasys | 採用情報