DynamoDB / Lamda 이용하여 Serverless 서버 배포하기, 실제 현업에서 쓰이는 구조의 서버 배포하기
이 글은
2022년 12월 7일 ~ 2022년 12월 18일 에 원티드에서 프리온보딩 백엔드 챌린지에 참가하여 들은 강의를 정리한 것입니다.
SNS의 이미지 처리 아키텍쳐
- 해당 아키텍처를 고른 이유
- 대부분 SNS라는 도메인을 잘 알고 있기때문에 이해하기 쉬울 것
- 사진이 있기 때문에 부하가 잦은 서비스 중 하나
- 사용하게 될 AWS 서비스
- ELB, EB (EC2), S3, SQS, CloudFront, SSM
- 구성 언어 및 프레임워크
- NodeJS V14, Serverless (https://serverless.com/)
1. 서버(EC2) 자제척으로 처리하기
- 이미지 업로드
- 서버는 썸네일을 만들어 S3에 저장
- 다른 사용자가 해당 유저의 썸네일을 부르면 S3에서 해당 파일을 가지고 와서 주소를 전달
2. Elastic Load Balancer를 연결하고 Auto Scaling을 적용하여 부하에 대응하기
- 이미지 업로드
- ELB를 통해 적절한 인스턴스로 요청을 보낸 뒤 썸네일을 만들어 S3에 저장
- 다른 사용자가 해당 유저의 썸네일을 부르면 S3에서 해당 파일을 가지고 와서 주소를 전달
(실습)
어떤 것을 가지고 모니터링 할 것이냐 설정.
→ 환경 생성. (오래걸림)
보안에서 IAM 역할 : 권한을 관리할 수 있는 곳.
management console에 가면 권할을 볼 수 있음.
오토 스케일링 되는 것을 보여주고 싶었으나 몇 십개 request로는 움직이지 않아서 보여주기 어려운 상황. pass
직방에서 중개사들이 사진을 올리는데, 이 이미지는 용량이 크니까 이것을 썸네일 처리한다.
3 - 1. 람다와 메세지 큐를 통해 비동기로 처리하기
- 이미지를 하기 위해 서버로 s3 presigned URL 요청 : 이용자들이 server?를 거치지 않고 바로 업로드하는 과정
- 전달받은 Presigned URL로 이미지 업로드
- 업로드 된 객체의 이름을 서버로 전달
- 서버는 메세지 큐로 해당 이름을 전달
- 메세지 큐에 쌓인 정보는 람다를 통해 썸네일을 생성
- CloudFront를 사용해서 썸네일을 캐싱
(설명)
이용자는 서버에 “나 이미지가 있어서 업로드 해야되는데 업로드 할 수 있는 url을 던져 줘” 하면,
서버는 “AWS S3에 올릴 수 있는 presigned url(그냥 링크는 보안상 업로드가 안되고, 미리 사인한 권한에 문제없는 url)을 줌
이용자는 url을 가지고 s3에 올리면
서버는 그 올린 이미지에 대한 id를 Queue로 보내줌. 그러면 뒤에 람다가 수백 개 떠있음.
람다는 결국 그 이미지를 처리하고 다시 s3에 올린다.
빨간 부분은 server일 뿐, 진짜 aws infura를 사용해야 한다.
빨간 부분은 main server
뒷 부분은 image server
람다에 올라갈 것이 image server
이미지 서버에서는 큐에 보내진 아이디를 s3에서 가져와서 썸네일 만들어서 다시 올리는 과정. (간단함, 노드 처음봐도 알 수 있음.)
image.server.zip
aws 내에 있는 infura role은 iamRole 로 정의한다.
s3같은 경우는 우리가 모든 권한을 allow하니까. 이 코드에서 s3가 이용이 되는데, 그 권한을 serverless.yml에서 설정을 해준다.
function.event는 SQS인데 queue에서 이미지가 쌓이면 람다들이 알아서 quere에 있는 걸 뽑아서 알아서 처리함.
동작 흐름 :
api 서버에서 사용자한테 전달받은 image-id를 비동기로 sqs에 보내고 큐에서 생성된 메시지를 image서버(람다서버)가 받아서 썸네일 처리해서 S3 저장
3 - 2. 람다와 S3 트리거를 통해 비동기로 처리하기
- 이미지를 하기 위해 서버로 s3 presigned URL 요청
- 전달받은 Presigned URL로 이미지 업로드
- S3 트리거를 통해 람다를 실행하여 썸네일을 생성
- CloudFront를 사용해서 썸네일을 캐싱
s3 시크릿 매니저에서 환경 주입하고 이미지 업로드 하면 썸네일 주입 시켜서 s3에 다시 업로드 하는 .
- 서버 (ec2) 자체적으로 처리하기 함.
- Elastic Load Balancer를 연결하고 오토 스케일링을 적용하여 부하에 대응하기.