🏒
CloudFront関数を使用してS3バケット内のファイルにインデックスドキュメントを追加する
はじめに
Amazon S3バケットを利用して静的ウェブサイトをホストする際、ディレクトリアクセスでindex.html
を自動的に表示する設定が重要です。この記事では、CloudFrontディストリビューションとCloudFront関数を使用して、S3バケットを公開せずにディレクトリへのアクセスを適切に処理する方法を解説します。
課題
静的ウェブサイトのアセットをS3バケットにデプロイし、CloudFrontディストリビューションで提供している場合、ファイル名を指定せずにディレクトリにアクセスするとエラーが発生します。例えば、/products/index.html
は機能しますが、/products/
はエラーを返します。
ソリューション
1. CloudFront関数の作成
ディレクトリがアクセスされた際に、リクエストURLにindex.html
を追加するCloudFront関数を作成します。
function handler(event) {
var request = event.request;
var uri = request.uri;
// ディレクトリへのアクセスをチェック
if (uri.endsWith('/')) {
request.uri += 'index.html';
} else if (!uri.includes('.')) {
request.uri += '/index.html';
}
return request;
}
2. CloudFrontディストリビューションへの関数追加
作成したCloudFront関数をCloudFrontディストリビューションのビューアリクエストとして追加します。
手順
-
AWSマネジメントコンソールでCloudFrontにアクセス
- CloudFrontディストリビューションを選択し、関数を作成してデプロイします。
- ディストリビューションの動作設定で、ビューアリクエスト関数として設定します。
-
ディストリビューションの設定を確認・更新
- デフォルトのルートオブジェクトが
index.html
に設定されていることを確認します。
- デフォルトのルートオブジェクトが
まとめ
このソリューションにより、S3バケットを公開せずに、ファイル名を指定せずにディレクトリにアクセスできるようになります。CloudFront関数を使用することで、ディレクトリへのアクセス時に自動的にindex.html
を追加し、適切なコンテンツを提供できます。
Discussion