AWSでJupyterHub (Route53)

# 概要

全体概要は，[AWSでJupyterHub (概要) ](https://qiita.com/ryouka0122/items/af5004d17e0ac934e550)にあるので，参照してください．

前回までで，EC2にJupyterHubを組み立ててみました．
今回は，ドメインをEC2で自動的に割り当てられたものではなく，自分で用意したものに差し替えていきます．
使うのは，`Route53`と`ALB(ELB)`です．

また，`Route53`にドメインが1つはある状態から始めていきます．

# おしながき
* ドメインの登録
    * サブドメインの追加
* ALBの登録
* Route53，ALB，EC2を連結


# Route53でドメイン管理
Route53は主にドメインを管理できるサービスです．いわゆるDNSにあたる部分になります．
以下のような感じで，ドメインを`ホストゾーン`という単位で管理して，その配下でDNSで使うレコードを制御します．
画像には7つのホストゾーンがあることになります．
![ホストゾーン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165030/78c336ff-324a-289d-cbe7-892c16eb46f8.png)

別のDNSサービスで獲得したドメインをRoute53に移管することもできますし，Route53からドメイン登録もできます．
私自身，移管も登録もしたことありますが，わりと簡単にできました☆

## ドメインの追加
ルートとなるドメインを使うのもありだと思いますが，せっかくなのでJupyterHub専用のサブドメインを作ってみます．
先ほどの画像の青色のボタン【ホストゾーンの作成】を押します．
右側に作成パネルが出てくるので，`ドメイン名`と`コメント`，`タイプ`を入力します．そして，【作成】ボタンを押すだけです．
ドメイン名とタイプは，作成後変更はできないので注意が必要です．
例によって，コメントは後でも変えることができます．

作成ボタンを押すと，ホストゾーンのレコードセットが表示されます．
すでにNSタイプとSOAタイプの2つが登録済みになっています．このレコードは変更してはいけません．

## サブドメインを追加した時の作業
ホストゾーンにサブドメインを追加した場合，その親となるメインドメインにサブドメインに向けるNSレコードを追加する必要があります．
以下の画像のようにサブドメインにあるNSレコードの値をメインドメインに追加します．メインドメインに追加するレコードの名前はサブドメインにします．（メインドメインにあるCNAMEレコードは気にしないでください）
![NSレコード追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165030/cb00ead0-0dd9-bdc0-08e1-039d92f2ac4d.png)

# ALBの登録
この後でHTTPS化させるために，証明書をALBに付与させる関係で，Route53とEC2をつなげるためのALBを登録します．
ALBは`Application Load Balancer`の略です．ELBの一種で，普通のロードバランサーであれば，このALBを使えばいいようです．

まず，EC2に移動して，左側の一覧から【ロードバランシング＞ロードバランサー】を選択して，青色の【ロードバランサーの作成】ボタンを押します．どの種類のロードバランサーにするか聞かれるので，Application Load Balancerを選びます．
![ALB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165030/7d40a3b0-161f-5388-dbcb-0a50060920d0.png)

次のように設定していきます．

## ロードバランサーの設定
管理するためのALBの名前，リクエストをチェックするためのプロトコル，アベイラビリティーゾーンの3つを設定します．
名前は分かるものにしましょう．また変更が利かないので，直したくなったら作り直しです．
リスナーのプロトコルはいったんこのままにしておきます．後で，ACMで発行した証明書をくっつけるときにHTTPSに切り替えることにします．
アベイラビリティーゾーンは，とりあえず全部にチェック付けておきます．（私自身VLCの知見がないのでこのようにしているだけです．．）
入力したら【次の手順：セキュリティ設定の構成】ボタンを押します．
![ALBの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165030/2df84443-c154-fb9c-97f1-ba45db316a35.png)

セキュリティ設定の構成では，HTTPSの証明書を設定する画面になっているので，今回はスルーします．

その次は，セキュリティグループの設定になります．
細かい制御ができるようにEC2インスタンスとは別に，HTTPだけ指定したセキュリティグループを新規で`sg_alb_sample-jupyterhub`のように作成しておきます．

さらに先では，以下のようなルーティングの設定になります．ターゲットグループという単位でEC2インスタンスにリクエストをルーティングしてくれるようです．

また，ヘルスチェックの設定もここで行います．
ターゲットグループは，これまた名前を決める必要があります．今回は`tg-sample-jupyterhub`としました．
ヘルスチェックは定期的にEC2インスタンスに向けてリクエストが飛んでくるので，デフォルトの30秒が鬱陶しい場合は間隔を長めにしておくといいでしょう．サーバの状態を監視するものでもあるため，サービスとして公開する場合は長すぎると障害検知が遅くなることにつながるので，その際は気をつける必要があります．
それぞれ，設定出来たら【次の手順：ターゲットの登録】ボタンを押します．
![ターゲットグループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165030/1b0fd95e-1a75-73b4-d581-d5af428aa8f3.png)

次はターゲットとなるEC2インスタンスを登録します．下図にあるように，下部にある【インスタンス】のリストから選択して，上部の【登録済みターゲット】にインスタンスを追加していきます．今回は，JupyterHubが動いているインスタンスだけを登録しました．
追加出来たら【次の手順：確認】ボタンを押します．
![ターゲットの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165030/028cc31c-ae9e-a6a4-7bf5-a73335d7bb85.png)

最後に，設定した項目を確認して，問題なければ【作成】ボタンを押してALBを作ります．
これで，ALBとEC2インスタンスの間はつながったことになります．
Route53に戻って，ALBにつながるレコードを追加します．

# ALB用レコードの追加
Route53で先ほど追加したドメインのホストゾーンを開いて，下図の順番で捜査していきます．
まず，【レコードセットの作成】ボタンを押して，右側に作成用パネルを出します．
作成用パネルのうち，【名前】とタイプはそのままにして，【エイリアス】を`はい`に切り替えます．そうすると【エイリアス先】のプルダウンが出てくるので，ついさっき作ったALBを選択します．このリストに上がってくるELBは，先頭に`dualstack.`というのが勝手に付きます．IPv4とIPv6の両方という意味があるようです．
2つの項目が設定出来たら【作成】ボタンを押します．
Aレコードで値が，`ALIAS`で始まるALBのDNS名になっていると思います．
![ALB用Aレコードの追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165030/26917387-b3d6-d953-8007-bc5bb6af9644.png)

しばらく待って，`http://{Route53に登録したドメイン}/hub/`とブラウザに打ち込んでアクセスするとHupyterHubのログイン画面が表示されます．相変わらず，HTTP接続のワーニングが出ますが，放置しちゃいます．
![JupyterHub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165030/c53aed46-265d-2587-96a2-8042dcd32d04.png)

# まとめ
今回は，Route53を使ってDNS周りを設定し，HTTPSのためにALBを追加し，インターネットからEC2までの経路を作り上げました．
やはり，自分好みのドメインでアクセスしたいですよね．
ALBにはWAF機能も付けることが出来るので，次回は，ALBに証明書とWAF機能を付け足そうとと思います．