Lambda@Edgeでオリジンを書き換えてみた
コンニチハ、千葉です。
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アドレスなどに従ってオリジンを変更できるので、応用範囲は無限大ですね。