Lambda@Edge で CloudFront のオリジンを動的に切り替える

AWS のドキュメントに記載されているサンプル をそのままそっくりコピれば簡単に実現できた。

下記は CloudFront へのアクセス元 IP を確認して、参照するオリジンを動的に切り替えてるところ。 オリジンリクエストイベントをトリガーとしてやれば良い。

exports.lambda_handler = async (event, context, callback) => {
    const request = event.Records[0].cf.request;

    console.log(util.inspect(request, {
        depth: null
    }));

    const client_ip = event["Records"][0]["cf"]["request"]["clientIp"];

    if (await is_backend_ip(client_ip)) {
        // オリジン変更
        request.origin = {
            custom: {
                domainName: ECS_WP_TASK_DNS_NAME,
                customHeaders: {},
                path: '',
                port: 80,
                protocol: 'http', // TODO Use HTTPS
                readTimeout: 30,
                keepaliveTimeout: 5,
                sslProtocols: ['TLSv1', 'TLSv1.1', 'TLSv1.2']
            }
        };

        // Host ヘッダも書き換える場合
        // request.headers['host'] = [{ key: 'host', value: 'example.com'}];

        console.log(`Rewrited origin: ${ECS_WP_TASK_DNS_NAME}`);
    }

    callback(null, request);
};

CloudFront への設定方法などはこちらと同様。

コード全体

ecs-staticpress/app.js at master · hiraro/ecs-staticpress