Post

AWS CloudFront + S3でサイトクローズ用リダイレクト設定してみた

AWS CloudFrontとS3を使用してサイトクローズ用のドメインリダイレクトを設定する方法を紹介します

AWS CloudFront + S3でサイトクローズ用リダイレクト設定してみた

📋 シナリオ

既存のサイトを閉鎖(example1.com)し、最小限のコストで別のサイトにリダイレクトさせたい場合の設定方法です。

リダイレクト先: example1.com → example2.com

💡 なぜこの方法を選ぶのか?

  • コスト効率: EC2インスタンスを常時稼働させる必要がない
  • シンプル: 複雑なサーバー設定が不要
  • メンテナンス不要: サーバー管理やOSアップデートが不要
  • nginxサーバーより簡単: nginxでリダイレクトサーバーを構築するより設定が簡単

🔄 他の方法との比較

方法コスト設定の複雑さメンテナンス
CloudFront + S3月額約$0.7⭐⭐不要
nginxサーバー月額約$5-20⭐⭐⭐⭐必要
EC2 + Apache月額約$5-20⭐⭐⭐必要

🛠 使用サービス

  • AWS CloudFront: CDNサービス(コンテンツ配信ネットワーク)
  • AWS S3: ダミーオリジン用バケット(実際のコンテンツは不要)
  • CloudFront Functions: リダイレクト処理(軽量なJavaScript関数)

💰 予想コスト

  • S3: ほぼ無料(ダミーバケットなので)
  • CloudFront: 月間1GB転送で約$0.085
  • Functions: 月間100万リクエストで約$0.60

合計: 月額約$0.7(約100円)程度


🆚 nginxサーバー構築との比較

nginxでリダイレクトサーバーを構築する場合:

1
2
3
4
5
server {
    listen 80;
    server_name example1.com;
    return 301 https://example2.com$request_uri;
}

必要な作業:

  • EC2インスタンスの起動・設定
  • nginxのインストール・設定
  • SSL証明書の設定
  • ファイアウォール設定
  • 定期的なセキュリティアップデート
  • サーバーの監視・メンテナンス

CloudFront + S3の場合:

  • AWSコンソールでの設定のみ
  • サーバー管理不要
  • 自動スケーリング
  • 99.99%の可用性保証

🚀 実装手順

1. S3バケットの作成

CloudFrontのオリジンとして使用するダミーS3バケットを作成します。

💡 なぜS3バケットが必要? CloudFrontは必ずオリジン(元のコンテンツがある場所)が必要です。実際のコンテンツは不要ですが、CloudFrontの仕様上、S3バケットをオリジンとして設定する必要があります。

S3バケット作成

手順:

  1. AWSコンソールにログイン
  2. 「S3」サービスを検索して選択
  3. 「バケットを作成」ボタンをクリック
  4. バケット名を入力(例: redirect-dummy-bucket-2024
  5. リージョンを選択(お住まいの地域に近い場所)
  6. 「パブリックアクセスをブロック」の設定はデフォルトのまま
  7. 「バケットを作成」をクリック

⚠️ 注意: バケット名は全世界で一意である必要があります。日付やランダムな文字列を含めることをお勧めします。


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

CloudFrontディストリビューションを作成して、リダイレクト機能を設定します。

CloudFront開始

手順:

  1. AWSコンソールで「CloudFront」サービスを検索して選択
  2. 「ディストリビューションを作成」ボタンをクリック

S3選択

オリジン設定:

  1. 「オリジンドメイン」で上記で作成したS3バケットを選択
  2. 「オリジンアクセス」は「パブリック」のまま
  3. 「S3バケットアクセス」は「はい、OAIを使用」を選択
  4. 「新しいOAIを作成」をクリック

💡 OAIとは? Origin Access Identity(オリジンアクセスアイデンティティ)の略で、CloudFrontがS3バケットにアクセスするための認証情報です。

WAF設定

WAF設定:

  • 「AWS WAF」は「なし」を選択
  • サイトクローズ用のリダイレクトでは、セキュリティ機能は不要です

その他の設定:

  • デフォルトルートオブジェクト: 空白のまま(リダイレクト専用なので不要)
  • コメント: 「サイトクローズ用リダイレクト」など分かりやすい名前を入力
  • 価格クラス: 「すべてのエッジロケーション」を選択(デフォルト)

3. デプロイ完了まで待機

CloudFrontディストリビューションの作成が完了したら、デプロイが完了するまで待機します。

確認方法:

  1. CloudFrontコンソールの「ディストリビューション」一覧に戻る
  2. 作成したディストリビューションの「ステータス」を確認
  3. 「最終変更日」が「Deploying」から実際の日付に変わるまで待機(通常5-15分)

⏰ 待機時間: 通常5-15分程度かかります。この間は他の作業を進めることができます。

⚠️ 重要: デプロイが完了する前に次のステップに進むと、エラーが発生する可能性があります。


4. CloudFront Functionsの作成

CloudFront Functionsは、リダイレクト処理を行う軽量なJavaScript関数です。

手順:

  1. CloudFrontコンソールの左メニューから「関数」を選択
  2. 「関数を作成」ボタンをクリック

関数作成

関数設定:

  1. 関数名: site-close-redirect など分かりやすい名前を入力
  2. 説明: 「サイトクローズ用リダイレクト」など用途を記載
  3. 「関数を作成」をクリック

関数コード

関数コードの入力:

  1. 作成した関数を選択
  2. 「開発」タブをクリック
  3. 以下のコードを入力(リダイレクト先URLを変更してください)
1
2
3
4
5
6
7
8
9
10
function handler(event) {
    var response = {
        statusCode: 301,
        statusDescription: 'Moved Permanently',
        headers: {
            'location': { value: 'https://example2.com' }
        }
    };
    return response;
}

🔧 コードの説明:

  • statusCode: 301: 永続的なリダイレクト(サイトが完全に移転したことを示す)
  • location: リダイレクト先のURL(実際のURLに変更してください)
  • Moved Permanently: 301リダイレクトの標準メッセージ

関数発行

関数の発行:

  1. 「テスト」タブで動作確認(オプション)
  2. 「発行」ボタンをクリック
  3. 確認ダイアログで「発行」をクリック

⚠️ 重要: 関数を作成しただけでは使用できません。必ず「発行」をクリックしてCloudFrontで使用可能にしてください。


5. ビヘイビアの設定

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

手順:

  1. CloudFrontコンソールの「ディストリビューション」に戻る
  2. 作成したディストリビューションのIDをクリック
  3. 「ビヘイビア」タブを選択

ビヘイビア選択

ビヘイビアの編集:

  1. 既存のビヘイビアを選択して「編集」をクリック
  2. ページを下にスクロールして「関数の関連付け」セクションを表示

関数設定

関数の関連付け:

  1. 「CloudFront Functions」を選択
  2. 「関数」ドロップダウンから作成した関数を選択
  3. 「イベントタイプ」は「ビューアーリクエスト」を選択
  4. 「保存」ボタンをクリック

💡 イベントタイプの説明:

  • ビューアーリクエスト: ユーザーがアクセスした時に実行
  • オリジンリクエスト: CloudFrontがオリジンにアクセスする前に実行
  • ビューアーレスポンス: ユーザーにレスポンスを返す前に実行
  • オリジンレスポンス: オリジンからレスポンスを受け取った後に実行

設定の保存:

  1. 「変更の確認」ページで設定を確認
  2. 「変更の保存」をクリック
  3. 再度デプロイが開始されます(5-15分程度)

6. 動作確認

設定が完了したら、リダイレクトが正常に動作することを確認します。

確認手順:

  1. CloudFrontコンソールで「最終変更日」が実際の日付になるまで待機
  2. 「ディストリビューションドメイン名」をコピー(例: d1234567890.cloudfront.net
  3. ブラウザでそのURLにアクセス
  4. 自動的にリダイレクト先のURLに移動することを確認

確認方法:

  • ブラウザ: アドレスバーがリダイレクト先URLに変わることを確認
  • 開発者ツール: Networkタブで301ステータスコードを確認
  • curlコマンド: curl -I https://your-cloudfront-domain.cloudfront.net

期待される結果:

1
2
HTTP/1.1 301 Moved Permanently
Location: https://example2.com

🔧 トラブルシューティング

よくある問題と解決方法

Q: リダイレクトが動作しない

  • A: デプロイが完了しているか確認(5-15分待機)
  • A: 関数が正しく発行されているか確認
  • A: ビヘイビアに関数が関連付けられているか確認

Q: エラーページが表示される

  • A: S3バケットの設定を確認
  • A: OAIの設定を確認
  • A: 関数のコードに構文エラーがないか確認

Q: リダイレクトが遅い

  • A: CloudFrontのキャッシュが効いている可能性(数分で改善)
  • A: サイトクローズ用なので、パフォーマンスはそれほど重要ではありません

💡 カスタマイズオプション

複数サイトのクローズ対応

複数のサイトを同時にクローズする場合の設定例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function handler(event) {
    var host = event.request.headers.host.value;
    
    // 複数のクローズサイトを一つのリダイレクト先に
    if (host === 'old-site1.com' || host === 'old-site2.com') {
        return {
            statusCode: 301,
            statusDescription: 'Moved Permanently',
            headers: {
                'location': { value: 'https://new-site.com' }
            }
        };
    }
    
    return event.request;
}

特定パスのみリダイレクト

サイトの一部ページのみをクローズする場合の設定例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function handler(event) {
    var request = event.request;
    var uri = request.uri;
    
    // 特定のパスだけリダイレクト
    if (uri === '/closed-service' || uri === '/old-page') {
        return {
            statusCode: 301,
            statusDescription: 'Moved Permanently',
            headers: {
                'location': { value: 'https://new-site.com' }
            }
        };
    }
    
    // その他のパスは通常通り処理
    return request;
}

✅ 完了

これで最小限のコストでドメインリダイレクトが設定できました!

📊 設定完了後の管理

定期的な確認事項:

  • 月額料金の確認(AWS請求書)
  • リダイレクト先URLの有効性確認
  • 必要に応じてリダイレクト先URLの変更

メリット:

  • サーバー管理不要: nginxサーバーと違ってOSアップデートやセキュリティパッチの適用が不要
  • 自動スケーリング: アクセス数が増えても自動で対応
  • 高可用性: AWSのインフラを活用した99.99%の可用性

今後の拡張:

  • カスタムドメインの設定(独自ドメインを使用する場合)
  • 複数サイトのクローズ対応(上記のカスタマイズオプション参照)

🎉 これで低コストでメンテナンス不要なドメインリダイレクトシステムが完成しました。nginxサーバーを構築するよりもはるかに簡単で、継続的な管理も不要です。

This post is licensed under CC BY 4.0 by the author.