EC2のWEBサイトをロードバランサーの配下に再配置し、AWSのSSL証明書を使って暗号化する

# AWSのEC2をELB(ALB)配下にしてSSL化
今までEC2でWEBサーバを立てて公開する際は[let's encrypt](https://letsencrypt.org/ja/ "let's encrypt")をインストールをしていましたが、[AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/ "AWS Certificate Manager")を使用してSSL化をしたいという事でロードバランサ―を使用した構成に移行しつつSSL化をしてみました。
## 前提
・EC2のインスタンスがありWEBサーバが立っている
・ドメインは作成済みでRoute53で管理されている
・VPCはPUBLIC
## 手順
１．[AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/ "AWS Certificate Manager")にてSSL証明書の作成
２．[AWS EC2](https://aws.amazon.com/jp/ec2/ "AWS EC2")にてターゲットグループを生成
３．[AWS EC2](https://aws.amazon.com/jp/ec2/ "AWS EC2")にてロードバランサーを生成
４．[AWS Route53](https://aws.amazon.com/jp/route53/ "AWS Route53")にて対象ドメインにエイリアスにてロードバランサーを設定
５．[AWS EC2](https://aws.amazon.com/jp/ec2/ "AWS EC2")にてhttp(80)アクセス時のリスナーを設定
### [AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/ "AWS Certificate Manager")にてSSL証明書の作成
１．AWSメニューより`AWS Certificate Manager(ACM)`を選択
２．"証明書をリクエスト"にて`パブリック証明書をリクエスト`を選択し次へ
３．SSL化対象となるドメイン名を入力し、検証方法を指定。今回は`DNS検証`を選択。
　　キーアルゴリズムはデフォルト設定のまま。タグは必要に応じて設定しリクエスト
![ACM01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/e4cdfbd0-c63e-ee9b-7476-e9b27e10d98d.png)
４．証明書一覧に戻りリクエストした証明書をクリック（保留中になっている）
５．ドメインの`Route53でレコードを作成`をクリック
![ACM02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/56ebcc1e-a412-3b53-3dc0-f8fb34748044.png)
６．確認画面にてレコードを作成をクリック。
　　この操作にてRoute53にCNAMEレコードが生成され、DNS検証が行われる。
　　検証時間は約5分ほど。検証が完了するとステータスが"発行済み"となる
### [AWS EC2](https://aws.amazon.com/jp/ec2/ "AWS EC2")にてターゲットグループを生成
ロードバランサ―の生成時の際、EC2を指定する事になるがダイレクトに指定するのではなくtargetGroupを選択する形式となる。その為事前に生成しておくと良い。

１．AWSメニューより`EC2`を選択
２．左バーメニューから`ターゲットグループ`をクリック
３．ターゲットグループの生成の画面にて入力を進めていく
【Basic configuration】
　（１）Choose a target type　ターゲットタイプは`Instances`を指定
　（２）Target group name　名前を入力
　（３）Protocol Port　LBとEC2間の通信は暗号化しない為`http(80)`を指定
　（４）VPC　回対象のEC2が乗っかるVPCを選択
　（５）Protocol version　`HTTP1`を選択
【Health checks】
　（６）Health check protocol　`HTTP`を指定
　（７）Health check path　`/`を指定（デフォルト）
４．NEXTをクリックして次画面に遷移するとinstanceの一覧が表示されるので対象のinstanceをチェックする。
５．チェックしたら下記図赤枠の`Include as pending below`をクリックすると下のReview targetsの一覧に追加される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/066b8b85-0a23-6f61-51e2-adc66dd1b02f.png)
６．一覧に追加された状態で`Create target group`をクリックする
### [AWS EC2](https://aws.amazon.com/jp/ec2/ "AWS EC2")にてロードバランサーの生成
１．AWSメニューより`EC2`を選択
２．左バーメニューから`ロードバランサー`をクリック
３．一覧が表示されたら`Create load balancer`をクリック
４．Select load balancer typeになるので`Aplication load balancer`のCleateをクリック
５．次の画面にて入力を進めていく
【Basic configuration】
　（１）Load balancer name 名前を入力
　（２）Scheme　Internet-facingを選択（今回は公開されているEC2をLB配下にする為）
　（３）IP address type　IPv4を選択
【Network mapping】
　（４）VPC　今回対象のEC2が乗っかるVPCを選択
　（５）Mappings　今回対象となるEC2が乗っかるサブネットを選択
　　※２個以選択が必要の為、全部選んでも問題ない
【Security groups】
　（６）Security groups　EC2と同じセキュリティグループを指定
【Listeners and routing】
　ここでルーティングの設定を行う。今回はSSL化が目的なので`https`の通信が発生した場合のリスナーを設定する。
　（７）Protocol/port　`https/443`を指定
　（８）Default action　【２．[AWS EC2](https://aws.amazon.com/jp/ec2/ "AWS EC2")にてターゲットグループを生成】で作成した`targetgroup`を指定する
【Secure listener settings】
　（９）Security policy　デフォルトのまま
　（１０）Default SSL/TLS certificate　`FromACM`を選び、【１．[AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/ "AWS Certificate Manager")にてSSL証明書の作成】で作成したSSL証明書を指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/ac4fe20c-b110-30f7-0869-f7d8a4a3f928.png)
最後に右下の`create load balancer`をクリックするとロードバランサーが生成される（一覧に出てくる）
### [AWS Route53](https://aws.amazon.com/jp/route53/ "AWS Route53")にて対象ドメインにエイリアスにてロードバランサーを設定
１．AWSメニューより`Route53`を選択
２．左バーメニューから`ホストゾーン`をクリック
３．対象のドメインをクリック
４．今回対象EC2のIPが設定されている`Aレコード`を選択し、`レコードを編集`をクリックする
５．下記図のようにエイリアスをONにするとルーティング情報を設定出来るようになる。
　　上から
　　・Application Load Balancer
　　・対象のリージョン
　　・【３．[AWS EC2](https://aws.amazon.com/jp/ec2/ "AWS EC2")にてロードバランサーを生成】で生成したロードバランサ―
　　を指定して`保存`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/981b63b1-f568-e0f6-9168-09a892feda5f.png)

ここまでの設定でEC2をロードバランサ―配下にする作業は完了です。
オマケとして最後にhttp(80)で通信が発生した場合の制御を追加します。
今のままだとhttpアクセス時はNotfondになってしまう為、httpsにリダイレクトさせる設定をLBに追加します。
### [AWS EC2](https://aws.amazon.com/jp/ec2/ "AWS EC2")にてhttp(80)アクセス時のリスナーを設定
１．AWSメニューより`EC2`を選択
２．左バーメニューから`ロードバランサー`をクリック
３．一覧が表示されたら対象のロードバランサーをクリック
４．Listeners（リスナーの一覧）より`Add listener`をクリック
５．`Add Action`にて`Redirect`を選択するとRedirect用の設定項目が表示される
６．下図のように上段のProtocol/Portに`http/80`、下段のProtocol/Portに`https/443`を指定し、`Add`すれば完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/8c165e60-a89c-17ff-cae0-0cde2ff48ee2.png)
これでロードバランサ―がhttp(80)でアクセスされたらhttsp(443)のリスナーにリダイレクトしてくれる。

以上です。