GCEのインスタンスをCloud SDK(gcloud)で追加する


Compute Engineのインスタンス追加はブラウザ上でポチポチやればすぐにできるんですが、
念のためCLIからもできるようにしておきたいので試してみました。

## 前提条件

- Cloud SDKが導入済み
	- [gcp - Google Cloud Platformをローカルから利用するための準備 - Qiita](http://qiita.com/kosuke_nishaya/items/3d9a95f559d0c22d8134)

## プロジェクトの作成

GCEのインスタンスを追加する前に、器になるプロジェクトを作成します。
プロジェクトの作成はブラウザ上で「プロジェクトの作成…」より行います。

プロジェクトの作成を行うと
プロジェクトID("geometric-sled-******"のような形式)が発行されるので
メモっておきましょう。

## ローカルでプロジェクトを初期化

`gcloud init PROJECT_ID` でプロジェクトの初期化を行います

```
$ gcloud init geometric-sled-******
```

PROJECT_IDと同名のプロジェクトディレクトリが作成されるので、
そこで `gcloud config list` を実行すると、
先ほど設定したPROJECT_IDが `project` に設定されているのがわかります。

```
$ cd geometric-sled-******
$ gcloud config list
[core]
account = [アカウント]
disable_usage_reporting = True
project = geometric-sled-******
```

### Cloud Source Repository

ここでちょっと脱線して、Cloud Source Repositoryの紹介。

Developers Consoleから直接編集可能なgitリポジトリで、
GCP専用のGitHubのようなものです。

[Cloud Source Repositories Quickstart - Cloud Source Repositories — Google Cloud Platform](https://cloud.google.com/tools/cloud-repositories/docs/cloud-repositories-quickstart)

先ほど作成したプロジェクトディレクトリの下に `default` というディレクトリがあり、
すでにgitリポジトリが初期化され、リモートのoriginが追加された状態になっています。

適当にファイルを作ってpushしてみます。

```
$ cd default
$ pwd
/Users/user/gcp/geometric-sled-******/default
$ echo "Readme" >> README.md
$ git add 
$ git add README.md 
$ git commit -m "add readme"
$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 216 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Storing objects: 100% (3/3), done.
remote: Processing commits: 100% (1/1), done.
To https://source.developers.google.com/p/geometric-sled-******/r/default
 * [new branch]      master -> master
```

次にDeveloper Consoleの "My Project" のページから、
左ペインの「ソースコード＞閲覧」を選択すると、先ほどpushしたファイルが追加されているのがわかります。

![Kobito.lD865a.png](https://qiita-image-store.s3.amazonaws.com/0/82948/4cff5f44-fb63-016e-242f-5bacf15ba6da.png "Kobito.lD865a.png")

このファイルは、もちろんブラウザ上から編集することも可能です。

## インスタンスの作成

### その前に

利用可能なゾーン、イメージ、インスタンスタイプ等を調べておきたいので、
以下コマンドを使います。

```bash:zones
$ gcloud compute zones list
NAME           REGION       STATUS NEXT_MAINTENANCE TURNDOWN_DATE
asia-east1-b   asia-east1   UP
asia-east1-a   asia-east1   UP
asia-east1-c   asia-east1   UP
...
```

```bash:images
$ gcloud compute images list
NAME                                PROJECT           ALIAS              DEPRECATED STATUS
centos-6-v20150915                  centos-cloud      centos-6                      READY
centos-7-v20150915                  centos-cloud      centos-7                      READY
...
```

```bash:machine-types
$ gcloud compute machine-types list
NAME           ZONE           CPUS MEMORY_GB DEPRECATED
...
f1-micro       asia-east1-c   1     0.60
g1-small       asia-east1-c   1     1.70
n1-highcpu-16  asia-east1-c   16   14.40
n1-highcpu-2   asia-east1-c   2     1.80
n1-highcpu-32  asia-east1-c   32   28.80
...
```

### 作成

今回は `asia-east1` に `centos-7` のイメージを使って 
`g1-small` のインスタンスを `my-instance` という名前で立ててみます。

先ほど作成したプロジェクトのディレクトリ(geometric-sled-******)で、
以下のコマンドを実行します。

```
$ gcloud compute instances create my-instance \
  --zone asia-east1-c \
  --image centos-7 \
  --machine-type g1-small
Created [https://www.googleapis.com/compute/v1/projects/geometric-sled-******/zones/asia-east1-c/instances/my-instance].
NAME        ZONE         MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP     STATUS
my-instance asia-east1-c g1-small                 10.240.*.*  130.*.*.* RUNNING
```

完了すると、作成されたインスタンスの情報が表示されます。

### ログインして確認

接続の前に、都度zoneを指定するのが面倒なので `gcloud config set` を使ってセットしておきます。

```
$ gcloud config set compute/zone asia-east1-c
```

`gcloud auth` で認証済みのユーザ(ここでは仮に `testuser` とします)でログインします。

```
$ gcloud compute ssh testuser@my-instance
Updated [https://www.googleapis.com/compute/v1/projects/geometric-sled-******].
Warning: Permanently added '130.*.*.*' (RSA) to the list of known hosts.
Warning: Permanently added '130.*.*.*' (RSA) to the list of known hosts.
[testuser@my-instance ~]$ 
```

無事ログインできることが確認できます。

## 所感

若干端折られている部分はあるものの、
公式ドキュメントを軽く読めば特に詰まることもなくインスタンスの作成が可能でした。

気軽に使うときはDeveloper Consoleからの操作で事足りるものの、
数が多くなってくるとやはりCLI使えるのが強いんじゃないかと思います。