LoginSignup
9
6

More than 3 years have passed since last update.

CloudFrontの動作をLambda@Edgeでカスタマイズする

Last updated at Posted at 2019-05-24

Lambda@Edgeとは

概要

CloudFrontのBehaviorに設定することのできるLambda functionで、CloudFrontの動作をカスタマイズすることのできる仕組みです。

lambda_at_edge_01.png

  • クライアントからリクエストを受信したとき(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を作成します。

lambda_at_edge_02.png

クライアントからのリクエスト内容に応じてOriginサーバへのリクエスト内容を変更したいため、「Origin request」をトリガーにします。

実装

Lambda function作成画面を開く 

Screen Shot 0001-05-24 at 14.05.15.png
AWS Management ConsoleでLambdaの画面を開き、右上のリージョンで「N.Virginia」を選択し「Create function」ボタンを押下します。

Lambda functionの作成

Screen Shot 0001-05-24 at 14.16.08.png
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への登録

Screen Shot 0001-05-24 at 14.51.57.png
functionの番号付きバージョンを作成するため、画面上部にあるActionsプルダウンメニューから「Publish new version」を押下します。
Screen Shot 0001-05-24 at 15.39.23.png
新しく作成されたバージョンのConfiguration画面で、trigger候補の一覧から「CloudFront」を選択します。
Screen Shot 0001-05-24 at 15.42.08.png
triggerの設定フォームが表示されるので、設定するCloudFrontのディストリビューション・ビヘイビア・イベントを選択し、「Add」ボタンを押下します。
以上で設定完了です。

動作確認

Screen Shot 0001-05-24 at 16.07.40.png
リクエストヘッダ Accept: image/webp の有無でレスポンスされる画像のContent-Typeやファイルサイズが変わることを確認します。

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6