こんにちは!
企業や商品宣伝用のHPなどの、静的なウェブサイトの公開に S3 と CloudFront を使用している方は多いのではないでしょうか。
ただ、CloudFront と S3 で公開しようとすると、サブディレクトリのルートオブジェクトの指定方法に悩むかと思います。例えば下記のような指定を行うと 400 系のレスポンスが CloudFront から返却されるかと思います。
https://example.cloudfront.net/aboutus/
しかし、ユーザーに対して下記のようにファイル名も付与してアクセスしてもらうのは少し乱暴な気もします。
https://example.cloudfront.net/aboutus/index.html
本記事では、ファイル名を指定せずともルートオブジェクト( index.html )が見えるようにできる Lambda@Edge を使用したテクニックを紹介します。
EC2 などのサーバーインスタンスの解説を行う記事ではありません。
処理のワークフローは下記のようになります。
Lambda@Edge は、S3 へアクセスを行う直前に実行されます。詳しい実行内容は後述します。
Lambda@Edge では、リクエストの URL の末尾が / で終わっている場合に、末尾に index.html を付与し S3 へリクエストを出すように調整を行います。
'use strict';
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const olduri = request.uri;
// 末尾が/で終わっている場合はindex.htmlを付与してリクエスト
const newuri = olduri.replace(/\/$/, '\/index.html');
// S3へのリクエストのURLを差し替える
request.uri = newuri;
return callback(null, request);
};
上記の Lambda 関数を指定の CloudFront の Origin Request へデプロイしてください。これにより、ユーザーが index.html を指定せずに index.html を参照できるようになります。
このテクニックを応用すると、例えば index.pdf、index.csv の指定も可能となりますので、適宜シーンに応じてソースコードを調整してください。
Lambda@Edge を使用すると、ちょっとしたウェブサイトのホスティングを高い可用性で楽に構築できます。
格安の共有サーバーではスパイクアクセス対応が難しいので、ぜひ AWS の CloudFront + S3 を活用してください。
本記事のような簡易的な構成でしたら、10万以下でサーバー構築を承ることも可能です。お気軽にご相談ください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎