Google Compute EngineでVMを5分で立ち上げて、落とすまで

とっととコマンドラインだけ知りたい人は「本題」をお読みください

必要なもの
-----------

1. [Google account](https://accounts.google.com/SignUp)
2. クレジットカード

前準備
------

ここは5分のうちに入っていません :-p)

といっても、Googleアカウントがあれば、gcutilのインストールも含めて10分程度で準備も完了します

### プロジェクトの作成と課金情報の設定 ###

ここに書いてあります: https://developers.google.com/compute/docs/signup?hl=ja 

1. [Google Developers Console](https://console.developers.google.com/)でGoogle Compute Engineを動かすプロジェクトを作成 (15秒くらい待たされます)
2. 作ったプロジェクトを選択、メニューを[計算処理]-[COMPUTE ENGINE]-[VMインスタンス]と辿り、「課金を有効にする」をクリック
3. 課金情報の設定を行う。内容は後ほど変更可能

※重量制って書いてあるのは、きっとグーグルさんのお茶目 :smirk: 

### gcutilのインストール (for Ubuntu 14.04) ###

ここに書いてあります: https://developers.google.com/compute/docs/gcutil/?hl=ja

```
$ curl https://sdk.cloud.google.com | bash
```

#### google-cloud-sdkインストール時のダイアログ ####

<dl>
<dt>Directory to extract under</dt>
<dd>ここで指定したディレクトリの下に`google-cloud-sdk`ってディレクトリが作成されて、そこにインストールされる<br/>
e.g.) <code>/home/username</code> を指定 → <code>/home/username/google-cloud-sdk</code> にツールがインストールされる<br/>
(google-cloud-sdkを変えたければ、zipからインストールするなりしてくだしあ)</dd>
<dt>Do you want to help improve the Google Cloud SDK (Y/n)?</dt>
<dd>使用状況レポートの送信をしてもいいか？ Y/n<br/>
これは<code>gcloud config --global-only set disable_usage_reporting true|false</code>で後ほど変更可能</dd>
<dt>If you are developing an App Engine application ...</dt>
<dd>App Engine用ランタイムをインストールするための言語を選択<br />
  Compute Engineのみ使うのであれば、4でOKApp Engineを使ってなければ4でOK</dd>
<dt>最後に.bashrc等にPATHの追加と、Bash completionを有効にするか聞いてくる</dt>
<dd>これは任意<br />
ともかく<code>google-cloud-sdk/path.bash.inc</code><code>google-cloud-sdk/completion.bash.inc</code>が読み込まれればいいのです</dd>
</dl>

#### インストールの後作業 ####

```console
$ source ~/.bashrc
$ gcloud auth login --no-launch-browser
Go to the following link in your browser:

https://accounts.google.com/o/oauth2...

Enter verification code:
```

以上で準備完了

### TIPS: gcutil実行時の`--project`引数を省略する方法 ###

`$ gcloud config set project <project-id>`

これでおｋ (gcutilじゃないよ。gcloudだよ)

### TIPS: `gcloud auth login`で付与したアクセス権を取り消す方法 ###

`gloud auth login`で付与したGoogle Cloud SDKのアクセス権を取り消すには、 https://www.google.com/settings/security?hl=ja から[アカウント権限]でGoogle Cloud SDKを選択し、アクセス権を取り消せばOK

### TIPS(?): gcutilのアップグレード ###

既存の`google-cloud-sdk`ディレクトリをrenameなりしておいて、再度`$ curl https://sdk.cloud.google.com | bash`を実行するのが一番手っ取り早いかもしれません。どうなんだろ？

本題 / 5分で立ち上げて落とすまで
--------------------------

sv1というVMを
1. 新規作成して立ち上げて
2. sshログインし
3. シャットダウン後
4. 再度立ち上げる
ところまで

```
$ gcutil addinstance sv1 --machine_type=f1-micro --zone=us-central1-a --image=projects/debian-cloud/global/images/debian-7-wheezy-v20140619
$ gcutil ssh sv1
sv1> exit
$ gcutil deleteinstance --force --nodelete_boot_pd sv1
$ gcutil addinstance sv1 --machine_type=f1-micro --zone=us-central1-a --disk="sv1,boot"
$ gcutil deleteinstance --force --nodelete_boot_pd sv1
$ gcutil deletedisk --force a1
```

※最後にちゃんとdeleteinstance / deletediskしておきましょう。課金されても知らないよ


解説
----

### 初回起動 ###

```
$ gcutil addinstance sv1 --machine_type=f1-micro --zone=us-central1-a --image=projects/debian-cloud/global/images/debian-7-wheezy-v20140619`
```

パラメータに指定できる値は、それぞれ以下で確認できます

<dl>
<dt>--zone</dt>
<dd><code>gcutil listzones</code></dd>
<dt>--machine_type</dt>
<dd><code>gcutil listmachinetypes</code> ※ゾーン別で表示されるので、件数が多いです</dd>
<dt>--image</dt>
<dd><code>gcutil listimages</code></dd>
</dl>

VMが立ち上がりsshログインできるようになるまでに、概ね20秒〜30秒程度です

#### TIPS: インスタンスに埋め込まれるssh鍵を、すでに持っている鍵で使い回したい ####

addinstanceを行った際、`~/.ssh/google_compute_engine}`という鍵をインスタンスに埋め込んでくれます
存在しなければ`WARNING: You don't have an ssh key for Google Compute Engine. Creating one now...`となり、新しく作成されます

既存のid_rsaを使いたければこんな感じ

```
$ cp -p ~/.ssh/id_rsa ~/.ssh/google_compute_engine
$ cp -p ~/.ssh/id_rsa.pub ~/.ssh/google_compute_engine.pub
```

ユーザ名は、公開鍵に入っているコメント部が使用されます。以下の例だとユーザ名は`username`になります

```
ssh-rsa AAAABSADser... username@example.com
```

`+`つきアドレスを使ってる人はご注意


### sshログイン ###

```
$ gcutil ssh sv1
```

IPアドレスを意識することなく、sshでログインできます。IPがわかってれば、`ssh IPADDR`で直接ログインも可能です(あたりまえ)

### シャットダウン ###

```
$ gcutil deleteinstance --force --nodelete_boot_pd sv1
```

シャットダウンは`sudo shutdown`じゃありません。インスタンスの削除となります (後述:GCEのインスタンス運用)

### 再立ち上げ ###

```
$ gcutil addinstance sv1 --machine_type=f1-micro --zone=us-central1-a --disk="sv1,boot"
```

`--image`の代わりに、`--disk`を指定すると、そのディスクで起動します
このディスクは、初回のaddinstanceで作成されたものです


GCEのインスタンス運用
---------------------

起動は`addinstance`、シャットダウンは`deleteinstance`です

deleteinstanceしちゃったら、ディスクとかどうなっちゃうの？と思いますが、永続ディスクは残ってますので、それを指定してインスタンスを作成すれば、結果として再立ち上げとなります。

インスタンス内でshutdownコマンドは使用可能ですが、使うとインスタンスはTERMINATEDとマークされ、まったく使えなくなります

TERMINATEDなインスタンスの特徴は以下の通り

* `deleteinstance`するしかない状態。`resetinstance`も不可能
* リソースは[開放されない](https://developers.google.com/compute/docs/instances#stop_job)
* TERMINATEDなインスタンスは[課金されない](https://developers.google.com/compute/docs/troubleshooting?hl=ja#terminate)


気になる料金
------------

このエントリーを書くために、50分くらい費やしていますが、それで **$0.01** (1円くらい) です

8/22追記:

3円でした


あとがき
--------

gcutilが優秀で、とても使いやすい印象でした

AWSに対する優位性は、この辺にまとまってますので。
[よしづみぶろぐ: AWSよりGoogle Compute Engineを選びたくなる10の理由](http://yoshidumi.blogspot.jp/2014/01/awsgoogle-compute-engine10.html)