AWS EC2上のアプリのhttpリクエストをhttpsにした【初学者】

# はじめに
プログラミングスクール卒業時にオリジナルアプリケーションを作成しましたが、発表時にはまだまだ多くの課題が残っていました。その中でも、AWSにデプロイした際にhttpのままで、安全ではない通信、いわゆるSSL化対応が出来ていないということになりhttps対応をしたいと思い調べて対応した備忘録になります。
下記のさまざまなサイトを参考にさせていただきました。ありがとうございました。
各項目の詳細は今後勉強していきますので今回は手順のみ簡単に記載したいと思います。

# 参考記事
- [EC2上のwebサーバをSSL化対応](https://qiita.com/miyuki_samitani/items/1734dc13c6b7af601bd9)
- [[初心者向け]AWS Certificate Managerを使用してインターネットからELBへの通信をHTTPS化してみた](https://dev.classmethod.jp/articles/for-begginer-ssl-communication-by-aws-certificate-manager/)
- [【AWS解説】SSL証明書を取得してブログをhttps通信化する方法](https://hiyowa-na-engineer.com/aws-wordpress-ssl-certificate/)
- [【AWS手順解説】ロードバランサー作成とドメインの設定](https://hiyowa-na-engineer.com/aws-wordpress-how-to-alb/)
- [【AWS画像付き解説】HTTPリクエストをHTTPSにリダイレクトする方法](https://hiyowa-na-engineer.com/aws-alb-how-to-redirect/)

# 前提
今回はRuby on Railsでアプリを作成しAWSへデプロイ済みです。
（EC2-ElasticIP-ドメイン名）で紐付けしています。

ドメインは[お名前.com](https://www.onamae.com/)さんで取得しています。




# http・httpsとは？
> httpとは「Hyper Text Transfer Protocol（ハイパーテキスト・トランスファー・プロトコル）」の略で、Webサイトを環境に依らず問題なく表示するための通信規格（プロトコル）のことです。
URLの最初の部分で「http\://～」と記載されています。
httpsとは、「Hypertext Transfer Protocol Secure（ハイパーテキスト・トランスファー・プロトコル・セキュア）」の略で、SSL（暗号化通信）によってセキュリティを高めたhttpのことです。
httpsにすることで、通信経路での第三者による情報の盗聴や改ざんのリスクを防止できます。


引用：[
httpsとは？　httpとのちがいやセキュリティ上の意味を初心者向けに解説！](https://ds-b.jp/media/what-is-https/)

# 実施内容
- SSL証明書の取得
- ロードバランサーの作成
- ドメインとロードバランサーの紐付け
- http通信をhttps通信へリダイレクト

# SSL証明書の取得
まずは、https通信をするために「SSL証明書」を取得します。
AWSにログインし、**「Certificate Manager」** を検索します。![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/a413c84c-8df0-2d66-593a-b5690c5dea08.png)
すると下記のような画面になるので **「証明書をリクエスト」** をクリック
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/e0cc9ee8-2e1e-90c1-3330-5c478853d2da.png)

証明書タイプは **「パブリック証明書をリクエスト」** を選択
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/c635d1f2-926d-9431-3900-3ba865cb319b.png)


**「ドメイン名」** には取得したドメイン名を入力します。
**「検証方法を選択」** では「DNS検証」を選択します。
**「タグ」** については自分は特に設定しませんでした。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/52305d5b-8781-164e-a3b9-1d0de2e1e927.png)

リクエストをしてしばらくするとステータスが **「発行済み」** に変わります。
その後 **「Route53でレコードを作成」** を押します。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/30997063-45c0-6f2a-5cfc-9940f5c4d817.png)

# ロードバランサーの作成
一度「EC2ダッシュボード」に戻り、左側メニュー内にある **「ロードバランサー」** をクリック
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/51731eec-d933-996c-05d6-500665a8d2d6.png)
**「ロードバランサーの作成」** をクリック
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/6069e36c-12b3-cb36-eadd-ba09e7956c21.png)

この中の **「Application Load Balancer」** の **「Create」** をクリック
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/1a418328-c0bc-1db4-66f4-2f843dc8f6d7.png)

### Create Application Load Balancer
「Create Application Load Balancer」のページに遷移しますので下記の４項目についてそれぞれ設定をしていきます。
- Basic configuration
- Network mapping
- Security groups
- Listeners and routing

#### Basic configuration
**「Load balancer name」** はわかりやすいように``アプリ名LoadBalancer``としました。あとはデフォルトのままですが写真のように設定しています。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/c4264424-5fec-3b50-b082-e28536766e70.png)

#### Network mapping
「VPC」はデフォルトのままとし、「Mappings」は2つは設定しなければならないので``ap-northeast-1a``と``ap-northeast-1c``を選択しました。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/697afc6f-b44d-70b9-c388-0accd808c248.png)

#### Security groups
**「Create new security group」** を選択し新たにセキュリティグループを作成し、作成したセキュリティグループを選択しました。（後述）
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/7a4bef22-89f4-a903-9488-9c2e91c8cb4a.png)

#### セキュリティグループを作成
**「セキュリティグループ名」** はわかりやすく``LoadBarancerSecurityGroup``とし、**「説明」** にもわかりやすいように``LoadBarancerSecurityGroup``と記載しました。**「VPC」** にはデフォルトで表示されているままにしています。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/9e8e91b9-14e3-67d2-640f-425ae5b23ff0.png)
**「インバウンドルール」「アウトバウンドルール」** はそれぞれ下記のように設定しました。
#### インバウンドルール
- インバウンドルール１ 
``タイプ：HTTP``
``ソース：0.0.0.0/0``
- インバウンドルール２
``タイプ：HTTPS``
``ソース：0.0.0.0/0``
を設定しました。
#### アウトバウンドルール
- アウトバウンドルール１ 
``タイプ：HTTP``
``ソース：0.0.0.0/0``
- アウトバウンドルール２
``タイプ：HTTPS``
``ソース：0.0.0.0/0``
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/b2390b7d-776c-dbe2-47ee-ebeac205e488.png)
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/4655bd44-8369-ca08-ef4a-703b55d94610.png)
そして、**「セキュリティグループを作成」** を押して作成。



#### Listeners and routing
「Protocol」は``HTTP``「Port」は``80``に設定し、
**「Create target group」** を選択し新たにターゲットグループを作成し、作成したターゲットグループを選択しました。（後述）
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/847eb5dd-3569-c700-7534-9f4016f200b3.png)

#### ターゲットグループを作成
**「Choose a target type」** は``Instances``を選択し、**「Target group name」** はわかりやすく``アプリ名TargetGroup``としました。
そのほかの箇所はデフォルトのままで写真のような設定になっています。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/c299703f-1bb9-b992-fc03-b5e512de7e4c.png)
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/9d543944-8476-fb2a-a71e-a58c5c18b15a.png)

上段の**Instance ID** にチェックを入れ``Include as pending below``を押すと下段の**Reviw targets** に選択したインスタンスが表示されるので **「Create target group」** をクリック
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/11838691-38be-531a-59c0-72fa9bb0083d.png)
先ほどの **「Listeners and routing」** の中の **「Default action」** で作成したターゲットグループを選択。
その後 **「Create load balancer」** をクリックでロードバランサーの作成が完了

# ドメインとロードバランサーの紐付け
まずは **Route53** へアクセスし、 **ホストゾーン** を選択
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/405fa0b6-d51a-f6bb-6f74-2382e14047f6.png)

**「ドメイン名」** に自分が使用しているドメインが表示されるため選択し、 **「詳細を表示」** をクリック
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/659bfd40-72bb-abd1-e798-b2cd80c03f9b.png)

詳細が表示されたら、タイプが「A」と書かれた欄の右側に以前下の記事でドメイン名と紐づけたElasticIPの値が表示されているのでそれを選択します。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/708201df-696c-79e8-9207-bf6edc9ff936.png)

選択すると右側に **「レコードの詳細」** が表示されるので **「レコードの編集」** をクリック
![22..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/eabb7cf0-a152-db82-460f-2e5bed9f8629.png)

**「エイリアス」** にチェックを入れると入力フォームが変化するため、 **「レコードタイプ」「トラフィックのルーティング先」** を下記のように変更します。
**「レコードタイプ」** 
``A-IPv4アドレスと一部のAWSリソースにトラフィックをルーティングします``

**「トラフィックのルーティング先」** 
``Application Load BalancerとClassic Load Balancerへのエイリアス``
``アジアパシフィック（東京）[ap-northeast-1]``
``作成したALBのドメイン名(～elb.amazonaws.com)``

上記に変更して「保存」を押してください。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/bd4edda0-63c0-2cf9-5461-828d30434cae.png)

# http通信をhttps通信へリダイレクト
EC2ダッシュボードへ移動し、左側メニューの **「ロードバランサー」** を選択
先ほど作成したALBを選択し下部の **「リスナー」** をクリックし、 **「HTTP:80」** のルールにある **「ルールの表示/編集」** をクリック
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/4f6e3cf4-fc7e-ce01-4be5-f7da17add516.png)

上部メニューの「＋（ルールの追加）」をクリックしルールを下記のように追加します。
「IF」``パス = *``
「THEN」``リダイレクト先　「HTTPS」、「443」``
を選択して保存します。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/f072431d-df41-4dfd-d9ac-a35885d2afe6.png)
![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666919/54908a2e-02ab-43af-1716-3d5d6b9777e3.png)

これで設定は以上となります。

# 終わりに
まだまだAWSについて勉強不足なので一つ一つの設定について理解できていませんが、参照先のサイトでは詳しく説明してくださっています。勉強をして理解できるようにしていきたいと思います。
長い記事にお付き合いいただきありがとうございました。