Lambda@Edgeでオリジンを書き換えてみた

2018.09.03

コンニチハ、千葉です。

Lambda@Edgeは、エッジローケーション側でコードを実行できます。ヘッダに従ってURLを変えたり(A/Bテスト)、POSTの中身を確認してkinesisに送ってログをS3に保存(集計用のログ保存)したり、夢は超無限大です。

今回は、Lambda@Edgeでオリジンを変更するということをやってみました。想定されるユースケースとしては、CloudFrontのオリジンを一番近いロケーションのELBやS3に変更したり、A/Bテストでオリジンごと変更したりなど、色々できるかなと思います。

ということで、早速やってみました。

前提

  • CloudFrontが作成されていること

やってみた

Lambda@Edgeのため、バージニアにLambda関数を作成します。 コードは以下となります。カスタムオリジンを想定して記載しています。S3オリジンの場合は、CloudFrontから取得されるJSONが変わるので別途ご確認ください。

'use strict';

exports.handler = (event, context, callback) => {
     console.log(JSON.stringify(event));

     const request = event.Records[0].cf.request;
     const domainName = 'www.chiba42.net';
     request.origin.custom.domainName = domainName;
     request.headers['host'] = [{key: 'host', value: domainName}];

     console.log(JSON.stringify(request));


    callback(null, request);
};

作成したLambdaのバージョンを作成して、CloudFrontに紐付けます。

動作確認

ちょっとハマったんですが、CloudFront側のオリジンの設定を必ず行なってください。CloudFrontでオリジンの設定をし、かつ疎通ができないとLambda@Edge自体が実行されない状態でした。

まず、Lambda@Edgeを設定しない状態でCloudFrontにアクセスしてみます。CloudFrontのオリジンをDevelopers.IOにしてたので、そちらにリダイレクトされました。

次に、Lambda@Edgeを有効にしてアクセスしてみます。

Lambda@Edgeで書き換えたサイトにアクセスできるようになりました。

最後に

Lambda@Edgeでオリジンを変更するということをやってみました。うまく使うとBlue-Greenデプロイにも利用できそうです。ヘッダやクッキー、IPアドレスなどに従ってオリジンを変更できるので、応用範囲は無限大ですね。

参考

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html#lambda-examples-content-based-routing-examples