CloudFrontの構築とリダイレクト設定方法を紹介!操作画像付きで解説!

本記事ではCloudFront+ALB経由のサーバへのHTTPS接続するための構築(DNS設定含む)や、CloudFrontFunctionsを使用したリダイレクト処理の実装方法を紹介します。

アバター画像
監修者 くまンモ

はじめまして、くまンモ(@kumanmoo) と申します。 普段はAWS,Azure,GCPのインフラをメインにフルリモートでクラウドエンジニアやってま。2023/2024Japan AWS All Certifications Engineers AWSとかガジェットについて記事書いてます。 X(Twitter):@kumanmoo

\エキスパートが回答!/
この記事に関する質問はこちら
記事に関するご質問以外にも、システム開発の依頼やAIの導入相談なども受け付けております。

    会社名必須
    必須
    必須
    Eメール必須
    電話番号必須
    ご依頼内容必須

    CloudFrontの構築の前提と最終的な構成図

    【最終的な構成図】最終的な構成図

    リージョンは東京リージョン(ap-northeast-1)を使用し、DNSサーバはRoute53(ドメイン取得済み)とします。
    また、パブリックサブネットにALB(Name:test-alb)を1台、プライベートサブネットにウェブサーバが1台すでに構築されている状態からスタートとします。
    (ALBのドメイン名でHTTP接続可能)

    image.png

    image.png

    CloudFrontで利用可能なリダイレクト方法について

    CloudFrontで使用可能なリダイレクト方法は以下の2種類があります。
    本検証ではCloudFront Functionsをビューワリクエストに設定してリダイレクトを行っていきます。
    ビューワリクエスト、ビューワレスポンス、オリジンリクエスト、オリジンレスポンスの違いに関する説明は割愛しますが、以下参考のドキュメントになります。

    AWS公式ドキュメント

    image.png

    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)を使用して発行します。

    1. 証明書を発行する(このタイミングでCloudFront用も併せて作成します。)
    2. Route53にCNAMEレコードを登録する
    3. ALBにHTTPS(443)のリスナーを追加する
    4. ALBのセキュリティグループのインバウンドルールにHTTPS(443)を追加する
    5. Route53にAレコードを登録する(レコードの値にはALBのエイリアスを指定)
    6. 疎通確認

    注意点として、ALB用の証明書は東京リージョン(ap-northeast-1)、CloudFront用の証明書はバージニア北部(us-east-1)で作成する必要があります。

    1.証明書を発行する

    画像は東京リージョン(ALB用)のものですが、バージニア北部でも同様の作業を実施してください。(CloudFront用)
    image.png
    「完全修飾ドメイン名」に”*.ドメイン名”と入力して作成します。
    検証方法は「DNS検証」を使用します。Route53にCNAMEレコードを追加することでこの証明書が使用可能になります。
    image.png

    2.Route53にCNAMEレコードを登録する

    証明書が発行できたら「Route53でレコードを作成」を選択します。
    「レコードを作成」を押すとRoute53に自動でCNAMEレコードを追加してくれます。レコードが追加されれば検証が成功し、この証明書が使用可能になります。

    image.png
    image.png

    image.png

    3.ALBにHTTPS(443)のリスナーを追加する

    ALBの画面より「リスナーの追加」を選択し、画像の内容で登録します。
    東京リージョンで作成した証明書はここで使用します。
    image.png
    image.png

    image.png

    4.ALBのセキュリティグループのインバウンドルールにHTTPS(443)を追加する

    本検証では自宅のIPアドレスからのみ接続を許可しています。

    image.png

    5.Route53にAレコードを登録する(レコードの値にはALBのエイリアスを指定)

    Route53の画面から「レコード追加」を選択します。
    レコード名は呼び出しに使用したいサブドメインを指定してください。(お好きなものでOK)
    AレコードでALBを呼び出せるようにしたいので「エイリアス」をオンにしてルーティング先を指定します。

    image.png

    image.png

    6.疎通確認

    https://{Route53に登録したレコード名}で接続してみます。image.png

    ALB経由のHTTPSが成功しました!

    CloudFrontの構築

    つぎにCloudFrontディストリビューションを作成していいます。
    CloudFront経由の接続を行うため、以下の流れで作業をしていきます。

    1. CloudFrontディストリビューションを作成する
    2. Route53にAレコードを登録する(レコードの値にはALBのエイリアスを指定)
    3. ALBのSGでCloudFrontのIPアドレス(プレフィックスリスト)を許可するimage.png

    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)で作成したもの

    image.png
    image.png
    image.png
    代替ドメインを指定します。
    ※代替ドメインとはCloudFrontを呼び出すときに使用する名前です。
    この代替ドメインで名前解決をするため、後ほどRoute53にレコードを追加します。image.png
    上記の設定が完了したら「ディストリビューションを作成」を選択します。

    2.Route53にAレコードを登録する(レコードの値にはALBのエイリアスを指定)

    loudFrontを呼び出す際に「代替ドメイン」というものを設定しました。

    しかし、Route53にはCloudFront用のレコードが設定されていないため、作成した代替ドメイン名で名前解決しようとしても
    CloudFrontのIPアドレスが分からず到達することが出来ません。

    そのため代替ドメイン名とCloudFrontディストリビューションを紐づけるためのレコードを登録します。
    レコードの登録方法はALBの時と同様にAレコード(エイリアス)を使用して発行します。

    Route53の画面から「レコード追加」を選択します。
    レコード名はCloudFrontディストリビューション作成時に入力した「代替ドメイン」を記載してください。
    AレコードでCloudFrontを呼び出せるようにしたいので「エイリアス」をオンにし、作成した「CloudFrontディストリビューションID」を指定します。

    image.pngimage.png

    3.ALBのSGでCloudFrontのIPアドレス(プレフィックスリスト)を許可する

    冒頭でもお話しましたが、CloudFront経由の構成に変更した場合、ALBのセキュリティグループが受け取る接続元IPアドレスは
    「CloudFront用に払い出されたプレフィックスリストのIPアドレス」に変わります。そのため、HTTPS接続を自宅IPアドレスから許可していましたが、CloudFrontのIPアドレスに変更する必要があります。

    Internetから直接ALBへ接続できないようにインバウンドルールはCloudFrontのIPアドレスのみ許可するように変更します。

    image.png
    これでCloudFrontからALBへ接続ができるようになりました。CloudFrontに指定した代替ドメインで呼び出してみます。

    image.png

    無事に成功しました!!

    ALBへの調節アクセスはできないようにセキュリティグループを変更したので念のため確認してみます。

    image.png
    CloudFront経由でなければ接続できなくなっているのでアクセス制御が正しく行われていることを確認できました。

    CloudFront Functionsの構築

    最後にCloudFront Functionsを使用したリダイレクト設定をしてみます。

    現在CloudFrontのビヘイビアの設定はデフォルトのみ、すべてALBに流す設定になっています。今回は特定のパスパターン(/twitter))にマッチした場合はTwitterのアカウントトップページへリダイレクト、それ以外のパスパターンはすべてALBの後ろのwebサーバへ接続する構成にしてみようと思います。

    • パスパターン:/twitter
    • リダイレクト先:https://x.com/kumanmoo

    image.png

    function handler(event) { var request = event.request; var request_uri = request.uri; var redirect_URL =””; var xxx_ID = “”; var searchString = “/twitter” //リクエストされたuriを出力 console.log(request_uri); if (request_uri.includes(searchString)){ console.log(“/twitterのパスパターンにマッチしました”); // リダイレクト後のURLを構築 redirect_URL = ‘https://x.com/kumanmoo’; console.log(“リダイレクト後のURLはこちら”) console.log(redirect_URL); return { statusCode: 302, statusDescription: ‘Found’, headers: { ‘location’: {‘value’: redirect_URL} } }; } console.log(request); return request; }

    CloudFrontの「関数」からCloudFrontFunctionsを作成します。

    image.png
    image.png
    コードの記載ができたらデプロイします。

    image.png
    image.png
    最後にCloudFrontのビヘイビアを追加します。

    パスパターン:/twitter
    ビューワ:HTTPS only
    ビューワリクエスト:作成したCloudFrontFunctions

    image.png
    image.png
    image.png
    image.png
    登録が完了したので/twitterのパスを追加して呼び出してみます。

    image.png

    無事にXアカウントのトップページが表示されました。
    ほかのパスパターンでも試してみます。

    image.png
    Nginxのエラー画面が表示されました。ALB側にルーティングされていることが分かります。

    さいごに

    以上でCloudFrontの構築、リダイレクト設定のご紹介は以上となります。

    最後まで読んでいただきありがとうございました!!

    普段はQiitaをメインに投稿していることが多いですが、今後は英語のサイトでも投稿していこうかなと思っているので気になる人はそちらも読んでもらえると嬉しいです。

    例:開発手順、ツール、プロンプト

    メルマガ登録

    社内で話題になった「生成AIに関するニュース」をどこよりも早くお届けします。