Lambda@Edgeとは
概要
CloudFrontのBehaviorに設定することのできるLambda functionで、CloudFrontの動作をカスタマイズすることのできる仕組みです。
- クライアントからリクエストを受信したとき(Viewer request)
- オリジンサーバへリクエストする前(Origin request)
- オリジンサーバからレスポンスを受信したとき(Origin response)
- クライアントへレスポンスを送信する前(Viewer response)
以上4つのイベントの発生時に実行することができます。
Lambda@Edgeの制限
通常のLambda functionとは異なる次のような制限があります。
- 実行できるのはNorth Virginia(us-east-1)リージョンのFunctionのみ
- 実行できるのは番号付きバージョンのみ(${LATEST}やエイリアスは不可)
- 使用可能なランタイムはNode.jsのみ
クライアントに応じてレスポンス内容を変えるFunctionの作成
以前、S3にアップロードされたJPEG画像をWebPに変換する機能を作成しました。
クライアントから送信されるリクエストヘッダ「Accept」の値に応じてJPEG画像とWebP画像を返し分けるFunctionを作成します。
クライアントからのリクエスト内容に応じてOriginサーバへのリクエスト内容を変更したいため、「Origin request」をトリガーにします。
実装
Lambda function作成画面を開く
AWS Management ConsoleでLambdaの画面を開き、右上のリージョンで「N.Virginia」を選択し「Create function」ボタンを押下します。
Lambda functionの作成
Runtimeは必ずNode.jsを選択します。
Execution roleは「AWSLambdaEdgeExecutionRole」テンプレートをコピーして作成するのが簡単です。
コードの記述
exports.handler = async (event, context) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
if (
headers['accept'] //Acceptヘッダがあり
&& headers['accept'][0].value.match(/image\/webp/i) //Acceptヘッダに image/webp が設定されていて
&& request.uri.match(/path\/to\/image\/.+\.jpg$/) //リクエストURIが /path/to/image/〜.jpg の場合
) {
// リクエストURIの末尾に .webp を付加する
request.uri = request.uri + '.webp';
}
return request;
};
リクエストヘッダ「Accept」の値に応じてオリジンへのリクエストURIを変更するコードをこのように作成しました。
eventオブジェクトの構造はAWSの公式ドキュメントに詳しい説明があります。
参考: Lambda@Edge イベント構造
CloudFrontへの登録
functionの番号付きバージョンを作成するため、画面上部にあるActionsプルダウンメニューから「Publish new version」を押下します。
新しく作成されたバージョンのConfiguration画面で、trigger候補の一覧から「CloudFront」を選択します。
triggerの設定フォームが表示されるので、設定するCloudFrontのディストリビューション・ビヘイビア・イベントを選択し、「Add」ボタンを押下します。
以上で設定完了です。
動作確認
リクエストヘッダ Accept: image/webp
の有無でレスポンスされる画像のContent-Typeやファイルサイズが変わることを確認します。