ALB+独自ドメイン -短縮URLを作成しよう-


[AWS Advent Calendar 2020](https://qiita.com/advent-calendar/2020/aws)の16日目の記事です。
ふと、お手軽に独自メインでカスタムパスを用いて短縮URLを作成したいと思いました。
音楽アーティストなどのYouTubeにアクセスした際に、概要欄に書かれたりしてる各SNS等への独自ドメインを使ったリンク集みたいなのを良く目にしますよね。
私はアーティストではないので使い道は無いのですが…

今回のお題

* 例えば「https://独自ドメイン/qiita」にアクセスするとqiitaのマイページにリダイレクトされる短縮URLを作りたい
* 今回はパス部分はランダム作成ではなく手動で固定化させ、予め決めたページにリダイレクトさせる

AWS ALBにてパスベースでのバランシングが可能でターゲット先としてリダイレクト(HTTP 301)もできるようなのでALBの機能を利用してやってみました。

# 用意するもの
* AWSアカウント
* 独自ドメイン

# 使うAWSサービス
* Route53
* ALB
* AWS Certificate Manager(SSL使う場合)
* EC2で立ててるWebサーバ(あれば)
* AWS外で持っているブログなど

# 独自ドメインの権威サーバとしてRoute53を設定する
この辺はのやり方は多数記事があると思いますので詳細は割愛
2018年のAWS Advent Calendar 2018のこちらの記事を参考ください!
[お名前.comでドメインを取得して、AWSで管理して、色々やってみる](https://qiita.com/wannabe/items/17060e244c50d5b467cb#aws-route53%E3%81%A7%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%A7%94%E4%BB%BB)

なお、お試しで設定してRoute53側のPublic Hosted Zoneを削除する場合は、必ずWhois側のネームサーバをレジストラのDefault等に戻すようにしましょう。
悪用される可能性があります。

# ALBを作成
**突然ALBの設定から入ってますが、VPC関係やサブネット等を作成されてない方は事前に作成が必要です。**
**Availability Zoneも2つ以上作成しておく必要があります**
##### ALBを新規作成
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/e56413c1-7b8e-da92-1a09-8d0bee46b20c.png">


##### ロードバランサの設定
名前はご自由に。IPアドレスタイプは今回はIPv4のみで実装します。
また、リスナーはHTTPS(443番)で今回はリッスンさせます。
Availability Zoneは2つ以上作成しておいて選択してください。
アドオンサービスは今回は使いません。
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/ee73d05b-47fa-9c11-27ce-6b3e5b54361a.png">
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/e12dfea0-7eba-a2e2-bcc4-3de27485e0c9.png">

##### セキュリティ設定の構成
リスナーにHTTPSを選択している場合はここで、設定予定の独自ドメインに対応した証明書の設定をします。
作成してない場合は以下画像の通り、リンクをクリックするとAWS Certificate Managerの画面が別で開くのでそちらから新規証明書をリクエストしてください。(証明書作成もこちらでは手順はスキップします)
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/4922fce3-3516-c2f6-04af-68f3129e9a42.png">

##### セキュリティグループの設定
セキュリティグループもお好みで制限をかけるのか、世界に公開するのか設定してください。
なお、新規で作成を選択するとリスナーに応じたルールが追加されます。
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/fa01bf6b-ddaf-9f23-26bb-a250e47bf93d.png">


##### ルーティングの設定
ターゲットグループの作成ですが、純粋にリダイレクトだけしたい場合はターゲットグループの名前のみ設定し、「次の手順」を押し進みます。
ヘルスチェック項目もDefaultのままで良いです。
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/84075451-dae7-0d6d-b28b-3b7e6b058502.png">

##### ターゲットの登録
このページも特に触らず(登録済みターゲットの項目は空のまま)、「次の手順」を押し進みます。
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/8710bb48-9d2e-dca6-e954-2a452075749f.png">

##### 確認
最後に設定した内容が表示されるので、内容を確認して「作成」を押します。
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/42267f1e-e3c5-99a0-a6e9-246c07bf5791.png">

# Route53の設定
##### ALB向けにAliasレコードを設定する
Route53から自身の独自ドメインにレコードを追加します。
サブドメインまたはApxeドメインに対して、ALB向けのAliasリソースレコードを設定する形です。
トラフィックのルーティング先を前の手順で作成したALBを選択します。
AliasのためApexドメインでも設定可能です。
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/1d5c92e6-eb3b-a755-b23c-1f1b00ee92d5.png">

作成するとこんな感じ
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/15e4db15-f545-685f-4d15-7467f5c1628e.png">

# ALBでのリダイレクト設定をする
##### ルール設定する
対象のALBを選択し、「リスナー」タブを開いて、HTTPSの「ルールの表示/編集」をしていきます。
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/b4ac6474-86be-cdb0-c909-981050a6ec34.png">

今回は実運用的な事は無視して、HTTPSで「https://独自ドメイン」でアクセス時に外部ブログと「https://独自ドメイン/qiita」へアクセス時にqiitaのマイページを表示する部分だけに絞って作成を行います。

実運用的には、HTTPもリスナーに追加しHTTPアクセスの場合はリクエストを全てHTTPSにリダイレクトする様にしたり、HTTPSのデフォルトルールをEC2で構築したポータルWebページに全てルーティングする様にし、特定のパスが指定されたらパスに合わせたリダイレクト先へリダイレクトするような形にすると良いかと思います。
**また、一般的なリダイレクトでも考慮が必要ですが、リダイレクトがループしない様に設計が必要になりますのでご注意ください。(自己責任で設定ください)**

##### Defaultのバランシングルールの設定
今回の目的はShortURLで「https://独自ドメイン/予めルール設定したパス(カスタムパス)」で特定のページにリダイレクトさせるのを作成しますが、ここで編集しているバランシングルール設定は、パスが指定されない場合、予めバランシングルール設定してないパスが指定された場合の振り分け先ルールとなります。

HTTPSの「ルールの表示/編集」を押し、ルールが表示されたらまずデフォルトルールを設定します。
「それ以外の場合はルーティングされないリクエスト」を鉛筆ボタンを押し進めていき、初期で設定されているルールは削除し、今回はパスが指定されない場合は全てブログに飛ばすので以下の様な形で設定を入れます。
**(これは私のブログへリダイレクトする設定なので真似して入力しないようにしてくださいね…)**
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/2e618228-786c-f492-9765-007f43c2e6f1.png">



##### パスベースのバランシングルールの作成
今回の目的である、「https://独自ドメイン/予めルール設定したパス(カスタムパス)」のカスタムパスが指定された時のリダイレクトルールを作成します。

ルールの作成画面で「＋」マークを押し、ルールを新規に追加します。
そしてパス部分にアクセスされた時にフィルタするパス名を入れます。
「https://独自ドメイン/qiita」を作りたいのであれば「qiita」と入力。
そしてDefaultのルールと同様にリダイレクト先の情報を入れるだけです。
入力が完了したら「更新」ボタンを押し設定を反映させます。
<img width="50%"" alt="ALB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90309/a82fafdf-d149-84ee-1d62-5c5c216cda5b.png">

# アクセスして動作を確認する
ここまで作成ができましたら、「https://独自ドメイン」と「https://独自ドメイン/qiita」へアクセスしてみましょう。
リダイレクト先で指定したページが表示されるはずです。
また、「https://独自ドメイン/てきとうななにか」を入れてもDefaultのルールが働き、「https://独自ドメイン」の場合と同じページが表示されるのではと思います。
(厳密には「てきとうななにか」のパスを引き渡している場合はDefaultのドメインページのエラーページ等が表示されるでしょう)

以上で設定は完了です。
ルールの作成数には上限がありますが、パス部分の文字列は「or」によるルールが作成できたりもしますし、AWSの操作に慣れていて短縮URLの詳細なアクセス解析等が必要ない方は利用してみてはいかがでしょうか。(CloudWatchメトリクスで簡易的なヒット数などは確認できます)

# トラブルシューティング
##### ブラウザでのアクセス時に証明書エラー
ALBに設定した証明書は正しいですか？
Alias設定を行ったドメインと証明書のドメインは一致していますか？

##### ページが何も表示されないように見える
ブラウザでのアクセスがループしてませんか？