초보 개발자

SAA 서버리스 아키텍처 본문

AWS SAA

SAA 서버리스 아키텍처

taehyeki 2023. 2. 16. 21:14

MyTodoList

요구사항:

  • https 엔드포인트가 있는 rest api가 노출되어야한다.
  • 서버리스 아키텍쳐
  • 사용자가 원한다면 스스로 데이터를 관리하도록 s3에있는 폴더와 직접 상호작용이 가능해야한다.
  • 가용자가 관리형 서버리스 서비스로 인증할 수 있어야한다.
  • 사용자들이 읽고 쓸 수 있어야하는데 대부분 쓰기보다는 읽기를 주로 하니까 읽기 성능을 생각해야한다.
  • 데이터 베이스는 확장할 수 있도록 구축해 읽기 처리량을 높어야 한다.

rest https 를 얘기하였으니까 API Gateway를 생각해보자.

일반적인 서버리스 api방식으로 이 api gateway가 람다를 호출하여 확장을 허용하고 서버리스 인프라를 사용하도록 하자/

그럼 람다는 여기서 데이터베이스를 저장하거나 읽어내야한다. 서버리스 이면서 확장이 잘되는건 dynamoDB이다.

인증 계층이 있어야하는데..

 이 때 amazon Cognito같은 서버리스 기술을 사용하면 된다. 

모바일 클라이언트가 Cognito에 연결하고 인증하면 api gateway는 Cognito와 함께 인증을 확인해줄 것이다. 

 

S3버킷에 사용자 액세스 권한을 주려면 어떻게 해야할까 ?

먼저 Cognito를 통해 인증을 하면 AWS STS를 통해 임시 자격 증명을 제공해준다. 이 자격 증명을 모바일 클라이언트한테 반환을 한다. 이 자격증명에는 클라이언트가 S3에서 파일을 저장하고 회수하며 전용 공간에 액세스 하도록 허용한다.

 시험 단골문제 AWS 사용자 자격 증명을 모바일 클라이언트가 저장한다. < 이건 올바른 방법이 아니다.

Cognito와 STS가 S3를 임시자격 증명에 사용해야 한다.  임시로 잠깐 빌려주는건데 저걸 저장해서 로그인할 때마다 사용한다는건 말이 안된다.

 

사용량이 증가하면서 읽기 처리량이 높아졌다고 한다. dynamoDB에서 RCU는 가만히 납둬도 될 것 같다.

읽기 처리량을 늘리면서 전체 비용을 줄이려면 캐싱계층으로 DAX를 사용하면된다.

읽기를 많이 하는데 읽어 낸 내용이 DAX캐시에 저장돼어 dynamoDB읽기 용량 단위가 많이 필요하지 않게 된다. 

캐싱에는 다른 방법도 있다. DAX도 사용 가능하지만 캐시에 응답을 저장할 때 응답이 고정된 경우(같은 값을 반환한다면) API Gateway레벨에서 캐싱을 해두기도 한다.

 

 

Myblog.com

서버리스로 호스팅 되는 웹사이트

이 웹서버는 글로벌 스케일 아웃이 가능해야 한다.

이 사이트는 글을 쓰기보다는 읽기가 압도적으로 많다. 이 웹사이트는 대부분 정적 파일로 구성된다.

일부는 동적은 rest api로 구성된다. 캐시를 적용해서 비용을 절감하고 응답속도도 높이고 좋은 ux를 제공하고싶어한다.

블로그에 처음 방문하는 사람에겐 따듯한 환영 메시지를 보내고 싶다.

서버리스로 구현하고 싶고 블로그에 업로드 되는 사진은 섬네일이 생성되었으면 좋겠다.

 

클라이언트가 있고 우리의 컨턴체는 s3에 저장되어 있다. 

이 s3는 특정 리전에 있다. 이걸 어떻게 하면 글로벌 대상으로 노출 시킬 수 있을까?

cloudfront를 이용하면 된다. 클라이언트는 amazon cloudfront의 엣지 로케이션과 통신을 하게된다. 

s3에게 받은 데이터를 캐시로 저장하게 된다.

 

이 전에는 s3를 퍼블릭으로 열어놓아서 어디에서나 접근할 수 있도록 했는데 이제는 무조건 cloudfront를 통해서만 들어오도록 한다.

오리진(s3)액세스를 제한해서 cloudfront로만 s3버킷에 접근할 수 있도록 한다 이걸위해서 버킷 정책에 cloudfront만 인가할 수 있도록 정책을 추가한다.(OAC origin access control ) s3에 바로 접근하는 사용자는 인가를 받지 못한다.

퍼블릭 서버리스 Rest api는 어디에 추가할까 rest HTTPS로 Amazon API 게이트 웨이와 통신하고 게이트 웨이는 람다 함수를 호출하고

람다함수는 dynamoDB에 쿼리를 날리고 읽기ㅏ 많이 발생하니 DAX를 만들어 두어 캐싱하도록 한다. 

글로벌 서빙을 할 때 지역에 따라 발생하는 지연을 줄이기 위해 dynamo DB의 글로벌 데이터 베이스를 사용하는 것도 좋을 것이다./

 

신규 방문자에게 보낼 환영 이메일은 어떻게 보낼까? 이건 dynamoDB에서 변경사항을 전송하기 위해 dynamoDB 스트림을 이용하고 스트림은 람다 함수를 호출한다. 이 람다함수는 IAM role을 부여받아 SES를 사용할 수 있게 해준다. simple email service를 말한다.

아마존 람다 함수가 sdk를 이용해서 ses가 이메일을 발송하게 한다, 

 

또 요구사항중에 이미지를 업로드하면 섬네일을 생성한다는 것이 있었다. 클라이언트에서 s3버킷으로 바로 업로드를 할 수도 있고, 아니면 cloudFront OAI를 이용할 수도 있다. 이 방식을 사용하면 사진을 cloudfront에 업로드하고 cloudfront는 사진을 s3로 전달하게된다.

이런 방식을 s3 transfer acceleration이라고 한다. cloudfront가 s3에 접근할때에는 OAI를 사용한다. 이렇게 s3에 파일이 올라가면

람바함수를 호출한다. 람다는 섬네일을 생성하고 섬네일을 s3 버킷에 넣는데 ( 다른 버켓에 넣을 수도 있음) 또 업로드 된 s3는 sqs와 sns를 호출할 수도 있다. 

 

 

 

'AWS SAA' 카테고리의 다른 글

AWS 머신러닝  (0) 2023.02.20
AWS 데이터 분석  (0) 2023.02.17
AWS Serverless  (18) 2023.02.15
AWS Container  (0) 2023.02.14
AWS SQS, SNS, kinesis, activeMQ  (0) 2023.02.12