本記事ではCloudFront+ALB経由のサーバへのHTTPS接続するための構築(DNS設定含む)や、CloudFrontFunctionsを使用したリダイレクト処理の実装方法を紹介します。
はじめまして、くまンモ(@kumanmoo) と申します。 普段はAWS,Azure,GCPのインフラをメインにフルリモートでクラウドエンジニアやってま。2023/2024Japan AWS All Certifications Engineers AWSとかガジェットについて記事書いてます。 X(Twitter):@kumanmoo
CloudFrontの構築の前提と最終的な構成図
【最終的な構成図】
リージョンは東京リージョン(ap-northeast-1)を使用し、DNSサーバはRoute53(ドメイン取得済み)とします。
また、パブリックサブネットにALB(Name:test-alb)を1台、プライベートサブネットにウェブサーバが1台すでに構築されている状態からスタートとします。
(ALBのドメイン名でHTTP接続可能)
CloudFrontで利用可能なリダイレクト方法について
CloudFrontで使用可能なリダイレクト方法は以下の2種類があります。
本検証ではCloudFront Functionsをビューワリクエストに設定してリダイレクトを行っていきます。
ビューワリクエスト、ビューワレスポンス、オリジンリクエスト、オリジンレスポンスの違いに関する説明は割愛しますが、以下参考のドキュメントになります。
CloudFront Functionsについて
実行時間が1ミリ秒未満と非常に短いですが、毎秒数百万のリクエストを処理することができます。
実装はCloudFrontの画面で行い、JavaScriptで記載します。作成したコードはCloudFrontにデプロイする前にテストが可能で、
デプロイもワンクリックで完了します。作成したFunctionsはCloudFrontのパスパターンを定義する際に紐づけることができます。
注意点として、ビューワーリクエスト、ビューワーレスポンスにのみ紐づけが可能です。
Lambda@Edgeについて
CloudFront内で実行できるLambdaです。CloudFrontと組み合わせることでエッジロケ-ションごとにコンテンツを切り替えたり、
接続元IPによってレスポンスを指定することが可能です。
CloudFront経由の接続に変更する際の注意点
外部ALB(internet経由)からEC2に接続する構成の場合、ALBのセキュリティグループで接続元IPアドレスの制限を実施しているケースは少なくないかと思います。
CloudFront経由の構成に変更した場合、ALBのセキュリティグループが受け取る接続元IPアドレスは「CloudFront用に払い出されたプレフィックスリストのIPアドレス」に変わります。
そのため、接続経路の変更に合わせて、セキュリティグループのインバウンドルールでCloudFrontをのプレフィックスリストを追加で許可する必要があります。
セキュリティグループで許可されていないと「DNSレコードは設定済み、証明書も適用したのにうまく繋がらない」といった事象が発生してしまうので注意してください。
ALB接続のHTTPS化
ALBへHTTPS接続をするために以下の流れで作業をしていきます。証明書はAWS Certificate Manager(ACM)を使用して発行します。
- 証明書を発行する(このタイミングでCloudFront用も併せて作成します。)
- Route53にCNAMEレコードを登録する
- ALBにHTTPS(443)のリスナーを追加する
- ALBのセキュリティグループのインバウンドルールにHTTPS(443)を追加する
- Route53にAレコードを登録する(レコードの値にはALBのエイリアスを指定)
- 疎通確認
注意点として、ALB用の証明書は東京リージョン(ap-northeast-1)、CloudFront用の証明書はバージニア北部(us-east-1)で作成する必要があります。
1.証明書を発行する
画像は東京リージョン(ALB用)のものですが、バージニア北部でも同様の作業を実施してください。(CloudFront用)
「完全修飾ドメイン名」に”*.ドメイン名”と入力して作成します。
検証方法は「DNS検証」を使用します。Route53にCNAMEレコードを追加することでこの証明書が使用可能になります。
2.Route53にCNAMEレコードを登録する
証明書が発行できたら「Route53でレコードを作成」を選択します。
「レコードを作成」を押すとRoute53に自動でCNAMEレコードを追加してくれます。レコードが追加されれば検証が成功し、この証明書が使用可能になります。
3.ALBにHTTPS(443)のリスナーを追加する
ALBの画面より「リスナーの追加」を選択し、画像の内容で登録します。
東京リージョンで作成した証明書はここで使用します。
4.ALBのセキュリティグループのインバウンドルールにHTTPS(443)を追加する
本検証では自宅のIPアドレスからのみ接続を許可しています。
5.Route53にAレコードを登録する(レコードの値にはALBのエイリアスを指定)
Route53の画面から「レコード追加」を選択します。
レコード名は呼び出しに使用したいサブドメインを指定してください。(お好きなものでOK)
AレコードでALBを呼び出せるようにしたいので「エイリアス」をオンにしてルーティング先を指定します。
6.疎通確認
https://{Route53に登録したレコード名}で接続してみます。
ALB経由のHTTPSが成功しました!
CloudFrontの構築
つぎにCloudFrontディストリビューションを作成していいます。
CloudFront経由の接続を行うため、以下の流れで作業をしていきます。
- CloudFrontディストリビューションを作成する
- Route53にAレコードを登録する(レコードの値にはALBのエイリアスを指定)
- ALBのSGでCloudFrontのIPアドレス(プレフィックスリスト)を許可する
1.CloudFrontディストリビューションを作成する
「オリジンドメイン」にはHTTPS接続可能なALBのFQDNを記載してください。
プルダウンでALBのDNS名を指定することも可能ですが、このDNS名はHTTP接続しかできないため、
かならず”HTTPS接続可能なALB用FQDN”を入力してください。
もし誤ってALBのDNS名をそのまま選択してしまうとCloudFrontからALBへHTTPS接続できず502エラーになります。
設定時に注意が必要な点は以下です。それ以外は画像を参考にデフォルト値で進めます
- オリジンドメイン:HTTPS接続可能なALBのFQDN
- プロトコル:HTTPSのみ
- ビューワプロトコルポリシー:HTTPS only
- 代替ドメイン名(CloudFront呼び出し時に使用したいFQDN)
- 証明書:バージニア北部(us-east-1)で作成したもの
代替ドメインを指定します。
※代替ドメインとはCloudFrontを呼び出すときに使用する名前です。
この代替ドメインで名前解決をするため、後ほどRoute53にレコードを追加します。
上記の設定が完了したら「ディストリビューションを作成」を選択します。
2.Route53にAレコードを登録する(レコードの値にはALBのエイリアスを指定)
loudFrontを呼び出す際に「代替ドメイン」というものを設定しました。
しかし、Route53にはCloudFront用のレコードが設定されていないため、作成した代替ドメイン名で名前解決しようとしても
CloudFrontのIPアドレスが分からず到達することが出来ません。
そのため代替ドメイン名とCloudFrontディストリビューションを紐づけるためのレコードを登録します。
レコードの登録方法はALBの時と同様にAレコード(エイリアス)を使用して発行します。
レコード名はCloudFrontディストリビューション作成時に入力した「代替ドメイン」を記載してください。
AレコードでCloudFrontを呼び出せるようにしたいので「エイリアス」をオンにし、作成した「CloudFrontディストリビューションID」を指定します。
3.ALBのSGでCloudFrontのIPアドレス(プレフィックスリスト)を許可する
冒頭でもお話しましたが、CloudFront経由の構成に変更した場合、ALBのセキュリティグループが受け取る接続元IPアドレスは
「CloudFront用に払い出されたプレフィックスリストのIPアドレス」に変わります。そのため、HTTPS接続を自宅IPアドレスから許可していましたが、CloudFrontのIPアドレスに変更する必要があります。
Internetから直接ALBへ接続できないようにインバウンドルールはCloudFrontのIPアドレスのみ許可するように変更します。
これでCloudFrontからALBへ接続ができるようになりました。CloudFrontに指定した代替ドメインで呼び出してみます。
無事に成功しました!!
ALBへの調節アクセスはできないようにセキュリティグループを変更したので念のため確認してみます。
CloudFront経由でなければ接続できなくなっているのでアクセス制御が正しく行われていることを確認できました。
CloudFront Functionsの構築
最後にCloudFront Functionsを使用したリダイレクト設定をしてみます。
現在CloudFrontのビヘイビアの設定はデフォルトのみ、すべてALBに流す設定になっています。今回は特定のパスパターン(/twitter))にマッチした場合はTwitterのアカウントトップページへリダイレクト、それ以外のパスパターンはすべてALBの後ろのwebサーバへ接続する構成にしてみようと思います。
- パスパターン:/twitter
- リダイレクト先:https://x.com/kumanmoo
CloudFrontの「関数」からCloudFrontFunctionsを作成します。
ビューワ:HTTPS only
ビューワリクエスト:作成したCloudFrontFunctions
登録が完了したので/twitterのパスを追加して呼び出してみます。
無事にXアカウントのトップページが表示されました。
ほかのパスパターンでも試してみます。
Nginxのエラー画面が表示されました。ALB側にルーティングされていることが分かります。
さいごに
以上でCloudFrontの構築、リダイレクト設定のご紹介は以上となります。
最後まで読んでいただきありがとうございました!!
普段はQiitaをメインに投稿していることが多いですが、今後は英語のサイトでも投稿していこうかなと思っているので気になる人はそちらも読んでもらえると嬉しいです。










