grasys長谷川です!
GCEでのImage作成はめんどい
VM Instanceに関連付けられているDiskからImageは生成できない!
手順
- DiskのSnapshotを取得する
- SnapshotからDiskを生成する
- 上記で作成したDiskからImageを生成する
- 上記でテンポラリで作成した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ではやりません