この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチハ、千葉です。
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アドレスなどに従ってオリジンを変更できるので、応用範囲は無限大ですね。