Google Cloud SDK の導入から、GCE のインスタンスを作成するまで


Google Cloud Platform を使用する際、Web ブラウザ上からだけではなく、コマンドラインから出来ると何かと便利。Cloud SDK を使用すれば実現できます。ここでは、Compute Engine のインスタンスを作成するまでの手順を示します。

# Cloud SDK のインストール

まず、Cloud SDK を PC にインストールします。手順は Document に詳しく記載されているので、そちらをご参照ください。

[参考：クイックスタート](https://cloud.google.com/sdk/docs/quickstarts?hl=ja)

例えば、macOS の場合の流れを要約すると、下記の通りとなります。
1. SDK のダウンロード
2. tarボールを任意の場所に展開
3. 次のコマンドを実行。
```$ ./google-cloud-sdk/install.sh```
4. 次のコマンドを設定し、初期設定を実施。
```$ gloud init```

# 利用できるコンポーネント

次のツールがデフォルトで用意されています。gcloud も、もちろん入っています。
* gcloud
* bq
* gsutil

[参考：Google Cloud SDK](https://cloud.google.com/sdk/docs/overview?hl=ja)

現在のコンポーネントインストール状況を確認するには、次のコマンドを実行します。

```$ gcloud components list```

脱線しますが、例えば kubectl をインストールするには、次のコマンドを実行します。

```$ gcloud components install kubectl```


# gcloud コマンドによるインスタンスの作成

インスタンスを作成する手順をざっくりと示します。なお、gcloud コマンドの詳細は公式リファレンスをご参照ください。

[参考：gcloudリファレンス](https://cloud.google.com/sdk/gcloud/reference/)

### 準備

前提としてプロジェクトを作成し、課金を有効にしておく必要があります。
gcloud コマンドのコンフィグを確認するには次のコマンドを実行します。

```
$ gcloud config list
```

##### プロジェクトの設定

もし、プロジェクトが別のものになっていた場合は、次のコマンドでセットします。

```
$ gcloud config set project プロジェクト名
```

##### ゾーンの設定

次のコマンドで利用できるゾーンの一覧を確認します。

```shell-session
$ gcloud compute zones list
NAME                    REGION                STATUS  NEXT_MAINTENANCE  TURNDOWN_DATE
asia-east1-b            asia-east1            UP
asia-east1-a            asia-east1            UP
...
```

次のコマンドでゾーンを設定します。ゾーン名は「us-central1-a」など。

```
$ gcloud config set compute/zone ゾーン名
```

##### イメージとマシンタイプの確認

利用できるイメージをマシンタイプを確認します。

```shell-session

$ gcloud compute images list
NAME                                                  PROJECT            FAMILY                            DEPRECATED  STATUS
centos-6-v20180104                                    centos-cloud       centos-6                                      READY
centos-7-v20180104                                    centos-cloud       centos-7                                      READY
...
```

```shell-session
$ gcloud compute machine-types list
NAME            ZONE                    CPUS  MEMORY_GB  DEPRECATED
f1-micro        us-central1-f           1     0.60
g1-small        us-central1-f           1     1.70
n1-highcpu-16   us-central1-f           16    14.40
n1-highcpu-2    us-central1-f           2     1.80
n1-highcpu-32   us-central1-f           32    28.80
```

### インスタンスの作成

次のコマンドでインスタンスを作成します。イメージは centos-7 、マシンタイプは最小の f1-micro を指定しています。ディスクサイズ無指定時は10GBとなります。

```shell
$ gcloud compute instances create インスタンス名 ¥
  --image-family centos-7 ¥
  --image-project centos-cloud ¥
  --machine-type f1-micro
```

※ --image エイリアスも使えるのですが、将来削除予定とワーニングが出力されます。

```
WARNING: Image aliases are deprecated and will be removed in a future version. Please use --image-family=centos-7 and --image-project=centos-cloud instead.
```

ちなみに作成にかかる時間を time コマンドで計測すると 16 秒ほどでした。

```
real	0m16.389s
user	0m0.620s
sys	0m0.131s

```

##### インスタンス作成時に有用なオプション

インスタンス作成の際には、他にも有用なオプションがあります。

|オプション|内容|
|---|---|
|--deletion-protection|インスタンスの削除をプロテクト|
|--no-address|グローバルアドレスを付与しない|
|--preemptible|プリエンプティブインスタンスにする|

### インスタンスへのログイン

インスタンスができたのでログインしてみましょう。次のコマンドでログインできます。

```
$ gcloud compute ssh インスタンス名
```

### インスタンスへのオペレーション

インスタンスの利用状況確認、起動、停止、削除などのオペレーションも、gcloud コマンドを通してできます。

##### 利用状況の確認

```shell-session
# インスタンスの一覧
$ gcloud compute instances list
NAME           ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
test-instance  us-central1-a  f1-micro                   10.128.0.2   35.x.x.x       RUNNING
...

# リージョンごとの利用状況
$ gcloud compute regions list
NAME                  CPUS  DISKS_GB  ADDRESSES  RESERVED_ADDRESSES  STATUS  TURNDOWN_DATE
asia-east1            0/8   0/2048    0/8        0/1                 UP
asia-northeast1       0/8   0/2048    0/8        0/1                 UP
...
```

##### インスタンスの起動停止

```shell-session
# インスタンスの起動
$ gcloud compute instances start インスタンス名

# インスタンスの停止
$ gcloud compute instances stop インスタンス名
```

##### インスタンスの削除

```
$ gcloud compute instances delete インスタンス名
```