Google Cloud Platform(GCP) Compute Engine(仮想マシン)の作成と接続方法

## 目的


- GCPでCompute Engine(仮想マシン)を作成する
- Compute Engineにgcloudコマンドでアクセスする
- Compute EngineにSSHアクセスする

## 前提

- GCPアカウントを所有していること
- macOS
    - HomeBrew Caskがインストールされていること(```gcloud```コマンドで接続したい場合)

## 内容

**この手順に沿ってインスタンスを作成すると､途中まではSSH・RDPが全て(0.0.0.0/0)に開放されています｡**
**意図せず全てに開放されたままにならないようにご注意ください｡**

### Compute Engine の作成

[GCPのダッシュボード](https://console.cloud.google.com/home/dashboard)にアクセスします｡

左メニューから 
　コンピューティング → Compute Engine → [VMインスタンス](https://console.cloud.google.com/compute/instances) 
と選択して [VMインスタンス](https://console.cloud.google.com/compute/instances) の画面にアクセスします｡

画面左上で選択中のプロジェクト名をクリックして､プロジェクトIDを確認します｡これは､後ほど利用するのでメモしておいてください｡
[作成]をクリックします｡
![001.png](https://qiita-image-store.s3.amazonaws.com/0/88753/f846a80b-50a9-2ea9-a4ed-ffe320a29b70.png)
![013.png](https://qiita-image-store.s3.amazonaws.com/0/88753/0ab7f382-f873-5117-170e-1fe26d275f7c.png)
インスタンスの名前はデフォルトの**instance-1**のままにしました｡
右側に常に利用価格が表示されます｡[詳細]をクリックすることで明細を確認できます(表示項目が増える)｡
リージョンとゾーンを選択します｡まずは以下のように理解しておけば大丈夫です｡

- リージョンはゾーンの集合体
- リージョン・ゾーンはリソースが実行される地理的な場所を示す
- リージョン内の通信(ゾーン間通信)はリージョン間ゾーンと比べて高速で低コスト

詳細が気になる方は[リージョンとゾーン](https://cloud.google.com/compute/docs/regions-zones/regions-zones?hl=ja)を確認してください｡
マシンタイプはスペックのことです｡ドロップダウンリストから選択することができ､[カスタマイズ]から表示にないCPUとメモリの組み合わせを作り出すこともできます｡[^1]
![003.png](https://qiita-image-store.s3.amazonaws.com/0/88753/6eef9d52-6256-eae5-8384-feb59f6d73b1.png)
不要なカスタマイズ(同じ価格でより高スペックが使用できる場合)は教えてくれます｡
![004.png](https://qiita-image-store.s3.amazonaws.com/0/88753/c2c017c2-ebed-b58e-3aa0-fe01469005c1.png)
ブートディスクでOS・ディスク容量を設定します｡OSだけでなく､予めアプリケーション(TensorFlowやSQL Serverなど)がインスタンスされたディスクを選択することや自分で作成したイメージを使用することができます｡
また､ディスクは容量の他に標準・SSDのいずれかを選択できます｡
![002.png](https://qiita-image-store.s3.amazonaws.com/0/88753/e68761dd-d487-bc5b-ec1a-8f814c12547f.png)
他の設定についてはデフォルトのままで[作成]します｡インスタンスはすぐ(1分以内)に作成されました｡
![005.png](https://qiita-image-store.s3.amazonaws.com/0/88753/42ef95e5-ee03-1e49-7301-3415c64727b4.png)

## SSH認証鍵の追加

GCPにSSH認証鍵を追加します｡
既存の鍵を使用したい場合は､```google_compute_engine```というファイル名でシンボリックリンクを作って置くと```gcloud```コマンドで接続したい場合に便利です｡

```bash
$ ln -s ~/.ssh/id_rsa ~/.ssh/google_compute_engine
```

GCP用に鍵を作成したい場合は､下記のコマンドを実行してください｡

```bash
# -C コメント
# -f 鍵のファイル名(この場合､google_compute_engineとgoogle_compute_engine.pubが生成される)
$ ssh-keygen -C "username" -f ~/.ssh/google_compute_engine
```

公開鍵の内容をクリップボードにコピーしておきます｡

```bash
$ pbcopy < ~/.ssh/google_compute_engine.pub
```

左メニューから 
　コンピューティング → Compute Engine → [メタデータ(SSH 認証鍵)](https://console.cloud.google.com/compute/metadata/sshKeys) 
と選択して [メタデータ(SSH 認証鍵)](https://console.cloud.google.com/compute/metadata/sshKeys)  の画面にアクセスします｡

[SSH認証鍵を追加]をクリックします｡
![008.png](https://qiita-image-store.s3.amazonaws.com/0/88753/88224727-8309-da2c-594c-a1a9c9dd77c1.png)

公開鍵を貼り付けて登録します｡コメントが無い公開鍵は登録ができません､最後に``` コメント(ユーザ名など)```(半角スペースを挟む必要があります)を追記してください｡**このコメント部分がSSHでログインする場合のユーザー名になります｡**
![009.png](https://qiita-image-store.s3.amazonaws.com/0/88753/bbb36f1d-3344-bc80-9db8-659de2394b7b.png)

## SSH接続

### ブラウザ上から接続

[VMインスタンス](https://console.cloud.google.com/compute/instances) の画面にアクセスします｡
[SSH]を選択し､クリックします｡

![010.png](https://qiita-image-store.s3.amazonaws.com/0/88753/25c0de80-b172-8203-f39b-305781389f7f.png)

ポップアップでコンソールが開きます｡接続完了までに30秒程かかりました｡

![011.png](https://qiita-image-store.s3.amazonaws.com/0/88753/513ac31b-b52d-80ba-a4fb-05d6890fe5c6.png)

### ローカルのTerminalから接続

ローカルのTerminalからSSHコマンドやPuTTYなどで接続もできます｡

```bash
$ ssh -i ~/.ssh/google_compute_engine -l ユーザー名 グローバルIPアドレス
```

ユーザー名はSSH認証鍵を登録したときのコメント部分です｡

## Google Cloud SDK(gcloudコマンド)によるSSH接続

### Google Cloud SDK のインストール

**TerminalからSSHコマンドで接続ができれば良いという方はスキップしてください｡**
Homebrew Caskでインストールします｡

```bash
$ brew cask install google-cloud-sdk
```

プロファイルへの追記を求められるので､使用しているシェルに応じて対応します｡
bashを使用しているので表示された内容を```~/.bash_profile```へ追記しました｡

```bash
(略)
  for bash users
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc'
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc'

  for zsh users
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc'
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc'
(略)
```

追記が完了したら､すぐに適用させたいので```source```コマンドで読み込みます｡

```bash
$ source ~/.bash_profile
```

gcloudの初期設定をします｡

```bash
$ gcloud init
(略)
You must log in to continue. Would you like to log in (Y/n)?  y

Your browser has been opened to visit:

# ブラウザでGoogleアカウントへのログイン画面が開くのでログインする｡

You are logged in as: [ログインしたGoogleアカウント].

# 対象のプロジェクトを選択する

Pick cloud project to use:
 [1] 所有しているプロジェクト名
 [2] Create a new project
Please enter numeric choice or text value (must exactly match list
item):  1

Your current project has been set to: [選択したプロジェクト名].

# デフォルトのリージョン・ゾーンを選択するか

Do you want to configure a default Compute Region and Zone? (Y/n)?  y

Which Google Compute Engine zone would you like to use as project
default?
If you do not specify a zone via a command line flag while working
with Compute Engine resources, the default is assumed.
(略)
 [7] us-central1-c
 [8] us-central1-a
 [9] us-central1-f
 [10] us-central1-b
(略)
 [32] asia-northeast1-b
 [33] asia-northeast1-c
 [34] asia-northeast1-a
(略)
Did not print [3] options.
Too many options [53]. Enter "list" at prompt to print choices fully.
Please enter numeric choice or text value (must exactly match list
item):  7

Your project default Compute Engine zone has been set to [us-central1-c].
You can change it by running [gcloud config set compute/zone NAME].

Your project default Compute Engine region has been set to [us-central1].
You can change it by running [gcloud config set compute/region NAME].

Created a default .boto configuration file at [/Users/ユーザ名/.boto]. See this file and
[https://cloud.google.com/storage/docs/gsutil/commands/config] for more
information about configuring Google Cloud Storage.
Your Google Cloud SDK is configured and ready to use!

* Commands that require authentication will use Googleアカウント by default
* Commands will reference project `選択したプロジェクト名` by default
* Compute Engine commands will use region `us-central1` by default
* Compute Engine commands will use zone `us-central1-c` by default
![012.png](https://qiita-image-store.s3.amazonaws.com/0/88753/0f197f93-e92d-7b80-51cb-c55157d89529.png)

Run `gcloud help config` to learn how to change individual settings

This gcloud configuration is called [default]. You can create additional configurations if you work with multiple accounts and/or projects.
Run `gcloud topic configurations` to learn more.

Some things to try next:

* Run `gcloud --help` to see the Cloud Platform services you can interact with. And run `gcloud help COMMAND` to get help on any gcloud command.
* Run `gcloud topic -h` to learn about advanced features of the SDK like arg files and output formatting
```

### Google Cloud SDK によるSSH接続

プロジェクト名､ゾーン名はデフォルトの設定と一致する場合は､省略することが可能です｡

```bash
$ gcloud compute --project "プロジェクト名" ssh --zone "ゾーン名" "インスタンス名"
```

## ファイアウォールルールでアクセス元を絞る

今回､インスタンスはデフォルトVPCに作成されています｡そのため､全て(0.0.0.0/0)からSSHとRDPが開放されています｡

左メニューから 
　VPCネットワーク → [ファイアウォール ルール](https://console.cloud.google.com/networking/firewalls/list) 
と選択して [ファイアウォール ルール](https://console.cloud.google.com/networking/firewalls/list)  の画面にアクセスします｡

[default-allow-ssh]というルールをクリックします｡

![012.png](https://qiita-image-store.s3.amazonaws.com/0/88753/bdbc4612-9c73-0d3c-fd94-7b97526e64b0.png)

[編集]をクリックして､ソースIPの範囲を許可したい範囲に変更します｡
自分のグローバルIPアドレスを確認したい場合は､下記のコマンドを使うと簡単に取得できます｡

```bash
$ curl -s https://checkip.amazonaws.com
```

![014.png](https://qiita-image-store.s3.amazonaws.com/0/88753/dfe207ca-eb07-1916-9569-ec7a17d56f89.png)

ここで､制限を行うとブラウザからのSSH接続はできなくなります｡(送信元IPのアドレスが異なる為)
許可したい場合は､[Google IP アドレスの範囲](https://support.google.com/a/answer/60764)を元に設定する必要があります｡
(これが､労力に釣り合うかは検証していないです...)

**接続元を絞りたい場合はRDPも同様に設定することを忘れないようにしてください｡**

## あとがき

GCPでのインスタンスの作成から接続までをまとめてみました｡
接続にはブラウザ､SSH､gcloudと3つの方法がありました｡ブラウザ接続は接続元を絞りたい場合は利用に手間がかかりそうですね｡(定期的にSPFレコードから値を取得してきて適用する必要がある)
お勉強で作成した方はインスタンスの停止・削除を忘れないようにしてくださいね!

[^1]: 画像は無料トライアル中の為､最大8コアに制限されています｡