![見出し画像](https://assets.st-note.com/production/uploads/images/130990003/rectangle_large_type_2_f5f8800e5aaf955300d694f0f895cb39.png?width=1200)
CloudFront Functionsでリダイレクトする
CloudFrontでのリダイレクトをCloudFront Functionsでやってみました。
構成
構成としては以下の通り。オリジンを設定しないとCloudFrontのディストリビューションが作れないので、S3を設定しています。
![](https://assets.st-note.com/img/1708009300721-J9bUvHkcX5.png?width=1200)
オリジンS3バケットの作成
まずは、オリジンとなるS3バケットを作成します。
![](https://assets.st-note.com/img/1708006521469-D6MK0RaF2y.png?width=1200)
バケット名を入力して、それ以外はデフォルトで大丈夫です。
![](https://assets.st-note.com/img/1708006535584-RBq4xaIr5Z.png?width=1200)
バケットが作成されたら、バケットの詳細画面に入ります。
![](https://assets.st-note.com/img/1708006551216-ck5EYxPBtG.png?width=1200)
アクセスが来た際に表示するHTMLファイルをアップロードしておきます。
![](https://assets.st-note.com/img/1708072047648-anDyPfQvfG.png?width=1200)
![](https://assets.st-note.com/img/1708072080070-B9yvxuHLMV.png?width=1200)
CloudFrontオリジンアクセスコントロールの作成
次は、CloudFrontからS3バケットにアクセスするためのオリジンアクセスコントロール(以降OAC)を作成します。CloudFrontのコンソールから、セキュリティのオリジンアクセスに遷移します。コントロール設定を作成ボタンをクリックします。
![](https://assets.st-note.com/img/1708006594435-xjZ60RJvYC.png?width=1200)
OACの名前を入力し、オリジンタイプはS3に設定してCreateボタンをクリックしてOACを作成します。
![](https://assets.st-note.com/img/1708006645573-1RikbugnLY.png?width=1200)
![](https://assets.st-note.com/img/1708006653949-30soH4QSnL.png?width=1200)
CloudFrontディストリビューションの作成
次は、CloudFrontのディストリビューションを作成します。
![](https://assets.st-note.com/img/1708006676885-wkW0an59Le.png?width=1200)
Origin domainには、作成したS3バケットを指定します。名前は、S3バケットを選択した際に自動で設定されますので、そのままでも変えてもどちらでも良いです。本記事ではそのままで行きます。
![](https://assets.st-note.com/img/1708006683268-70QDCo2loR.png?width=1200)
オリジンアクセスは、Origin access control settings (recommended)を選択し、先ほど作成したOACを選択します。
![](https://assets.st-note.com/img/1708006691155-tTeV9s4DQh.png?width=1200)
WAFは無しで進めます。
![](https://assets.st-note.com/img/1708006702005-yQLMm7qU4w.png?width=1200)
料金クラスは、北米、欧州、アジア、中東、アフリカを選択にしておきます。
![](https://assets.st-note.com/img/1708006733032-yrbj82md6l.png?width=1200)
その他はデフォルトのままで、ディストリビューションを作成ボタンをクリックして、ディストリビューションを作成します。
![](https://assets.st-note.com/img/1708006745356-wt9Zt68xrg.png?width=1200)
作成されたらポリシーをコピーボタンが黄色の帯の右側にあるので、クリックしてポリシーをコピーしておきます。
![](https://assets.st-note.com/img/1708006753904-B5Bm9LdUjl.png?width=1200)
オリジンS3バケットのバケットポリシーを設定
S3バケットに戻り、アクセス許可のタブのバケットポリシーの編集ボタンをクリックします。
![](https://assets.st-note.com/img/1708006784748-SLQKKicKbK.png?width=1200)
先ほど、CloudFrontのディストリビューションを作成後にコピーしたポリシーを、ポリシー欄にペーストして、変更の保存ボタンをクリックします。
![](https://assets.st-note.com/img/1708006835181-UtIRYib4pR.png?width=1200)
![](https://assets.st-note.com/img/1708006856231-Fun02KTxmj.png?width=1200)
CloudFrontとS3の連携を確認
前述までで、CloudFrontのURLで、S3に配置したHTMLファイル見えるようになっています。CloudFrontのURLをコピーします。
最終変更日がデプロイになっている場合は、まだ作成されていないため、日付が表示されるまで待ちます。
![](https://assets.st-note.com/img/1708073141851-KiW4pXMHt5.png?width=1200)
URLの末尾に/index.htmlをつけて、ブラウザからアクセスしてみます。
※ここでは、デフォルトルートオブジェクトをindex.htmlで設定していないため、URLの末尾につける必要があります。
以下のような形で、S3に配置したファイルの内容が見れれば、確認完了です。
![](https://assets.st-note.com/img/1708006906823-pyRBAk4vtP.png?width=1200)
無事に表示されたので、CloudFrontとS3の連携は無事にできたことが確認できました。
CloudFrontのリダイレクト関数の作成
最後に、CloudFront Functionsを作成しますので、関数の画面に遷移し、関数を作成ボタンをクリックします。
![](https://assets.st-note.com/img/1708006945743-VRoK7XYBIJ.png?width=1200)
名前を入力し、Runtimeにcloudfront-js-2.0を選択し関数を作成をクリックします。cloudfront-js-1.0でも出来ますが、今であればcloudfront-js-2.0の方が古い書き方で書かなくて済むので良いかと思います。
![](https://assets.st-note.com/img/1708006971299-uSOGjzndxB.png?width=1200)
作成されたら下部のタブまでスクロールします。
![](https://assets.st-note.com/img/1708007040983-9CrpESAJPN.png?width=1200)
作成されたら下部の構築タブで、リダイレクト用のコードを記述して、変更を保存ボタンをクリックします。
![](https://assets.st-note.com/img/1708080505146-g8Iinzlfn1.png?width=1200)
今回はコードとしては以下を記述しました。
function handler(event) {
const uri = event.request.uri
if (isNotRedirect(uri)) return event.request
const newUri = getNewUri(uri)
return {
statusCode: 301,
statusDescription: 'Moved Permanently',
headers: { location: { value: newUri } },
}
}
function isNotRedirect(uri) {
return uri === '/' || uri === '/index.html'
}
function getNewUri(uri) {
if (uri === '/page1.html') {
return 'https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Introduction.html'
}
return 'https://aws.amazon.com/jp/'
}
以下の通りのリダイレクトになっています。
/ or /index.html
リダイレクトしない
/page1.html
CloudFrontのドキュメントにリダイレクトする
それ以外
AWSのトップページにリダイレクトする
発行タブをクリックして、関数を発行ボタンをクリックします。
![](https://assets.st-note.com/img/1708007083325-X5iikpBHQI.png?width=1200)
関連付けられているディストリビューションのエリアが表示されるので、関連付けを追加ボタンをクリックします。
![](https://assets.st-note.com/img/1708007091526-v0kbXOh7PT.png?width=1200)
ディストリビューションに、作成したCloudFrontディストリビューションを選択します。イベントタイプにはViewer requestを選択し、キャッシュビヘイビアにDefaultを選択して、関連付けを追加ボタンをクリックします。
![](https://assets.st-note.com/img/1708007101497-04Wp5nmMdl.png?width=1200)
![](https://assets.st-note.com/img/1708007112154-AFzWFouXAI.png?width=1200)
CloudFrontの関数一覧に戻ると、ステータスが更新中になっているので、しばらく待ちます。
![](https://assets.st-note.com/img/1708007120522-Cjs6bBRx8i.png?width=1200)
ステータスがデプロイ済みになったら完了です。
![](https://assets.st-note.com/img/1708007215602-pRZBwirxuk.png?width=1200)
リダイレクト処理の確認
最後に、リダイレクト処理が想定通りにされているか確認します。確認の前にキャッシュの削除はしてから確認します。
まずは、/index.htmlにアクセスして、S3に配置してあるindex.htmlが表示されるか確認します。
![](https://assets.st-note.com/img/1708007244117-xkZjmazlhS.png?width=1200)
次に、/page1.htmlにアクセスして、CloudFrontのドキュメントが表示されるか確認します。
![](https://assets.st-note.com/img/1708007251579-hz95xTS52Q.png?width=1200)
最後に、page2.htmlなど、適当なパスを指定してアクセスし、AWSの画面が表示されるか確認します。
![](https://assets.st-note.com/img/1708007258488-Ep8KAFAh3V.png?width=1200)
事後処理
今回作成したリソースの削除は以下になります。
作成したCloudFrontのディストリビューションを削除する
無効にする
最終変更日がデプロイから日付に変わるまで待つ
削除する
作成したCloudFrontのオリジンアクセスを削除する
作成したCloudFrontの関数を削除する
S3バケットを削除する
空にする
削除する
まとめ
関数を作成して設定するだけで実現できるのは、意外と楽だなと感じました。Apache、Nginxでのリダイレクト処理などは、対象が増えると見通しが悪くなることと、正規表現などで実現しないといけないこともあり、複雑になってくると、理解が難しくなってきますが、コードであれば自動テストも書けると思うので、テストのしやすさもあるかもしれません。
IaC版も作ってみました。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?