Wisdom’s Cloud
[AWS] 1. Lambda@Edge를 사용하여 이미지 리사이징 본문
Lambda@Edge
- Lambda@Edge는 CloudFront를 통해 전달되는 콘텐츠를 사용자 지정하는 함수를 실행할 수 있게 해주는 Lambda가 확장된 컴퓨팅 서비스입니다.
- 서버를 프로비저닝하거나 관리하지 않고 한 리전 US-East-1(버지니아 북부)에서 Node.js 또는 Python 함수를 작성한 후 뷰어에게 가까운 전 세계 AWS 위치에서 해당 함수를 실행할 수 있습니다.
- 하루 몇 번의 요청에서 초당 수천 개의 요청으로 자동 확장되며, 오리진 서버가 아니라 최종 사용자에게 가까운 AWS 위치에서 요청을 처리하므로 지연 시간이 크게 단축되고 사용자 경험이 상당히 개선됩니다.
Lambda@Edge 함수를 트리거할 수 있는 CloudFront 이벤트
- Viewer request: CloudFront가 최종 사용자로부터 요청을 수신하면 실행되며, 요청된 객체가 CloudFront 캐시에 있는지를 확인합니다.
- Origin request: CloudFront가 오리진으로 요청을 전달할 경우에만 실행됩니다. 요청된 객체가 CloudFront 캐시에 저장되어 있으면 이 함수는 실행되지 않습니다.
- Origin response: CloudFront가 오리진으로부터 응답을 수신한 후 실행되어 응답의 객체를 캐싱합니다. 오리진에서 오류가 반환되는 경우에도 이 함수는 실행됩니다.
- Viewer response: 요청된 파일을 최종 사용자에게 반환하기 전에 함수가 실행됩니다. 이때 이 함수는 해당 파일이 이미 CloudFront 캐시에 있는지 여부와 상관없이 실행됩니다.
실습
구성 아키텍처
S3 / Route 53 / ACM 생성 및 구성
S3에 리사이징할 이미지를 저장하기 위해 아래와 같이 구성합니다.
Route 53을 통해 아래와 같이 사용할 도메인을 등록해둡니다.
CloudFront에서 사용할 ACM 인증서를 버지니아 북부에 생성해둡니다. (CloudFront 배포에 ACM 인증서를 할당하려면 버지니아 북부 리전에서만 인증서를 요청하거나 가져올 수 있습니다.)
CloudFront 생성 및 구성
Lambda 생성 및 구성
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"iam:CreateServiceLinkedRole",
"lambda:GetFunction",
"lambda:EnableReplication",
"cloudfront:UpdateDistribution",
"s3:GetObject",
"s3:PutObject",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Resource": "*"
}
]
}
imageresizing 코드 파일 업로드
위의 파일을 다운로드 합니다. 그리고 VirtualBox에 Ubuntu를 설치하여 아래의 명령어를 차례대로 실행합니다. (Lambda는 Linux 기반에서 실행되므로 Windows 환경의 Node.js 패키지가 제대로 돌아가지 않을 확률이 높기 때문에 VirturalBox를 통해 Ubuntu에서 진행하였습니다.)
# 노드를 설치하기에 앞서 설치에 필요한 커맨드라인 툴을 설치합니다.
~$ sudo apt update
~$ sudo apt-get install curl
# apt 패키지 매니저를 통해 우분투 패키지 저장소에 기본으로 들어가 있는 node.js를 다운로드 합니다.
~$ sudo apt install nodejs
# 노드 패키지 매니저인 npm을 다운로드 합니다.
~$ sudo apt install npm
# 노드 설치가 완료되었는지 확인합니다.
~$ nodejs -v
# 작성일(2022.02) 기준으로 노드의 버전이 v16.14.0이라면 안정 버전입니다. 하지만 안정 버전보다 낮은 버전으로 설치되었다면 버전을 업그레이드 합니다.
# npm 캐시를 제거합니다.
~$ sudo npm cache clean -f
# 노드 버전을 관리할 수 있는 n이라는 모듈을 설치합니다.
~$ sudo npm install -g n
# n 모듈을 사용해 노드를 설치합니다.
~$ sudo n stable
# 다운로드한 파일을 넣을 폴더를 생성합니다.
~$ mkdir nodejs-main
# 파일을 수정하기 위해 vim 편집기를 설치합니다.
~$ sudo apt install vim
WinSCP를 통해 로컬에서 다운로드한 파일을 생성한 폴더에 전송합니다. ~/nodejs-main 폴더 아래에 imageresizing 폴더가 존재하면 됩니다.
# vim 편집기로 index.js 파일을 수정합니다. bucket명을 자신의 버킷 이름으로 변경하면 됩니다.
~/nodejs-main/imageresizing$ sudo vim index.js
# index.js 파일에서 사용한 노드 패키지들을 설치합니다. 패키지를 설치하면 node_modules 폴더에 패키지가 설치되면서 package.json 파일에 기록을 합니다.
~/nodejs-main/imageresizing$ sudo npm install querystring
~/nodejs-main/imageresizing$ sudo npm install aws-sdk
~/nodejs-main/imageresizing$ sudo npm install sharp
~/nodejs-main/imageresizing$ sudo npm install heic-convert
# 수정된 imageresizing 폴더를 zip으로 압축합니다.
~/nodejs-main/imageresizing$ sudo zip -r ../imageresizing.zip .
압축한 파일을 다시 로컬로 전송하면, Lambda에 업로드할 코드 파일이 완성되었습니다.
Lambda@Edge 배포
확인
'AWS > Advanced' 카테고리의 다른 글
[AWS] 2. CloudFront을 사용하여 웹사이트 속도 향상 (0) | 2022.03.02 |
---|