iPadから接続出来る環境を無料でGCP上に作ってみた

# 概要
入院中、iPadしか手元に無い状態でお金を掛けずにどうにかして検証(開発)環境を用意したかった人間の備忘録。
GCPで基本的なネットワーク構成を組み、その上にサーバを立て、手元のiPadからターミナルでサーバへSSH接続（踏み台経由）するまでの手順をまとめています。
GCPをちょっと使ってみたいなー、GCPで簡単な開発環境揃えたいなー、クラウド触りたいけど課金が恐い、という方向けの記事です。

# 目次
- 環境
- ネットワーク構成
- 環境構築
  - 新規プロジェクト作成
  - VPC（ネットワーク）作成
  - Cloud NAT作成
  - GCE（踏み台サーバ）作成
  - GCE（検証サーバ）作成
  - Firewall設定
  - SSH認証鍵作成・割当
- 接続確認
  - iPad（Termius）から踏み台サーバへのSSH接続
  - 踏み台サーバから検証サーバへのSSH接続
  - 検証サーバからインターネットへの接続確認

# 環境
<dt>iPad Pro(Model A1701)</dt>
<dd>1台のLinuxサーバさえあればという方は、iOSアプリである“iSH”というLinuxシェル環境のエミュレータアプリがおすすめです。※制約有り</dd>
<br>
<dt>Smart Keyboard(iPad用外付けキーボード)</dt>
<dd>外付けキーボードは必須です。無くても構築出来るけど相当心に余裕がある人じゃないとiPadを叩き割ることになります。</dd>
<br>
<dt>Termius</dt>
<dd>iOS用のターミナルアプリです。各サーバに手元からSSH接続して触りたかった為導入しています。<br>
GCEではブラウザからでもSSH接続し触れますのでお好みで。</dd>
<br>
<dt>Google Cloud Platform(GCP)</dt> 
<dd>数あるクラウドサービスの中で今回なぜGCPにしたかというと、“無料枠が優秀すぎた”為です。<br>
GCE1台だけなら永年無料でサーバを構築することができます。<br>
また、無料枠で登録後3ヶ月間だけ＄300分（約¥30,000）のチャージが付いてくるので、短期で様々なサービスを使いたかった私には丁度良いサービスでした。</dd>

:::note warn
永年無料枠には様々な制約があります。また、この記事で紹介している構成はGCP無料枠登録後の3ヶ月間だけなら無料で使用できますが、その期間以上使用をする場合は有料となるためご注意ください。
:::

<dt>Google Compute Engine(GCE)</dt>
<dd>今回、各サーバとなってくれるGCPサービスです。
サーバのOSやバージョンは以下で構築します。</dd>

| OS | バージョン | CPU | メモリ |
|:-:|:-:|:-:|:-:|
| CentOS7  |  7.9.2009 | 2vCPU | 1GB |
<br>
<dt>Virtual Private Cloud(VPC)</dt>
<dd>GCP内のネットワークサービスです。</dd>
<br>
<dt>Cloud NAT</dt>
<dd>GCPのNATを提供するマネージドサービスで、外部IPを持たないサーバでもインターネットに接続できるようにIPアドレスを変換してくれます。</dd>
<br>
<dt>Cloud Shell</dt>
<dd>デフォルトで存在するブラウザからGCPをコマンドラインで操作出来るツールです。またCloud Shell自体が1つのサーバの機能が備わっている為、簡単な開発環境としても使用できます。</dd>

# ネットワーク構成
![1A2FDDCF-A66A-4419-8050-F6AE94BD814A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/aae70044-7675-dbe7-d14f-8315a2d206fd.jpeg)

- 外部IPアドレスは踏み台サーバにのみ割り当てます。
- 各LinuxサーバへのSSH接続は踏み台サーバを経由して行います。
- 各Linuxサーバからインターネットへの通信はCloud NATでIPアドレスを変換して接続します。

:::note warn
今回、GCPのVPCやNAT機能を見たかった為、踏み台サーバを用意していますが、GCPにはIAP(Cloud Identity-Aware Proxy)と呼ばれる機能があります。これを使用すれば踏み台サーバやCloud NAT無しで直接サーバにSSHやRDP等が可能になります。
:::

# 環境構築

## 新規プロジェクト作成
GCPでは環境構築時にプロジェクトの作成が必要となります。
作成したプロジェクト内に今回の環境を作成していきます。

1. [Google Cloud コンソール]→［ダッシュボード］→［新しいプロジェクト］を選択
2. 任意の名前を入力し［作成］
![B2D5C3AB-9947-4727-BC2D-AD060EE154FB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/bbafbab9-cab6-f08f-7ed3-336893287a63.jpeg)

## VPC（ネットワーク）作成
「Private Subnet」と「Public Subnet」の2つを作成します。
| サブネット | IPアドレス | リージョン |
|:-:|:-:|:-:|
| Public Subnet  | 172.16.0.0/24  | us-west1 |
| Private Subnet  | 172.16.1.0/24  | us-west1 |

1. ［Google Cloud コンソール］→［メニュー］→［ネットワーキング］→［VPCネットワーク］→［VPCネットワーク］→［VPCネットワークを作成］を選択
![94151F6D-46BE-45B1-A17B-2F68A09BC8EA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/1c89de8d-a0e5-a624-194a-6fa37dae0f7f.jpeg)
2. VPCネットワーク名として任意の名前を入力
![5315D104-7958-4C5C-A584-C5011843D974.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/a1528d2b-7982-5ae2-af63-79de5513da42.jpeg)
3. ［サブネットの編集］から「Public Subnet」を作成
![CE625224-EE63-4ABA-8A82-25904C9EB94A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/3fb0dd2c-4b4d-d12a-ba04-c097129c10f3.jpeg)
4. ［サブネットの編集］→［サブネットを追加］から「Private Subnet」を作成
![97B5536D-7B53-40EF-AA24-DA4C6874B0D2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/9c5c4194-ab47-63e4-6662-24313c388a68.jpeg)
5. その他はデフォルト値のまま［作成］を押下
![74892F77-11E4-444E-993C-6CEAE3E9DD50.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/ce920e9b-c9fb-76fb-f7a3-227eec8a97ff.jpeg)

## Cloud NAT作成


## GCE（踏み台サーバ）作成
クライアントから直接SSH接続可能なサーバを「Public Subnet」のネットワーク上に作成します。

| マシンシリーズ | マシンタイプ | OS | バージョン | ブートディスク種類 | ディスクサイズ |
|:-:|:-:|:-:|:-:|:-:|:-:|
| E2  | e2-micro | CentOS  | CentOS7  | 標準永続ディスク  | 30G |

※GCEの永久無料枠のマシン構成の範囲で作成しています。

1. ［Google Cloud コンソール］→メニュー→［Compute Engine］→［VMインスタンス］→［インスタンスを作成］を選択
![91D23EA3-E469-4484-BD3F-CA8989365679.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/bcceb9e9-752d-3712-2210-723508204e7f.jpeg)
2. 任意の名前を入力し、リージョンやマシンの構成を選択
::: note warn
リージョンはVPCで作成したサブネットと同じリージョンを選択する必要があります
:::

![517BC1F0-E53C-487E-94E8-FABC139CDDFE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/0c2fbe5a-e910-a3d8-707e-0abb92a235bd.jpeg)
3. ブートディスクを選択
![E7057DAB-5601-4AF5-B626-5EE16821CBC8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/7f28984e-25c7-4ecd-2a8e-91c56932c166.jpeg)
4. ネットワークを選択
ネットワークタグを設定することでファイアーウォールやルーティングのルールにGCEサーバを適用することが出来ます。

:::note warn
今回サーバに適用するIPアドレスはエフェメラル（＝サブネット内で最小のIPアドレス）を自動で割り当てる設定にしています。マシンの再起動等によってアドレスが変わる可能性があるので、固定としたい場合は内部/外部IPアドレスの予約を行い適用してください。
:::

![9DBBBB33-1653-4AA9-BD59-42CAD75B1238.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/f8d922a1-cbb8-3df8-2186-54a071c06c05.jpeg)
![C67AE518-EF08-412F-A459-D68BF70BB156.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/337308dd-1aa1-61c6-d90f-3e516f3196f1.jpeg)
5. その他はデフォルト値のまま［作成］を押下
![556C576F-AE7C-4671-97AE-81270FC50130.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/0138c257-47d1-0d47-46a9-12a44c011ae3.jpeg)

## GCE（検証サーバ作成）
ネットワーク設定以外は踏み台サーバの作成方法と変わらないため省略します。
ネットワーク設定を以下としてください。（※3台とも）
- 外部IPアドレスは無し
- ネットワークタグは踏み台サーバとは別のタグを作成し適用
- Private Subnetのネットワークを適用
![798AF6FD-4989-4778-B872-A68917EC5DB9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/8efa093d-d9f8-65d3-a76b-88c5ee0e61d1.jpeg)
![E6610CE2-20A9-40BB-AB49-BAF4BEC60DD0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/2338c93f-d07f-f36b-9f55-66dc483d3830.jpeg)

## Firewall設定
デフォルトではネットワーク外部から内部への接続はファイアウォールルールで拒否されるため、必要な通信の許可ルールを作成します。
<br>
<dt>Firewallポリシー</dt>

| 送信元 | 宛先 | プロトコル |許可/拒否 |
|:-:|:-:|:-:|:-:|
| all(インターネット)  | 踏み台サーバ  | TCP/22  | 許可  |
| VPC内ネットワーク  | 検証サーバ  | all  | 許可  |

1. ［Google Cloud コンソール］→［メニュー］→［VPCネットワーク］→［ファイアウォール］→［ファイアウォールルールを作成］を選択
![533BC2CF-7A54-42FF-8DFD-03CEBEA37470.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/51930165-3f84-a498-e08e-1558d4bd62f5.jpeg)
2. インターネットから踏み台サーバへのSSH接続を許可するルールを作成
ネットワークタグは踏み台サーバ作成時に作成したタグを付加します。
![B49DB048-1B75-48D3-8261-198779DF31F4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/0d5a83d4-68ae-e37f-2313-8fc5dddedd69.jpeg)
![8E41CD42-DA7E-4797-B56E-F2385E320BC6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/160fa538-627b-a4de-a63c-3bbf124f453a.jpeg)
3. 同じく［ファイアウォールルールを作成］を選択し、Public Subnet及びPrivate Subnetから検証サーバへの接続を全て許可するルールを作成
ネットワークタグは検証サーバ作成時に作成したタグを付加します。
![9346A600-D6BC-46B8-9465-B78BAD351DC1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/9c5dcb95-1b1b-2136-4186-53920c9659a1.jpeg)
![7BD3456C-F068-4E33-BB0A-09F2F545ED73.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/d345951f-5776-8052-c3b0-c19183293667.jpeg)

## SSH認証鍵作成・割当
GCPでは手元の端末からターミナルを使用してSSH接続し操作するには、SSH用の認証鍵が必要になります。
今回はCloud Shellを使用していますが、SSH鍵を作成できれば何を使用しても問題ありません。

1.［Google Cloud コンソール］→［メニュー］→［Cloud Shell エディタ］→［ターミナルを開く］を選択し Cloud Shellを開く
![4E050C42-11CB-4508-B61F-C15967A6D355.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/b4c9adb9-2722-007e-5da5-83644f9df788.jpeg)
2. SSH鍵を作成するコマンドを入力
```
$ ssh-keygen -t rsa -f ~/.ssh/<SSH鍵名> -C <ユーザー名>
```
- SSH鍵名は任意のもの、ユーザ名は自身のメールアドレス等を指定します。
- コマンド実行後に鍵に設定するパスワードを2回聞かれます。

~/.ssh/内に以下のようなファイルが作成されます。（ファイル名は上記コマンドで付けたSSH鍵名になります）
秘密鍵：ssh-key
公開鍵：ssh-key.pub<br>
3. catコマンド等で上記で作成した鍵の中身を表示しコピーをする
```
$ cat ~/.ssh/ssh-key
$ cat ~/.ssh/ssh-key.pub
```
<br>
4. ［Google Cloud コンソール］→［メニュー］→［Compute Engine］→［メタデータ］→［SSH認証鍵］の編集を選択

![8CF57DE0-5B39-4FF1-8E45-71A573413892.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/942a066f-2fa7-effe-7569-602d3c803480.jpeg)
<br>5. 編集画面に表示されたテキスト入力ボックスに3でコピーした“公開鍵(~.pub)”を貼り付け<br>

# 接続確認
## iPad（Termius）から踏み台サーバへのSSH接続
1. Termiusを開き、[Keychain］→［＋］→［Paste Key］を選択し各値入力
![06F23639-9B54-45F7-A10A-C8EA2EB47BA7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/17f0247f-6678-7cad-ab0f-4445341a7a67.jpeg)
Name：任意の名前
Private：コピーした秘密鍵を貼り付け
Public：コピーした公開鍵を貼り付け
Passphrase：鍵作成時に設定したパスワードを入力

2. ［Hosts］→［＋］→［New Hosts］を選択し各値入力
![58D4A358-0503-4C2F-9524-69D84A321D3C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/9a428f72-6682-e6a4-d74e-f6098b301ca6.jpeg)
Alias：任意の名前
Hostname：踏み台サーバの外部IPアドレス
Use SSH：有効
Username：踏み台サーバのユーザ名※1
Password：無し
Key：1で作成したKeychainを選択

※1 各サーバのSSH用ユーザ名は以下で確認出来ます。
［Google Cloud コンソール］→［メニュー］→［Compute Engine］→［メタデータ］→［SSH認証鍵］→［ユーザ名］
![1B41579E-E9E9-420A-8DDB-F7E91A9037FB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553515/a3e6de0e-12bd-5f7c-f4cf-bbcf50e6a8ec.jpeg)

## 踏み台サーバから検証サーバへのSSH接続

1. 踏み台サーバへ作成したSSH秘密鍵を格納
コピー＆ペースト等で秘密鍵の中身を~/.ssh/フォルダ内に格納します。
```
$ vi ~/.ssh/ssh-key
!!! 秘密鍵を貼り付け !!!
```
<br>
2. 検証サーバのIPアドレスと1で格納した秘密鍵を指定してSSHコマンドを実行

```
$ ssh -i ~/.ssh/ssh-key [ユーザ名]@172.16.1.xx
Enter passphrase for key '/home/xxx/.ssh/ssh-key':[SSH鍵作成時に設定したパスワードを入力] 
```

## 検証サーバからインターネットへの接続確認
Cloud NATが機能し、外部IPアドレスを持たないサーバからもインターネットへ疎通が可能なことを確認します。

```
$ ping 8.8.8.8
$ ping google.com
```
FQDN指定のPingでも疎通可能なので、名前解決も問題ないことが確認できます。

# まとめ
期間限定とはいえ無料である程度の環境を構築出来るのは検証難民としてはとても有難いです。
これでiPadで快適とは言えませんが、環境としては充分揃えられそうです。