AWSを使ってオリジナルアプリをSSL化した際の技術の意味や役割について整理する

※2022年から技術系の記事は[個人ブログ](https://yamaday0u.net/category/programmer/)に投稿しております。ぜひこちらもご覧ください→[yamaday0u Blog](https://yamaday0u.net/category/programmer/)

## はじめに
やまだゆう（[@yamaday0u](https://twitter.com/yamaday0u)）です。

ぼくは現在、業界未経験で、エンジニアへの転職を目指して勉強・転職活動中です。
先日、AWSを使ったオリジナルアプリのSSL化に成功しました。

参考にしたサイトでは、SSL化を実現する方法として以下の説明をしていました。

> Route53で取得したドメインを使ってACMでドメイン証明書を取得し、その証明書をALBに適用する。 ALBとEC2を紐付けてインターネットからはALBに対してHTTPSで通信を行い、ALBからEC2にはHTTPでトラフィックを転送する。
[【初心者向け】AWSのサービスを使ってWebサーバーをHTTPS化する（DevlopoersIO produced by Classmethod）](https://dev.classmethod.jp/articles/aws-web-server-https-for-beginner/)より

正直、この説明への理解があいまいなままで、言われた通りの手順でどうにか実装できたのですが
**エンジニアを目指している以上、あいまいな理解をそのまま放っておいてはいけない**と思い、理解を深めるため、記事にまとめることにしました。

## SSL化の実現方法

EC2を使いデプロイ済みのアプリと、AWSが提供するサービスのみを使ってSSL化します。

|使用したAWSのサービス|役割|
|:--|:--|
|[Amazon Route53](https://aws.amazon.com/jp/route53/)|可用性と拡張性に優れたクラウドのドメインネームシステム (DNS) ウェブサービスを提供する|
|[AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/)|SSL/TLS証明書の提供、管理、デプロイを簡単にする|
|[Elastic Load Balancing](https://aws.amazon.com/jp/elasticloadbalancing/?nc=sn&loc=0&whats-new-cards-elb.sort-by=item.additionalFields.postDateTime&whats-new-cards-elb.sort-order=desc)|アプリケーションへのトラフィックを複数のターゲット (今回はAmazon EC2 インスタンス) に自動的に分散する<br>このサービスのうち、Application Load Balancerを使用|

## 1.[Amazon Route53](https://aws.amazon.com/jp/route53/)とは
簡単にいえばドメイン名の登録やドメインネームシステム（DNS）を提供してくれるサービスです。

> ドメインネームシステム（DNS）
ドメインとIPアドレスを対応させるシステム（[IT用語辞典e-Words](https://e-words.jp/w/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3.html)より）

さらに新しい用語が出てきたので調べました。

> IPアドレス（Internet Protocol Address）
インターネットなどのTCP/IPネットワークに接続されたコンピュータや通信機器の一台ごとに割り当てられた識別番号（[IT用語辞典e-Words](https://e-words.jp/w/IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9.html)より）

ざっくり言えば、ネットワーク上の住所のようなもので、個々のコンピュータを識別するためのアドレスです。
100.10.0.1のような10進数の数字で表されます。

> ドメイン名
インターネット上に存在するコンピュータやネットワークを識別し、階層的に管理するために登録された名前のこと（[IT用語辞典e-Words](https://e-words.jp/w/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3.html)より）

数字の羅列であるIPアドレスは、人間が覚えるのに困難なため、[https://www.google.com/](https://www.google.com/)のように覚えやすい名前（ドメイン名）を作りIPアドレスと紐づけて運用します。

したがってRoute53は、**ドメイン名の登録と、後述のロードバランサーのDNS名とドメイン名を紐づける役割を担います。**

ちなみにぼくの場合、このRoute53でオリジナルアプリのドメイン名となる[group-calendar.net](https://group-calendar.net/)を登録しました。

## 2.[AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/)（ACM）とは

SSL/TLS認証をしてくれるサービスです。

SSL/TLS認証については、ぼくが過去に初心者目線でまとめた記事がありますので、[こちら](https://qiita.com/yamaday0u/items/3606db49af0f35c2fa23)も読んでみてください。

**Route53で登録したドメインに対してSSL/TLS認証で保護します。**

## 3.[Elastic Load Balancing](https://aws.amazon.com/jp/elasticloadbalancing/?nc=sn&loc=0&whats-new-cards-elb.sort-by=item.additionalFields.postDateTime&whats-new-cards-elb.sort-order=desc)（ELB）とは

AWSが提供するロードバランサーのサービスです。

> ロードバランサー（load balancer）/負荷分散装置
通信制御装置の一つで、外部から送られてくるデータや処理要求を、同等に機能する複数のシステムに振り分け、一台あたりの負荷を抑える装置（[IT用語辞典e-Words](https://e-words.jp/w/%E3%83%AD%E3%83%BC%E3%83%89%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B5.html)より）

特定のサーバーにアクセスが集中してダウンすることを防いだり、特定のサーバーのメンテナンス時にリクエストが送られてこないようにしたりする際に、このロードバランサーが活躍します。

個人で作る小規模なアプリでは、上記の恩恵はあまり感じられませんが、今回のロードバランサーの役割は以下の2点です。

- インターネットからHTTPS通信を受ける
- EC2インスタンスにHTTP通信を送る

簡単にいうと、**インターネットとサーバー（EC2）の間に入ってインターネットからHTTPS通信を受ける役割を担います。**

複数のサーバーを使う大規模なアプリの場合、HTTPS通信をロードバランサーで一手に引き受けることで、本来各サーバーごとに必要なSSL/TLS証明書がロードバランサー1つの分で済んでしまうメリットがあります。

### ロードバランサーの種類
ELBでは以下の4つのロードバランサーを提供しています。
特徴は[ ELBの公式](https://aws.amazon.com/jp/elasticloadbalancing/?nc=sn&loc=0&whats-new-cards-elb.sort-by=item.additionalFields.postDateTime&whats-new-cards-elb.sort-order=desc)より抜粋。

|種類|特徴|
|:--|:--|
|Application Load Balancer|HTTP トラフィックおよび HTTPS トラフィックの負荷分散に最適|
|Network Load Balancer|きわめて高いパフォーマンスが要求される TCP、UDPおよびTLSにおけるトラフィックの負荷分散に最適|
|Gateway Load Balancer|サードパーティーの仮想ネットワークアプライアンスを簡単にデプロイ、拡張、および実行|
|Classic Load Balancer|EC2-Classic ネットワーク内に構築されたアプリケーションを対象|

ここの理解は今回は諦めました...
以下の記事が詳しく書いてありそうなので共有しておきます。
[Elastic Load Balancing（Qiita）](https://qiita.com/leomaro7/items/0b96ad1b25bee1957f8c)

個人開発のアプリでHTTP/HTTPS通信をするなら1番めのApplication Load Balancerを選択しておくというくらいの認識をしておくと良いと思います。

## 最後に
以上、簡単ですがSSL化で利用した技術について整理してみました。
用語の意味と技術の役割について少し理解が深まったと思います。

## 参考資料

- [【初心者向け】AWSのサービスを使ってWebサーバーをHTTPS化する（DevlopoersIO produced by Classmethod）](https://dev.classmethod.jp/articles/aws-web-server-https-for-beginner/)
- [Webサービスの安定稼働に欠かせない
AWS ELBの基礎知識（NTT東日本）](https://business.ntt-east.co.jp/content/cloudsolution/column-32.html)
- [IT用語辞典e-Words](https://e-words.jp/)
- [Elastic Load Balancing（Qiita）](https://qiita.com/leomaro7/items/0b96ad1b25bee1957f8c)