Platform마다 응답이 다른 경우 CloudFront를 효율적으로 캐시 HIT시키는 방법

3695 단어 CloudFrontLambda@Edge

요구사항



이번 Platform마다 응답이 다르다는 것은, iPhone, Android, (PC)마다 어플리케이션 서버가 다른 응답 돌려주는 경우를 상정한다.

문제점



애플리케이션 서버 측에서 UA를 판정하여 응답을 생성하고 있기 때문에
CloudFront에서 준비되어 있는 아래의 플래그만으로는 판정이 어렵다.
CloudFront-Is-Desktop-Viewer
CloudFront-Is-Mobile-Viewer
CloudFront-Is-SmartTV-Viewer
CloudFront-Is-Tablet-Viewer

디바이스 유형에 따라 객체를 캐시하도록 CloudFront 설정

결론



1. Lambda@Edge를 사용하여 UA를 다시 씁니다.

'use strict';
exports.handler = (event, context, callback) => {

    // Get request and request headers
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    if (headers['User-Agent']) {
        headers['User-Agent'] = headers['User-Agent'][0].match(/(Android|iPhone)/)? RegExp.$1: 'Other';
    }
    callback(null, request);
}

2. CloudFront Whitelist HeadersUser-Agent 지정


경고가 나오지만 무시. 참고

요약



경고에도 있지만, UA를 그대로 캐시하면 UA마다의 캐시가 되어 버려 캐시의 HIT 효율이 떨어지기 때문에, UA를 간략화시켜 효율적으로 Cloudfront를 활용할 수 있다.
다른 커스텀 헤더가 아니고, UA에 다시 채운 것은 어플리케이션 서버측의 코드를 변경시키고 싶지 않았기 때문.

좋은 웹페이지 즐겨찾기