[未経験]GCP初心者がSSH認証を使ってWEBサーバーを立ててみた

趣味でWEBサイトを構築する際に
GCP上にサーバーとドメインを作成してクラウド系の知識も軽く勉強しときたいなという動機
HERE WE GO!!!


今回はトップゲートさんの記事を参考にやりました。ここに至るまでの知識をこの記事にまとめました。
参考:トップゲート
https://www.topgate.co.jp/gcp03-google-compute-engine-launch-instance#google-compute-engine-gce-2

今回の作業の流れはこんな感じ
(1)GCPにログイン
(2)GCEにインスタンスを作成
(3)上記のインスタンスでSSH認証キーを作成し送信
(4)自分のマシン(Mac)でインスタンスにSSH通信
(5)Webサーバーを載せる

(1)に関しては飛ばします。URLに載っています

#インターネットとHTTP通信

どこかのホームページをみるときPCとインターネットはこんな感じで繋がっている
PCとかスマホとかインターネットに繋ぎたいデバイス全部 ⇨ルーター　⇨モデム　
⇨(電話回線もしくは光回線)　⇨ISP事業者　⇨インターネット
*ISP事業者がたくさんいて相互に通信している。これが世界規模になっているのがインターネット

参考URL
https://maven-gathering.com/wp/morph/internet/over-view/#over-view1-1



PCからのリクエストをISP事業者のサーバーが裁く方法

####①DNSサーバ
「おい、www.mafinblog.co.jpというURLのリクエストがHTTP通信で来たぞ。」
「インターネットの中のどのサーバーなのかIPアドレスを教えてあげよう。」
「ドメインの.coを担当しているDNSサーバさんに.mafinblogのIPアドレスを聞いてみよう」
「IPアドレスがわかったのでPCに教えるぜ」

という感じの会話がDNSサーバで行われている(大嘘)

DNSサーバーにアクセスして入力したURLから、通信したいファイルのIPアドレス(インターネット上の数字の住所)を取得する。
URLは「.」で単語が繋がっているが、一度のURLリクエストで、一番右側(.jp)のPCに近いDNSサーバーが目的のサーバのIPアドレスを持つDNSサーバーへ順番に聞いていく。

####②通信規約(プロトコル)の存在
通信したいインターネット上のサーバー(WEBサーバー)のIPアドレスを取得したPCが通信に用いる約束事(プロトコル)である。
WEB上には色んなルールが決まっている。
このルールを統一することで相互通信が可能になっている

PCとWEBサーバーはTCP/IPという通信規約の下で互いに通信を行う。
TCP/IPのTCPとはTrance Controll Protocol で、お互いに通信が届いたかどうかを一々確認しながら通信する
#####安定するけど、遅い規約である。
(UDPという逆の性質を持った規約も存在)

##HTTPとは？
参考　：ネットワークやTCP/IPやHTTPの基本（初学者向け）
https://qiita.com/ryosuketter/items/ba54d595a31f4ad0a58f


TCP/IPの内容は大きく4つの層で成り立つ
・アプリケーション層
・トランスポート層
・インターネット層
・ネットワークインターフェイス層

TCP/IP通信規約の中では、PDUという単位で二進法で信号が送られる(011001101010111...)
その中身は上記の4層である

左から、
ネットワークインターフェース→インターネット→トランスポート→アプリケーション
の内容になっている。
その最後に当たる、アプリケーション層のルールの一つがHTTP規約である。

PCはHTTPリクエストとして信号を送り
WEBサーバーはHTTPレスポンスとしてWEBサイトのHTMLを返してくる

以上がPCからWEBにアクセスするときの仕組みである


#SSHとSSL/TSL
ここまでHTTPの話をしていましたが、SSHとHTTPは全くの別物。
私は最初SSHをHTTP通信を暗号化するのに使うと思ってました

HTTPは丸裸で脆弱なものですが、
これを守るのはSSHではなくSSL/TSLというプロトコルです
本題のSSHは管理社としてサーバにアクセスする際のプロトコルになります。
SSH⇨トランスポート層のプロトコル
HTTP⇨アプリケーション層のプロトコル

##SSHはどこで使うの?
WEBサイトって自分のパソコンではなく遠くのサーバーに置くことが多いです。
そのとき、第三者が自分の作ったサイトを編集できてしまうのを防ぐためのプロトコルがSSHという。

仕組みとしては
①WEBサイトをサーバーに置く際、作成しておいた公開鍵と秘密鍵のうち公開鍵をサーバーに置いて
秘密鍵を自分で所持

②WEBサイトの管理のためにサーバーにログインするリクエストを送る

③サーバー内で公開鍵を使った暗号が作成されて、ユーザに返される

④秘密鍵を使って暗号を解除(複合するという)。答えをサーバーに送る

⑤答えが一致していたらログインして暗号化された通信が行われる

#GCP上にサーバーを立ててみた
以上を踏まえて、
WEBサイトをGCP上に載せるためにサーバーを立ててSSHプロトコルに乗っ取った通信ができるところまで設定します
トップゲートさんのサイトに載っている事をしただけです。
参考：
https://www.topgate.co.jp/gcp03-google-compute-engine-launch-instance#google-compute-engine-gce-2

###目的　東京のリージョンに私のWEBサイトのファイルを保持するサーバーを作成する
リージョン = Googleが所有しているサーバー群
アジアでは東京や台湾にあります

__・クラウド技術__ = リージョンのサーバーのリソースを使って、メモリやらストレージやらパソコンに必要な機能を作成
__・GCP__=それらのサーバーの中で、WEBサイト運用の基盤となる複雑な設定(OSとか)を画面からぽちぽちとするだけで設定させてくれたり,大容量のDBサーバを用意してくれたり__技術的にも時間的にも金銭的にもイニシャルコストが高い技術を安価なランニングコストで実現させてくれるサービスの総称がGCPです。__
(異論がございましたらコメントをください)

作業順序：
__①GCPにインスタンスを設置__
__②WEBサイトに必要なサーバーを作成__
__③SSH認証を行ってログイン__

#GCPにインスタンスを設置していこう
インスタンスとはリージョンの中で作った開発環境のことです。
GCEというIaaSを使えば画面から簡単に作成できます。

プロジェクトの作成は簡単なので飛ばします。
GCEの画面
######1.インスタンスを作る
画面真ん中のインスタンスを作成をクリック
![スクリーンショット 2021-04-25 17.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684559/f66aa46e-b0db-c4a4-2745-26dbaec4a7a8.png)

######2.以下の設定でインスタンスを作る
変更したのは以下
・リージョン
・マシンタイプ
・ブートディスク
・ブートディスクのOS
⇨__!!コマンドの関係でCentOSからUbuntsに変更しています!!
(イメージ:Ubunts16.04LTS)__
・HTTPトラフィックの許可
設定したら一番下の作成ボタンをクリック
![スクリーンショット 2021-04-25 17.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684559/6afae048-b156-ed71-29a7-6f4006596ad6.png)

######3.CloudShell(GCPのターミナル)を使って作成したインスタンスに接続するための設定を行う
Googleアカウントからインスタンスに接続する設定

```$gcloud init```
と入力して

これから
①どのアカウントで
②どのプロジェクトの
③どのリージョン
に対して接続をしたいかを設定します。(詳細は参考URL見てください)
![スクリーンショット 2021-04-25 18.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684559/4fc87050-16a6-a7fb-8ba6-e9fe0a14c0a1.png)
![スクリーンショット 2021-04-25 18.16.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684559/4b84301b-c2d1-5d27-33a1-cfefb1fa29b1.png)

#####4.SSH認証の実装

デフォルトのリージョンを設定した上でこのコマンドを入力
```$gcloud compute ssh instance-1```

ここでなにしてるのかというと
SSHの鍵のペア(公開・秘密)を作成して、ローカルとインスタンスにそれぞれ保存をしてくれます
このコマンドでSSHプロトコルで通信を始めてくれます。

おっと、こんなWarningが
```$Warning: Permanently added 'compute.484314186368217490' (ECDSA) to the list of known hosts.```

__私のPCが持っているSSH証明書に新しいインスタンスの情報を追加しましたよ。__
というもの。
フィンガープリントという、前回接続したインスタンスの情報と今接続したインスタンスの情報が違うから新しい方のインスタンスの情報を登録するねという意味

初めての接続だったから表示されたようです。正常な動作らしいので飛ばします
エラー：
https://www.t3.gsic.titech.ac.jp/node/154


#####5.インスタンスにWEBサーバをぶっこもう
``[tarou@instance-1~]$``
のような表示になったらもうインスタンスとSSH通信ができています。
WEBサーバー(nginx)を追加します。

```$sudo apt-get install nginx```
nginxのインストが終わったらGCEの外部IPアドレスをクリック(ブラウザから飛ぶ)

![スクリーンショット 2021-04-25 17.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684559/0d1ea884-05c9-25d2-bf2a-b46a3f2bf091.png)

WEBサーバーの画面になることを確認して完了!!

![スクリーンショット 2021-04-25 21.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684559/d24d7ae0-e6c3-8a8a-ad96-a66059627abd.png)