---
title: "GCEで1発Image作成 | grasys blog"
url: "https://blog.grasys.io/post/yusukeh/gce_create_images/"
description: "grasys長谷川です！ GCEでのImage作成はめんどい VM Instanceに関連付けられているDiskからImageは生成できない！ 手順 1. DiskのSnapshotを取得する 2. SnapshotからDiskを生成する 3. 上記で作成したDiskからImageを生成する 4. 上記でテンポラリで…"
---

# GCEで1発Image作成

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[yusukeh](/authors/yusukeh/)
-   公開日：2016年9月19日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#Compute Engine](/tags/compute-engine/)[#Google Cloud](/tags/google-cloud/)[#tips](/tags/tips/)

![GCEで1発Image作成](/_astro/ogp.DLHD_yhT_9b6Xu.webp)

grasys長谷川です！

GCEでのImage作成はめんどい

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

## 手順

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

ほんとめんどい！

弊社[加藤が書いているようにgrasysでは主にTerraform](https://blog.grasys.io/post/kyouhei/createinstances/)を活用しています。

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

## DiskのSnapshotを取得する

| Parameter | Description | Sample |
| --- | --- | --- |
| [instance name] | Instanceの名前 | $HOSTNAME とか？ |
| [snapshot name] | Snapshotの名前 | temp_snapshot 今存在しない適当な名前でOK |
| [zone] | Instance（というよりDisk）のZone | asia-east1-a とか |

Plain textcontent\_copy

```
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 |

Plain textcontent\_copy

```
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 |

Plain textcontent\_copy

```
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 |

Plain textcontent\_copy

```
gcloud compute snapshots delete [snapshot name]
gcloud compute disks delete [disk name] \
      --zone [zone]
```

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

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

## 1発で実行する

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

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

Plain textcontent\_copy

```
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は以下で取得できます。

Plain textcontent\_copy

```
rerun gcp-images: current
```

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

* * *

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

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

## この記事を書いた人

[![](/_astro/yusukeh.BvUd2yKE_1mQ6Fp.webp)](/authors/yusukeh/)

### [yusukeh](/authors/yusukeh/)

Fly high. Think deep. Move fast. Go far.🦅

-   [X](https://x.com/yusukeh "X")
-   [GitHub](https://github.com/yusukeh "GitHub")
-   [Medium](https://medium.com/@yusukeh "Medium")
-   [Facebook](https://www.facebook.com/yusuke.exzm "Facebook")
-   [Instagram](https://www.instagram.com/yusukehasegawa/ "Instagram")
-   [LinkedIn](https://www.linkedin.com/in/hasegawa-yusuke-091b4164/ "LinkedIn")

[プロフィールと記事一覧](/authors/yusukeh/)
