A company has a complex web application that leverages Amazon CloudFront for global scalability and performance. Over time, users report that the web application is slowing down.
The company's operations team reports that the CloudFront cache hit ratio has been dropping steadily. The cache metrics report indicates that query strings on some URLs are inconsistently ordered and are specified sometimes in mixed-case letters and sometimes in lowercase letters.
Which set of actions should the solutions architect take to increase the cache hit ratio as quickly possible?
- A. Deploy a Lambda@Edge function to sort parameters by name and force them to be lowercase. Select the CloudFront viewer request trigger to invoke the function.
- B. Update the CloudFront distribution to disable caching based on query string parameters.
- C. Deploy a reverse proxy after the load balancer to post process the emitted URLs in the application to force the URL strings to be lowercase.
- D. Update the CloudFront distribution to specify case-insensitive query string processing.
한글 번역
한 회사는 글로벌 확장성과 성능을 위해 Amazon CloudFront를 활용하는 복잡한 웹 애플리케이션을 보유하고 있습니다. 시간이 지남에 따라 사용자는 웹 응용 프로그램이 느려지고 있다고보고합니다.
이 회사의 운영 팀은 CloudFront 캐시 적중률이 꾸준히 떨어지고 있다고보고합니다. 캐시 메트릭 보고서는 일부 URL의 쿼리 문자열이 일관되게 정렬되지 않고 때로는 대문자로 지정되고 때로는 소문자로 지정됨을 나타냅니다.
솔루션 설계자가 캐시 적중률을 최대한 빨리 높이기 위해 수행해야 하는 작업 집합은 무엇입니까?
- A. Lambda@Edge 함수를 배포하여 매개 변수를 이름별로 정렬하고 강제로 소문자로 만듭니다. CloudFront 뷰어 요청 트리거를 선택하여 함수를 호출합니다.
- B. CloudFront 배포를 업데이트하여 쿼리 문자열 매개 변수를 기반으로 캐싱을 사용하지 않도록 설정합니다.
- C. 부하 분산 장치 다음에 역방향 프록시를 배포하여 응용 프로그램에서 내보낸 URL을 사후 처리하여 URL 문자열을 소문자로 만듭니다.
- D. CloudFront 배포를 업데이트하여 대/소문자를 구분하지 않는 쿼리 문자열 처리를 지정합니다.
- A. Deploy a Lambda@Edge function to sort parameters by name and force them to be lowercase. Select the CloudFront viewer request trigger to invoke the function.
Lambda@Edge
사용자에게 더 가까운 위치에서 코드 실행
Lambda@Edge는 Amazon CloudFront의 기능 중 하나로서 애플리케이션의 사용자에게 더 가까운 위치에서 코드를 실행하여 성능을 개선하고 지연 시간을 단축할 수 있게 해 줍니다. Lambda@Edge를 사용하면 전 세계 여러 위치에 있는 인프라를 프로비저닝하거나 관리하지 않아도 됩니다. 사용한 컴퓨팅 시간만큼만 비용을 지불하고, 코드가 실행되지 않을 때는 요금이 부과되지 않습니다.
Lambda@Edge는 서버 관리 부담 없이 웹 애플리케이션을 전 세계로 배포하고 성능을 개선하여 효과를 향상해 줍니다. Lambda@Edge는 Amazon CloudFront 콘텐츠 전송 네트워크(CDN)에 의해 생성된 이벤트에 대한 응답으로 코드를 실행합니다. 코드를 업로드하기만 하면 AWS Lambda가 최종 사용자와 가장 가까운 AWS 로케이션에서 뛰어난 가용성으로 코드를 실행하고 확장하는 데 필요한 모든 작업을 처리합니다.
Lambda@Edge 사용 사례
오늘날 비즈니스 사용 사례에 따라 고객이 이미 구현하고 있는 솔루션은 많습니다. 하지만 Lambda@Edge를 사용하는 이점은 다음과 같이 4가지 카테고리로 나눌 수 있습니다.
1. 콘텐츠 배포 성능: Lambda@Edge 사용에 따른 가장 큰 이점은 콘텐츠가 원본(Origin)에서 반환될 때 캐싱될 가능성을 높이거나, 혹은 이미 캐싱된 콘텐츠의 유용성을 높여 캐시 히트 비율을 개선하는 것입니다. 이렇게 캐시 히트 비율이 개선되면 캐시 미스로 인한 지연 시간이 사라져 애플리케이션 성능이 향상됩니다. 다음은 Lambda@Edge를 사용해 캐시 히트 비율을 개선할 수 있는 몇 가지 예입니다.
- 응답에서 캐시 제어 헤더를 추가하거나 수정합니다.
- 오리진에서 3xx 응답 시 리디렉션을 따르도록 구현하여 최종 사용자 응답 지연 시간을 줄입니다.
- 쿼리 문자열 또는 사용자 에이전트 정규화를 사용하여 요청 변수를 줄입니다.
- 요청 헤더, 쿠키 또는 쿼리 문자열의 속성에 따라 동적으로 다른 오리진으로 라우팅합니다.
2. 동적 콘텐츠 생성: Lambda@Edge에서는 요청 또는 응답 속성에 따라 사용자 지정 콘텐츠를 동적으로 생성할 수 있습니다. 예를 들면 다음과 같은 작업이 가능합니다.
- 요청 속성에 따른 이미지 크기를 조정합니다.
- Mustache 같이 로직이 없는 템플릿을 기준으로 페이지를 렌더링합니다.
- A/B 테스트를 합니다.
- 만료되었거나 시간이 지난 리소스에 대한 요청은 모두 302/301 리디렉션 응답을 생성합니다.
3. 보안: Lambda@Edge는 사용자 지정 인증 및 권한 부여를 처리할 때도 사용할 수 있습니다. 다음은 몇 가지 사용 사례입니다.
- 액세스 제어가 적용되는 사용자 지정 오리진에 대한 요청에 서명을 추가합니다.
- JWT/MD5/SHA 토큰 해시를 사용하는 등 최종 사용자 토큰 인증을 구성합니다.
- 봇 탐지를 설정합니다.
- HSTS 또는 CSP 보안 헤더를 추가합니다.
4. 원본(Origin) 독립성: 일부 시나리오에서는 오리진에 요청 및 응답 로직이 추가로 필요합니다. 이때 오리진 서버에서 실행되는 코드로 로직을 구현하는 대신 CloudFront에서 Lambda@Edge 함수를 실행하여 더욱 원활한 솔루션을 구현할 수 있습니다. 예를 들어 로직을 구현하면 다음과 같은 작업이 가능합니다.
- .html 파일 확장자를 제거한 고유 URL(Pretty URL)을 생성합니다.
- 오리진 요청에 대한 인증 및 권한 부여를 관리합니다.
- 오리진 디렉터리 구조에 맞게 URL 또는 요청을 조작합니다.
- 사용자 지정 로드 밸런싱 및 장애 조치 로직을 구현합니다.
예: 쿼리 문자열 파라미터를 정규화하여 캐시 적중률 향상
다음 예제에서는 CloudFront가 요청을 오리진에 전달하기 전에 쿼리 문자열을 다음과 같이 변경하여 캐시 적중률을 향상하는 방법을 보여 줍니다.
- 파라미터 이름을 기준으로 키-값 페어를 알파벳순으로 정렬
- 키-값 페어의 대/소문자를 소문자로 변경
from urllib.parse import parse_qs, urlencode
def lambda_handler(event, context):
request = event['Records'][0]['cf']['request']
'''
When you configure a distribution to forward query strings to the origin and
to cache based on a whitelist of query string parameters, we recommend
the following to improve the cache-hit ratio:
Always list parameters in the same order.
- Use the same case for parameter names and values.
This function normalizes query strings so that parameter names and values
are lowercase and parameter names are in alphabetical order.
For more information, see:
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/QueryStringParameters.html
'''
print("Query string: ", request["querystring"])
# Parse request query string to get js object
params = {k : v[0] for k, v in parse_qs(request['querystring'].lower()).items()}
# Sort param keys
sortedParams = sorted(params.items(), key=lambda x: x[0])
# Update request querystring with normalized
request['querystring'] = urlencode(sortedParams)
return request
참조 문서
Lambda@Edge 예제 함수 - Amazon CloudFront
엣지 컴퓨팅을 위한 Lambda@Edge 활용 모범 사례 | Amazon Web Services 한국 블로그
엣지 컴퓨팅| CDN, 글로벌 서버리스 코드, 배포 | AWS Lambda@Edge (amazon.com)
'[AWS] > AWS SAP EXAMTOPICS' 카테고리의 다른 글
[AWS][SAP] Question 38 (1) | 2022.09.30 |
---|---|
[AWS][SAP] Question 37 (1) | 2022.09.29 |
[AWS][SAP] Question 36 (0) | 2022.09.28 |
[AWS][SAP] Question 35 (0) | 2022.09.27 |
[AWS][SAP] Question 33 (1) | 2022.09.23 |
[AWS][SAP] Question 32 (0) | 2022.09.22 |
[AWS][SAP] Question 31 (0) | 2022.09.21 |
[AWS][SAP] Question 30 (0) | 2022.09.20 |
댓글