EC2上のwebサーバをSSL化対応

## 今までの準備

- [Route53でホストゾーンの作成](https://qiita.com/miyuki_samitani/items/0d595ea63b805de1ffa1)
- [EC2インスタンス作成～ログインまで(画像つき)](https://qiita.com/miyuki_samitani/items/2ace2bb5d7874f919676)
- [EC2インスタンス(CensOS7)をwebサーバとして起動しドメインで表示させる](https://qiita.com/miyuki_samitani/items/01d5865864c0f7d5b723)
- [EC2インスタンスのIPアドレスを固定させる](https://qiita.com/miyuki_samitani/items/d9aa05ca8f72a013ce57)

## 今まではSSL化対応していなかった？

以下の画像を見ていただければわかると思いますが、
鍵のマークに赤い斜線がひかれています。
これは安全ではない通信、いわゆるSSL化対応が出来ていないということになります。

![無題 - ペイント 2020-09-17 21.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5b3b2981-9231-1ef1-0343-89a95840b0a4.png)


SSL化対応しているwebページだと以下のように
鍵のマークが表示され、安全な通信だということが記載されます。
今回は以下のようにSSL化対応していきます。

![無題 - ペイント 2020-09-17 21.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/0b4f46ab-a4bc-0aad-5365-776fe691280f.png)


## やること

- ACMでSSL証明書を作成
- ターゲットグループの作成
- ターゲットグループにターゲットを紐付ける
- ロードバランサーの作成
- Route53で設定を変更する
- セキュリティグループの変更


## ACMでSSL証明書を作成

- ACMを探す

ACMとは`SSL/TML証明書のプロビジョニング、管理及びデプロイ` と書いてあるように、SSL証明書を発行してくれるサービスです。

![AWS マネジメントコンソール - Google Chrome 2020-09-17 21.55.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/bbccf8b6-c4b1-3d14-1850-330e71f55348.png)

- 証明書のプロビジョニング

今回は、パブリックな証明書のプロビジョニングを行います。

![AWS Certificate Manager - Google Chrome 2020-09-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/013bf377-adae-30dc-eb7c-956d706eb17b.png)

- 証明書のリクエスト

プライベートではなく、パブリック証明書のリクエストになります。
チェックを入れて証明書のリクエストを行います。

![1AWS Certificate Manager - Google Chrome 2020-09-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/29b6eb8b-d8d7-b96d-b4c3-e45210d1f011.png)

- 検証方法の選択

ざっくりいうと
証明書を発行する際に今申請している人(組織)と発行元のドメインを管理している人(組織)が同一か、というのを見ています。
そのための方法として、以下2つの方法があります。
1. DNS認証
2. Eメール認証

今回DNS認証にした理由とは、
Eメール認証だと`証明書リクエストを行うドメインへメールが送られ`ます。
メール見るだけやろ？って思う方いるかと思いますが、
今このドメイン(`domainname.com`)にはメールを受け取る設定もサーバも立てていません。
また、受け取るユーザも決まっていて`admin`,`postmaster`など決まったユーザしか受け取ることが出来ないのです。
メールサーバ立てるのも少し面倒なので、一旦DNS認証にしました。

DNS認証にすると、`この値(CNAMEレコード)をDNSに書き込んでね`というのが指定されるのでそれをDNSに書き込みます(今回はRoute53)
またRoute53で管理していると、ワンクリックで自動的にレコード入れてくれるのでとても楽です。

ACMのSSL証明書は1年毎の更新ですが、
DNS認証は自動更新になります(例外あり！)
ただし、これから追加するDNSのレコードを消してしまうと更新できないので注意。
メール認証は、毎年メールが送られてきてURLをクリックすると更新されます。
メールなので作業漏れ結構有りなので注意

![2AWS Certificate Manager - Google Chrome 2020-09-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f62847f2-4726-9f9c-3b1e-e4a40e97f57e.png)

- タグは今回設定しません

![3AWS Certificate Manager - Google Chrome 2020-09-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/df98d98b-9b7e-7e49-02e0-fa503f025cc3.png)

- ドメイン名の追加

ここでは、`どんなドメインのSSL証明書を発行するか` をドメイン名の箇所に記載します。
`www.domainname.com`をここでは入れます。

![無題 - ペイント 2020-09-17 21.58.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f8f4787c-4b33-cd21-9967-904a1eab7e4d.png)

- 最終確認

このドメインでこの認証方法でリクエストするよ、と確認されます。
間違っていたら戻って再度修正してください

![無題 - ペイント 2020-09-17 22.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/fa99b148-9aba-1546-bd4c-8ab1ce0ab134.png)

- 検証

証明書のリクエストが完了し、検証に入りました。
DNS認証にしたので、`ドメイン`の箇所にDNSに入れるべきレコードが記載されています。
`Route53でのレコード作成`というボタンがありますが、これが↑で言ってたワンクリックでRoute53にレコードを書き込んでくれるボタンです。

![無題 - ペイント 2020-09-17 22.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/3f2e7430-5c19-7dee-3c48-9c14af9d16bc.png)

- Route53でのレコードの作成

このレコードをホストゾーン`domainname.com`に入れますか？と記載があるので、作成を行います。

![無題 - ペイント 2020-09-17 22.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f9074e20-9c7e-ed65-e412-c1803c1594c1.png)

- 検証が成功に変わる

レコードがRoute53に追加されたら一覧に戻ります。
少し待っていると検証状態が検証保留中から成功に変わります。

![無題 - ペイント 2020-09-17 22.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/e22e1d3d-4610-5529-6336-a55b7379b33b.png)

- 証明書一覧に戻る

証明書一覧に戻ると、作成した証明書が追加されていました。
状況が発行済みになっています。
ここでは証明書の期限など詳細を知ることが出来ます

ちなみに↑でも書きましたが、
DNS認証だと1年後に自動更新がされます。(※DNSのレコードを消しちゃダメだよ！)
メール認証だと毎年メールが来て、作業が漏れることがあるのでDNS認証のほうが楽なのでは？と思います。

![無題 - ペイント 2020-09-17 22.11.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/82f6bcd1-46b4-46bf-0f9f-72a3ff4d5a9e.png)


## ターゲットグループの作成

ターゲットグループとは、後で作るロードバランサーに関係があります。
ロードバランサーとは、ロードバランサーに来たアクセスを紐付いてるサーバに割り振る役割を行います。
その、`紐付いてるサーバのグループ`をターゲットグループと呼びます。
ロードバランサー1つに紐づくターゲットグループは1つになります。

- EC2に進む

ターゲットグループはEC2で作成行います。

![インスタンス _ EC2 Management Console - Google Chrome 201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5fc3ad9a-9b87-e0a0-bc4c-008cf684063d.png)

- ターゲットグループの作成

EC2から左の下の方に`ロードバランシング`というのがあります。
その中にターゲットグループがあり、クリックすると一覧が表示されます(今はなにもないので見えないですが...)
ターゲットグループの作成を行います。

![ターゲットグループ _ EC2 Management Console - Google Chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/e1e5ad94-9950-b354-eea2-4b734fc2889f.png)

- ターゲットグループの詳細設定

ここではターゲットグループの設定を行います。

```
ターゲットグループ名 : targetgrouptest
ターゲットの種類     : インスタンス
プロトコル           : HTTP
ポート               : 80
VPC                  : EC2インスタンスが存在するVPC
ヘルスチェックのプロトコル : HTTP
ヘルスチェックのパス       : /
```

![無題 - ペイント 2020-09-17 22.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/4e5ddea2-e559-310f-0c7d-b82f6741d32f.png)

- 一覧に戻る

一覧に戻るとターゲットグループが表示されます。

![1ターゲットグループ _ EC2 Management Console - Google Chrom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/db4c78d4-ffbd-2318-579d-ce5dba8db1eb.png)


## ターゲットグループにターゲットを紐付ける

先程作成したターゲットグループにwebサーバのEC2インスタンスを紐付けます

- 編集

ターゲットグループにチェックを入れ、編集に進みます

![ターゲットグループ _ EC2 Management Console - Google Chrome1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/fa71b361-891e-d6e1-abab-38d586162a30.png)

- webサーバのインスタンスを追加

1. [インスタンス]の項目で追加するwebサーバにチェックを入れ、
2. 「登録済みに追加」をすると
3. 「登録済みターゲット」にwebサーバのインスタンスが追加されました。

保存を行います。

![無題 - ペイント 2020-09-17 23.06.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f08a972e-43c8-ae9c-72a6-8cee371dfeaa.png)

- 一覧に戻る

保存すると、webサーバが登録済みターゲットに追加されています。
ステータスがunusedなのは、LBにターゲットグループを登録していないのでこの表示になっています。

![無題 - ペイント 2020-09-17 23.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/d308a67c-aa8a-d695-b4b3-164c3ebf5543.png)


## ロードバランサーの作成

いよいよロードバランサー(LB)の追加です。

- ロードバランサーの作成

EC2の左下にロードバランシングがあり、その中にロードバランサーがある
一覧の箇所にロードバランサーの作成があるので、作成を行う

![ロードバランサー _ EC2 Management Console - Google Chrome .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/491fc565-6fcf-bb1f-177b-6aff0e58b9b6.png)

- ロードバランサーの種類の選択

実はロードバランサーには種類があって以下があります。

```
・ ALB : アプリケーションレイヤー
・ NLB : ネットワークレイヤー
・ CLB : アプリケーションもネットワークもOK。だが古い(クラシック)なので上記2つを推奨
```

今回はHTTPSのアクセスなので、ALBにします。

![ロードバランサーの作成 _ EC2 Management Console - Google Chro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f609bd7a-0e84-632b-2c67-05d9941ea01a.png)


- ロードバランサーの設定

```
名前 : loadbalancertest
スキーム : インターネット向け

▼リスナー
HTTP, HTTPS 2つ追加します

▼アベイラビリティーゾーン
VPC : webサーバのあるVPCを選択
アベイラビリティーゾーン : 1つはwebサーバのあるアベイラビリティーゾーン
                        もう１つはどこでもいい(ここの項目は2つ選択しないといけない為。)
``` 
![無題 - ペイント 2020-09-17 23.33.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/172f524f-eb00-cc27-e63d-75d31ce35039.png)


- セキュリティ設定の構成

```
証明書タイプ : ACMから証明書を選択する
証明書の名前 : 先程作成した証明書(www.domainname.com)を選択する
```

![無題 - ペイント 2020-09-17 23.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/6594691d-8a57-b45e-4572-3125e8efd164.png)

- セキュリティの設定

新しいセキュリティグループ作成
セキュリティグループ名はなんでもよい(今回は「loadbarancertestsecuritygroup」)
許可するポートは、80と443でどこからでもアクセス出来るように、0.0.0.0/0, ::/0 を許可する

![100ロードバランサーの作成 _ EC2 Management Console - Google Chro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/89717aec-85e5-aec1-0ada-be49b1e1f031.png)

- ルーティングの設定

↑で作ったターゲットグループを設定
既存のターゲットグループ と ターゲットグループ名さえ入れれば自動的に入る

![1ロードバランサーの作成 _ EC2 Management Console - Google Chro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b1f24892-d4fd-787a-c17b-d9c459b19f52.png)

- ターゲットの登録

ターゲットグループで指定したEC2インスタンスがここに表示される

![無題 - ペイント 2020-09-17 23.43.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/1e39ee42-6bd7-a796-68fc-268894096663.png)

- 確認

今まで設定したものが表示される。
意図していないものが表示された場合には、戻って修正を行う。

![無題 - ペイント 2020-09-17 23.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c6e241c6-0e49-2355-9898-014635aeb26f.png)

- ロードバランサーが作成される

![2ロードバランサーの作成 _ EC2 Management Console - Google Chro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/969d4453-0e72-4e39-f64c-a6ec7e5881e1.png)

- ターゲットの確認

ターゲットグループの一覧からターゲットを確認すると、
LB作成前はunusedになっていたが、
LB作成後はhealthyになり、アクセス出来る状態になった。

![無題 - ペイント 2020-09-18 00.14.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f5deeb2d-8e5b-711c-db82-dd7e7acfcd5b.png)

## Route53で設定を変更する

- Route53のdomainname.comのホストゾーンに移動

![無題 - ペイント 2020-09-19 15.13.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/75a5a74f-cb15-f9bf-ed4c-0bebce5b8ea3.png)

- レコードの編集

`www.domainname.com`のAレコードにチェックを入れ、編集を行う

![無題 - ペイント 2020-09-19 15.15.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/1be7b69f-9586-bffd-602d-8408ffc27243.png)

- 値の変更

`ALBとCLBへのエイリアス` にし、その下の段は`LBがあるリージョン`を指定。
一番下は`LB`を指定します。

![無題 - ペイント 2020-09-19 15.19.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9e26082f-33bb-425d-48a4-ceee1c84f694.png)

- 保存された状態

保存されると、`www.domainname.com` のAレコードはLBに変更されました。

![無題 - ペイント 2020-09-19 15.22.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/dc009e51-0772-4007-0f91-2d80ac1b662f.png)

## セキュリティグループの変更

↑で、実質`www.domainname.com`にアクセスを行うと、
`LB`を通り、`EC2インスタンス`にアクセスが来るように経路を変更することが出来ました。
しかし、ここで問題となっているのが、
EC2インスタンスのセキュリティグループです。
なぜかというと、EC2インスタンスのセキュリティグループは以下のように
自分のPCからしかアクセスできないようになっています。
要するに、ALBからのアクセスも遮断してしまいます。

![無題 - ペイント 2020-09-19 15.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/cedb51cc-d797-b3bc-c27b-9b53df9ef5f0.png)


ですので、ALBからのアクセスのみ許可する変更をします。

- EC2のセキュリティグループを変更

EC2 → セキュリティグループ へ進み、
EC2のセキュリティグループにチェックを入れ、インバウンドを編集します。

このときに、LBのセキュリティグループの`グループID`をメモしておいてください
グループIDは`sg-xxxxxx`と書かれている、↓で言ったら青の枠の箇所になります。

![無題 - ペイント 2020-09-19 15.41.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9be2fcdd-ee23-ebf6-7642-4fd14bba9eea.png)

- 編集

HTTPとHTTPSに書かれていた、自分のIPアドレスを
↑でメモしたグループID(sg-xxxxxx)に書き換えて保存します。

![無題 - ペイント 2020-09-19 15.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/622886f5-0dca-3b22-5770-8c20a5c05f78.png)

- 一覧に戻る

一覧に戻るとHTTPとHTTPSのソースがセキュリティグループ(sg-xxxxxx)に変更されていました。

![無題 - ペイント 2020-09-19 15.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f2e93b5d-c315-df86-5ca5-b7391cd27389.png)

## webで確認

- webで確認

webの検索で`https://domainname.com/index.html`と検索
すると、以下のように鍵がかかった状態でhello worldが表示されましいた。

![無題 - ペイント 2020-09-19 15.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/57431682-977a-29a5-9ec1-e95b72317fa4.png)

- 証明書情報を見る

証明書情報を見ると、Amazonが認証局になり有効期限が来年になっていることが確認できました。

![無題 - ペイント 2020-09-19 15.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/ccb8aff4-50c1-fa95-7da4-8e22e66c94f4.png)

これで、EC2上のwebサーバをSSL化することが出来ました。
LBを利用しているので、アクセス数によって費用がかかります。
費用によっては、きちんと管理いただければと思います。

## 参考

- [EC2へのアクセスをALBからのみに制限する方法](https://tomokazu-kozuma.com/how-to-restrict-access-to-ec-2-only-from-alb/)