[GCP]無料枠を利用してHTTPS対応のWEBサイトを作成する

# 概要

本書ではGCPの無料枠(f1.micro)を利用して、CentOS8の立ち上げや独自ドメイン適応、Let's Encrypt
を利用したSSL証明書の発行(HTTPS対応)を実施します。

## 前提条件
* GCPのアカウントを作成していること。
* お名前.comなどで独自ドメインを取得していること。(.workドメインは1円(お名前.com)で購入できます)
* 本書ではPCはMacBookAir2019,ターミナルソフトはiTerm2を使用して検証・執筆しました。
* 本書で使用したCentOSのバージョンは下記の通りです。

```
$ cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
```

## 1. CentOSの立ち上げ

1. GCPにログインし、左側メニューから「Compute Engine」→「VMインスタンス」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/a1d266df-190b-be02-1466-0d4534c5f211.png)

2. 「作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/0c3a3d57-876f-5da9-ee2a-7d71a98c8432.png)

3. VMインスタンス作成画面が表示される。下記の内容を選択し、「変更」をクリックする。
 * 名前 : マシン名
 * リージョン : us-central1 (アイオワ)
 * マシンタイプ : f1-micro
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/3061cdbf-ab01-743a-4b4e-145581a230b6.png)

4. OS選択画面が表示される。下記の内容を入力し、「選択」をクリックする。
 * オペレーティングシステム : CentOS
 * バージョン : CentOS8
 * ブートディスクの種類 : 標準の永続ディスク
 * サイズ(GB) : 30
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/59f0abff-c90b-021a-2a8d-f12305a5b06b.png)

5. 「HTTPトラフィックを許可する」「HTTPSトラフィックを許可する」にチェックを入れる。その後、設定内容に問題がなければ「作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/8ec0a96e-7ee8-e2db-5e22-8c14aef6dda5.png)

6. VMインスタンスが作成されたことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/f032cf72-ebdf-cc7b-4ee0-c27abab4357a.png)

7. 縦の3点リーダーをクリックし、「ネットワークの詳細の表示」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/bef8c986-5f8a-1e2b-04e7-8c9e4483a993.png)

8. 左側メニューから「外部IPアドレス」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/8a932bd3-2866-fd09-f659-35eb9208a88f.png)

9. 「静的アドレスを予約」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/a0afea41-ed73-ca0b-97c1-3e3cbdd74a50.png)

10. 静的アドレス予約画面が表示される。下記の内容を選択し、「予約」をクリックする。
 * 名前 : 予約する静的アドレスの名前
 * 説明 : 予約する静的アドレスの説明
 * リージョン : us-central1 (アイオワ)
 * 接続先 : 作成したVMインスタンス名
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/3fee143f-05d7-ffde-9765-266d3a6c2b5f.png)

11. 静的アドレスが適応されたことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/1e5febec-7fec-ee42-8553-4b4ba6a09a5a.png)

## 2. CentOS8への接続

GCPでは公開鍵認証方式でVMインスタンスにログインします。秘密鍵や公開鍵は自端末で作成する必要があり、作成した公開鍵はGCPに登録します。その後、自端末で作成した秘密鍵を使用してSSH接続を実施します。

### 2-a. 秘密鍵/公開鍵の作成

1. iTerm2を立ち上げ、下記のコマンドを実行し認証鍵を作成する。またコマンド実行時にパスワードが求められるが、パスワードを入力せずにEnterをクリックする。

    ```
    % sudo ssh-keygen -t rsa -f ~/.ssh/認証鍵の名前 -C ユーザー名
    ```

2. 下記のコマンドを実行し、`~/.ssh`に認証鍵が作成されたことを確認する。

    ```
    % sudo ls -la ~/.ssh
    ```

### 2-b. GCPへ公開鍵の登録

1. 下記のコマンドを実行し、公開鍵の内容を表示する。その後、ターミナルに表示された公開鍵の内容を全てコピーする。

    ```
    % sudo cat ~/.ssh/公開鍵
    ```

2. VMインスタンス画面に戻り、VMインスタンスの名前をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/c3df9174-2e8c-93dc-33cc-165b93a3a589.png)

3. VMインスタンスの詳細画面から、上部メニューの「編集」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/f73bb609-6916-0437-a2f1-2e011c859947.png)

4. 下側にスクロールし、SSH認証鍵から「表示して編集する」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/c8689ef4-629a-46f7-85d8-4238e6e14be6.png)

5. コピーした公開鍵の内容を貼り付け、「保存」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/2a4b8f33-e7c3-1ff5-90f8-d85878c84a39.png)

6. 公開鍵の更新後、iTerm2に戻る。下記のコマンドを実行し、VMインスタンスにログインする。

    ```
    % sudo chmod 400 ~/.ssh/秘密鍵
    % sudo ssh -i ~/.ssh/秘密鍵 ユーザー名@VMインスタンスの外部IPアドレス -p 22
    ```

7. VMインスタンスにログインできたことを確認するために、下記のコマンドを実行する。

    ````
    $ uname -n
    $ whoami
    ```

## 3. Apatcheのインストール

1. 下記のコマンドを実行し、Apacheをインストールする。

    ```
    $ sudo dnf install httpd
    ```

2. 下記のコマンドを実行し、Apatcheを起動する。

    ```
    $ systemctl start httpd
    ```

3. 下記のコマンドを実行し、Apacheの自動起動を設定する。

    ```
    $ systemctl enable httpd
    ```

4. ブラウザを開き、`http://VMインスタンスのIPアドレス`に移動し、Apacheの初期画面が表示されていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/56645574-eb1b-9347-17eb-0bcc3ba544e3.png)

## 4. 独自ドメインの設定

1. 左側メニューから「VPCネットワーク」→「Cloud DNS」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/3aa58cb6-1ce3-ec1e-802e-1fac6198b5a1.png)

2. 「ゾーンを作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/5ee01151-ef59-e9ac-9c08-559f66e2a8db.png)

3. DNSゾーンの作成画面が表示される。下記の内容を入力し、「作成」をクリックする。
 * ゾーンのタイプ : 公開
 * ゾーン名 : 作成するDNSゾーンの名前
 * DNS名 : 取得した独自ドメイン名
 * DNSSEC : オフ
 * 説明 : 作成するDNSゾーンの説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/54666aa6-9d06-c27c-29d1-348751a5577c.png)

4. サブドメインを作成するため、「ADD RECORD SET」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/745828df-176c-fa13-645c-4643bd859077.png)

5. レコードセットの作成画面が表示される。下記の内容を入力し、「作成」をクリックする。
 * DNS名 : サブドメイン名を入力
 * IPv4アドレス : VMインスタンスの静的外部IPアドレス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/13f32428-53b9-ead5-2ec9-a64eed8aad78.png)

6. 登録したドメインのNSレコードを全てテキストエディターなどにコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/571d49c6-2e9b-8580-c961-b03ae50673a5.png)

7. お名前.comなど、独自ドメインを取得したサイトでコピーしたNSレコードを貼り付けて設定を保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/88d0212e-a606-912d-3413-fcafc305e754.png)

8. ブラウザで`http://サブドメイン名`に移動し、ドメインが浸透したことを確認する。サブドメインに移動できない場合は、ドメインが浸透するまで一定時間待機する。

9. 下記のコマンドを実行し、ドメイン名からIPアドレスが調べられるか確認する。

    ```
    $ sudo dnf install bind-utils
    $ host サブドメイン名
    ```

## 5. HTTPS対応設定

1. 下記のコマンドを実行し、certbot-auto(Let's EncryptでSSL証明書を発行するプログラム)を実行するために必要なパッケージをインストールする。

    ```
    $ sudo dnf module install python36
    $ sudo dnf install gcc mod_ssl python3-virtualenv redhat-rpm-config augeas-libs libffi-devel openssl-devel
    ```

2. 下記のコマンドを実行し、certbot-autoを取得する。

    ```
    curl -O https://dl.eff.org/certbot-auto
    ```

3. 下記のコマンドを実行し、取得したcertbot-autoを`/usr/local/bin`に移動する。

    ```
    $ sudo mv certbot-auto /usr/local/bin/certbot-auto
    ```

4. 下記のコマンドを実行し、certbot-autoの権限を変更する。

    ```
    $ sudo chown root /usr/local/bin/certbot-auto
    $ sudo chmod 0755 /usr/local/bin/certbot-auto
    ```
5. 下記のコマンドを実行し、`/etc/httpd/conf/httpd.conf`にVirtualHostを末尾に追記する。

    ```
    $ sudo vi /etc/httpd/conf/httpd.conf
    NameVirtualHost *:80
 
    <VirtualHost *:80>
    ServerAdmin root@サブドメイン名
    DocumentRoot /var/www/html
    ServerName サブドメイン名
    </VirtualHost>
    ```

6. SSL証明書を発行するため、下記のコマンドを実行してApacheを停止する。

    ```
    $ systemctl stop httpd
    ```

7. 下記のコマンドを実行し、SSL証明書を発行する。コマンド実行後、対話式形式でメールアドレスやドメイン名などを入力するように求められるので、ターミナルに表示される説明文に従って入力する。

    ```
    $ sudo /usr/local/bin/certbot-auto
    ```

8. certbot-autoコマンドが成功するとSSL証明書が発行される。ターミナルに表示されている発行された証明書ファイルの保存先を確認する。
 
    ```
    $ sudo ls -la /etc/letsencrypt/live/サブドメイン名
    ```

9. 下記のコマンドを実行し、SSL証明書を更新するコマンドが実行できるか確認する。

    ```
    $ sudo /usr/local/bin/certbot-auto renew
    ```

10. SSL証明書を更新するコマンドが実行できることを確認後、下記のコマンドを実行してCronで自動更新するように設定する。

    ```
    $ sudo crontab -e
    * 1 1 * * sudo /usr/local/bin/certbot-auto renew && sudo systemctl reload httpd
    ```

11. 下記のコマンドを実行し、`/etc/httpd/conf.d/ssl.conf`に証明書ファイル場所を記載する。

    ```
    $ sudo vi /etc/httpd/conf.d/ssl.conf
    SSLCertificateFile /etc/letsencrypt/live/サブドメイン名/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/サブドメイン名/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/サブドメイン名/chain.pem
    ```

12. 下記のコマンドを実行し、Apacheを起動する。

    ```
    $ sudo systemctl start httpd
    ```

13. ブラウザに`https://サブドメイン名`を入力し、Let's EncryptのSSL証明書が登録されていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/0c53dc94-4371-dea1-23c8-6751b122e056.png)

## 最後に

GCPの無料枠を利用することでWEBサイトを開設することができます。またLet's Encryptの設定を実施することでHTTPS対応のWEBサイトを開設することができます。これによってHTTPS対応したホームページの運営やポートフォリオの作成などができます。