こんにちは。植松です。
ウェブサイトのリニューアルやプラットフォーム移行に伴い、ドメインを変更することは珍しくありません。しかし、ドメイン変更はこれまで蓄積してきた検索エンジンからの評価(SEO評価)や、ユーザーがブックマークしてくれているアクセス経路を失うリスクが伴います。
この課題を解決するため、AWSの CloudFront Functions を利用して、サーバーレスでリダイレクト設定を行いました。この方法は、CloudFrontのエッジロケーションでリクエストを高速に処理できるだけでなく、実行コストが非常に低いというメリットもあります。

この記事では、その具体的な実装手順と設定内容を共有します。

アーキテクチャ概要

基本的な構成は以下の通りです。

  • CloudFront: CDNとしてリクエストを受け付け、リダイレクト処理を実行します。
  • S3: CloudFrontのオリジンとして設定(今回はリダイレクト元なので実質的なコンテンツは不要)。静的ウェブサイトホスティングを有効にします。
  • ACM (AWS Certificate Manager): 旧ドメイン用のSSL/TLS証明書を発行し、CloudFrontに設定します。
  • CloudFront Functions: リダイレクトルールを記述したJavaScriptコードを実行します。
  • Route 53 (または他のDNSサービス): 旧ドメインのDNSレコードをCloudFrontに向けます。

実装手順

1. オリジン用S3バケット準備

まず、CloudFrontディストリビューションのオリジン(参照元)として利用するS3バケットを作成します。

AWSマネジメントコンソールからS3を開き、バケットを作成します(バケット名は任意で構いません)
作成したバケットの[プロパティ]タブから[静的ウェブサイトホスティング]を有効にします。インデックスドキュメントは index.html など適当な名前で構いません。(実際にはアクセスされません)
パブリックアクセス設定は、今回は Function で処理するため「パブリックアクセスをすべてブロック」のチェックを外しました。
設定後、バケットウェブサイトエンドポイントを控えておきます。

2. ACM証明書の取得 (us-east-1リージョン)

CloudFrontで使用するSSL/TLS証明書は、必ずバージニア北部 (us-east-1) リージョンで発行する必要があります。

AWSマネジメントコンソールのリージョンを us-east-1 に変更し、ACMを開きます。
パブリック証明書のリクエストで、ドメイン名に旧ドメインを指定します。
DNS検証を選択し、指示に従ってDNSレコード(CNAME)をドメインのDNSゾーンに追加して検証を完了させます。
証明書のステータスが「発行済み」になるまで待ちます。

3. CloudFront Functionの作成

リダイレクトロジックを記述する Function を作成します。

CloudFrontの管理画面左メニューから[関数]を選択し、[関数を作成]をクリックします。
名前(任意です)を入力し、以下のコードを貼り付けて保存します。
今回は以下のルールでリダイレクト設定を行うことにしました。

旧ドメイン:test.f-wind.co.jp
新ドメイン:www.f-wind.co.jp

ルール

1. 特定ページ(/products/)へのアクセスはクエリ文字列をそのまま保持し、HTTPステータスコード 301(恒久的な転送)で転送します。これにより、SEO評価を引き継ぎます。
2. 特定ページ以外の全てのパス(例: お問い合わせページ、会社概要ページなど、末尾スラッシュの有無や下層パスを問わず)は、HTTPステータスコード 301 で新たなドメインのトップページへ転送します。


function handler(evt) {
    var req = evt.request;
    var host = 'www.f-wind.co.jp'; // リダイレクト先のホスト
    var uri = req.uri;
    var queryString = req.querystring; // クエリ文字列を取得
    // ルール1: 特定ページ (/products/)
    if (uri.startsWith('/products/')) {
        var newUrl = `https://${host}${uri}`;
        // クエリ文字列が存在すれば付与
        if (Object.keys(queryString).length > 0) {
            var params = [];
            for (var key in queryString) {
                params.push(`${key}=${queryString[key].value}`);
            }
            newUrl += '?' + params.join('&');
        }
        // パスとクエリを保持して301リダイレクト
        return {
            statusCode: 301, // 恒久的な転送
            statusDescription: 'Moved Permanently',
            headers: { location: { value: newUrl } }
        };
    }
    // ルール2: それ以外はトップページへ301リダイレクト
    return {
        statusCode: 301, // 恒久的な転送,
        statusDescription: 'Moved Permanently',
        headers: { location: { value: `https://${host}/` } }
    };
}

コードを保存したら、必ず[発行]タブから関数を発行してください。発行しないとCloudFrontに関連付けできません。発行後の関数のARNを控えておきます。

4. CloudFrontディストリビューションの作成

いよいよCloudFrontディストリビューションを設定します。

CloudFrontで[ディストリビューションを作成]をクリックします。
オリジンドメイン: ステップ1で控えたS3バケットのウェブサイトエンドポイントを指定します。
ビューワープロトコルポリシー: Redirect HTTP to HTTPS を選択し、HTTPSアクセスに統一します。
許可された HTTP メソッド: GET, HEAD, OPTIONSとします。(要件に合わせて設定してください)
代替ドメイン名 (CNAMEs): 旧ドメイン(test.f-wind.co.jp)を追加します。
カスタムSSL証明書: ステップ2で発行した旧ドメイン(test.f-wind.co.jp)の証明書を選択します。
その他の設定(キャッシュポリシーなど)はデフォルトまたは要件に合わせて調整します。
ディストリビューションを作成し、ステータスが「有効 (Enabled)」になるまでデプロイを待ちます(数分~数十分)。完了したらディストリビューションドメイン名 (例: dxxxxxxxxxxxxx.cloudfront.net) を控えます。


5. Functionの関連付け

作成したディストリビューションにFunctionを関連付けます。

ディストリビューションの設定画面で[動作 (Behaviors)]タブを開きます。
デフォルト (*) のキャッシュ動作を選択し、[編集]をクリックします。
[関数の関連付け - オプション]セクション(画面一番下にありました)で、[ビューワーリクエスト (Viewer Request)] イベントタイプを選択します。
[関数タイプ] で CloudFront Functions を選択し、[関数 ARN/名前] でステップ3で控えたARNを指定(選択肢が出るので、それを指定)します。
[変更を保存]し、再度デプロイ完了を待ちます。


6. DNS設定

最後に、旧ドメイン(test.f-wind.co.jp)へのアクセスがCloudFrontに向くようにDNS設定を変更します。

利用しているDNSサービス(Route 53など)で、旧ドメイン(test.f-wind.co.jp)のレコードを編集します。
Route 53の場合は Aレコード を選択し、エイリアスとしてステップ4で控えたCloudFrontのディストリビューションドメイン名を指定します。
他のDNSサービスの場合は CNAMEレコード を作成し、値をCloudFrontのディストリビューションドメイン名に設定します。
DNS設定がインターネット全体に反映されるまでしばらく待ちます(TTL設定によりますが、数分~数時間)。


動作確認
DNSの変更が反映されたら、実際にリダイレクトが機能するか確認します。curlコマンドやブラウザの開発者ツールで確認するのが確実です。


# 特定ページ確認 (パス・クエリ維持、HTTPS化)
curl -I http://test.f-wind.co.jp/products/123?ref=ad
# -> 301 Moved Permanently
# -> Location: https://www.f-wind.co.jp/products/123?ref=ad
# 特定ページ以外確認 (トップページへリダイレクト、HTTPS化)
curl -I https://test.f-wind.co.jp/company/detail
# -> 301 Moved Permanently
# -> Location: https://www.f-wind.co.jp/

期待通りに 301 ステータスコードと正しい Location ヘッダーが返ってくれば成功です。

CloudFront Functionsのコストメリット

今回採用したCloudFront Functionsは、AWSのサーバーレスコンピューティングサービスの中でも特に軽量な処理に特化しており、100万リクエストあたり$0.1(2025年4月現在、変更の可能性あり)という非常に安価な料金設定になっています。

参考:https://aws.amazon.com/jp/cloudfront/pricing/

単純なリダイレクト処理であれば実行時間も極めて短いため、大量のアクセスが発生した場合でも、Lambda@Edgeなどの他の方法と比較してコストを大幅に抑えることが期待できます。
ウェブサーバー + .htaccessでも同様のことは実現可能ですが、サーバーのメンテナンスや維持費などかかってきます。また、リクエストはサーバーまで到達させる必要がある点においても、ユーザーから近いエッジロケーションにて実行されるCloudFront Functionsでの高速リダイレクトには速度の面からも敵いません。

まとめ

CloudFront Functions を利用することで、サーバー管理の手間なく、パフォーマンスとコスト効率に優れた方法で旧ドメインから新ドメインへのリダイレクトを実装できました。これにより、ドメイン移行後もSEO評価とユーザー体験を維持することが可能になります。