🦮

[AWS]URL1→URL2のようなリダイレクトをAWSサービスのみで作成する

2025/01/27に公開

概要

題名通りURL1→URL2にリダイレクトする仕組みを3種類ほど検証した。

用途

URL1のWebサイトをURL2に変更する要件が出る。
URL1は廃止したいが、リンクはどこかに残っている可能性がありリダイレクトしたい時など

検証1 S3を静的ウェブサイトホスティング

S3のみでリダイレクトする設定が可能。
下位理由があり、採用は難しいと判断した。

  • アクセスがhttpのみ
    • リダイレクト後はhttpsだが、バケットウェブサイトエンドポイントはhttp


https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/how-to-page-redirect.html#redirect-endpoint-host

検証2 検証1とCloudFrontの組み合わせ

CloudFrontのオリジンに検証1で作成したバケットウェブサイトエンドポイントを登録する方法。

検証1同様下位理由があり、採用は難しいと判断した。

  • CloudFrontからS3へのアクセスがhttpのみ

上記点を妥協と考えるならば検証1よりも追加コストがかかるが、メリットが多い。

  • 入口であるCloudFrontにはhttpsでアクセスが可能
  • WAFを導入が可能
  • キャッシュ、リクエストポリシーの設定が可能
    etc...

検証3 CloudFront Functions

CloudFunctionsを使用した方法。

検証1, 2に比べデメリットが少ない。
JSコーディングによる工数の増加くらいと感じたため採用。

実装

CloudFront

  • 空のS3を作成し、ダミーのオリジンとして作成する
  • デフォルトビヘイビアにオリジンを登録する

CloudFront Functions

  • ランタイムはcloudfront-js-2.0を指定する
  • コードは下記を参考(if節など不要な場合は適時修正)
function handler(event) {
    const request = event.request;
    const headers = request.headers;
    const host    = headers.host.value;

    if (host === '[テストドメイン]') {
        return {
            statusCode: 301,
            statusDescription: 'Moved Permanently',
            headers: {
                location: {
                    value: '[リダイレクトドメイン]' + request.uri
                }
            }
        };
    }
    return request;
}
  • 関数を発行する

  • ディストリビューションに関連付ける

  • テストドメインにアクセスして、リダイレクトされていることを確認

余談

CloudFront Functionsの代わりにLambda@Edge を使用することもできそう。
今回はユースケースに当てはまらないためLambda@Edge は検証しなかった。
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/edge-functions-choosing.html

参考

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/example-function-redirect-url.html

https://note.com/hirozki/n/n804e9500a8bb

Discussion