수업

12/7 : 서버리스 아키텍처

진태현 2023. 12. 7. 10:10

vpc: 가산네트워크 생성

ec2: 인프라와 관련 , Iaas, 웹서비스 인프라 제공

- 클라우드 elastic > autoscailing과 노드밸런서로 구현

- 클라우드 모니터링

- rds와 s3로 파일저장 

> 응용프로그램을 구현시키기 위한 인프라 구성 

- 조금 더 클라우드 변환하는 서버리스 architecture 

* 서버리스 architecture > docker 이해 

 


서버리스 아키텍처

- 서버리스(serverless)란 개발자가 서버를 관리할 필요 없이 애플리케이션을 빌드하고 실행할 수 있도록 하는 클라우드 네이티브 개발 모델

- 여러 개의 레이어로 구성 

- 각종 하드웨어 필요 

- 각 종 서비스가 존재해서 내가 만든 프로그램을 구동

>> 서버가 없이 내가 만든 함수들로 연결지어 서비스 구현해주는 것 

 

AWS에서 서버리스 제공

- 서버에 대한 고민 없이 애플리케이션을 구축하고 실행

*하드웨어 적인 측면에서 고민 없이 제공

- 서버 관리가 필요없음 

- 오토 스케일링과 같은 크기 조정, 고 가용성 제공

- AWS Lamda에서 시작되서 각 종 서비스로 통합 

*Docker 기술, 컨테이너 기술

 

Docker 기술 

https://pyrasis.com/jHLsAlwaysUpToDateDocker

 

PYRASIS.COM: 이재홍의 언제나 최신 Docker

© 2003-2023 Jae-Hong Lee. All rights reserved. 상호명 : 제이에이치엘 | 대표자 : 이재홍 사업자등록번호 : 544-03-02533 통신판매업신고 : 2022-서울서초-2713 주소 : 서울특별시 서초구 강남대로107길 21(잠원동) 2

pyrasis.com

 

- 서버리스는 도커와 컨테이너 기술 기반으로 만들어짐 

- 인프라 관리작업이 필요하지 않아서 코드 작성 시 더 집중할 수 있는 장점

- 시간 단축, 비용절감, 대규모 조정, 우수한 어플리케이션 구축, 

 

서버리스 아키텍처 원칙

  1. 컴퓨팅 서비스를 사용해서 요구에 맞게 코드를 실행
  2. 단일 목적의 상태 없는 함수를 작성 ex) http (web기술), 
  3. 푸시 기반, 이벤트 주도 파이프 라인을 설계 
  4. 강한프론트앤드를 만들어야 함
  5. 서드 파티 서비스를 받아들여야함  > 소셜 로그인 

>연계를 통해서 서비스 

> 각 다른 환경에서 실행하려면 단일화된 포맷 필요 

> 포맷 바꾸는 작업의 이벤트 발생하고 람다함수 실행 

> 추출하고 저장 

>> 최종작업 후에 사용자에게 알려줌

 

AWS서버리스 서비스

- 컴퓨팅, 통합, 데이터 스토어를 포함한 3개 계층으로 개발

컴퓨팅 

- AWS Lambda : 서버를 프로비저닝하거나 관리하지 않고도 코드 실행 할 수 있는 이벤트 기반 컴퓨팅 서비스 

- aws fargate

 

통합 

- Amazon 이벤트 브릿지

- aws step functions

- amazon sqs

- amazon sns

- amazon api gateway

- aws app sync

 

데이터 스토어

- S3

- EFS

- dynamo DB

- RDS Proxy

- Aurora 서버리스

- Red쉬프트

- Neptune

- OpenSearch 


Node 런타임을 사용하는 람다 함수 생성 

- Lambda 대시보드 > 생성

- 생성하면 Docker, 가상머신이 생성됨

 

소스코드 수정 시에 절차

- Deploy > 반영함

 

테스트 이벤트 구성 후 테스트

- 어떤 값들이 전달되는지 테스트 과정

 

CloudWatch 콘솔에서도 실행 결과 확인 가능 

- 람다 함수가 외부 이벤트에서 실행되는 경우, 실행 로그는 클라우드 워치에서 확인해야 함

> 모니터링 항목에서 cloudwatch 보기

 

Python 런타임을 사용하는 람다함수생성

>함수 생성 

>매개변수 출력 코드 추가

> 테스트 

 

*handler 함수 

- 해당 람다 함수의 시작 함수

기본적인 함수

- 변경가능 

 

이미지 썸네일 자동으로 생성

- 람다함수 사용  

- 버킷에 이미지 업로드 > 이벤트 생성시에 람다함수 > 썸네일 생성하는 람다함수 >

- 일고 쓰는 권한으로 S3 썸네일 버킷에 이동

* S3업로드 버킷, S3 썸네일 버킷, 람다함수

- 권한설정

- 람다함수는 PIL모듈 사용 

 

Lambda함수 생성

* lambda란 aws 서비스의 하나로 역할을 만들고 역할, 정책으로 권한을 부여 

 

S3 버킷에 파일 추가시에 발생하는 이벤트 확인 > 이벤트 구성을 통해서 

- test> configure test event >s3put 

- 코드 작성 후 Deploy하면 PIL 모듈 오류 발생 

* 외부라이브러리는 직접 추가해야 함 

- 계층에 라이브러리 추가 

 

*PIL모듈 컴파일 하는 방법*

  1. 람다 러타임 확인-  https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
  2. 람다 런타임과 동일한 EC2 인스턴스 생성 > 아마존 리눅스2 > bitvise 접속 >
  3. PIL 모듈 빌드
  4. pillow 모듈을 S3 버킷으로 전송하기 위해서 aws cli명령어를 이용함 > 사용자 크리덴셜을 등록해야 사용 가능
  5. 업로드한 S3 라이브러리를 람다 계층으로 등록
  6. 생성한 람다함수에 계층 추가 Lambda >  함수 >

TEST > S3 버킷에서 파일 가져올 때 Forbidden 오류 : (권한 없음)

 

람다 함수 역할에 S3버킷을 읽고 권한 생성

- Lambda >  함수 > 구성 > 권한항목에서 역할 

- 기존에 있던 권한에 s3fullaccess 권한 추가

> 후에 람다함수 테스트

 

테스트를 위해서 버킷에 이미지를 하나 등록

- 업로드 후에 람다 이미지에 코드 수정 > 버킷이름과 업로드한 파일명 

 

테스트 한 결과 썸네일을 저장할 s3버킷이 조잰하지 않아서 오류 발생 

- 썸네일을 저장할 버킷 생성

>> 테스트한 결과 정상적으로 실행

 

썸네일 버킷 확인 

- resized 버킷에 파일들어온 것 확인 

- 기존의 파일보다 줄어듦 

 

트리거 추가

- 람다에서 트리거 추가 
- recursive 호출 

>트리거 추가된 것 확인 

 

다른 이미지 추가

- 버킷에 이미지 업로드해보면 resized 버킷에도 생성된 거 확인

- 클라우드 워치에서 내 람다함수 로그스트림 가장 최근거 확인

 

***SNS에 업로드 하는 이미지파일 등등 정적 웹 사이트 호스팅을 통해서 브라우저에서 보여질 때 크기변환으로 좋게 보여지게 할 수 있음 


백엔드 API 기능을 Lambda 함수와 API Gateway로 구성

EC2(베스천 호스트)와 RDS 인스턴스를 재실행 

- 인스턴스와 rds 재실행 

 

람다 함수 생성

 

코드 삽입 후에 rds 주소 변경

 

이벤트 구성 및 테스트

- 소스코드에서 event 매개변수를 사용하는 곳이 없음

 

코드 테스트 후에 오류

> pymsql모듈을 계층으로 등록

 

등록

- cmd > hello_flask > 디렉터리 생성 > pip install pymysql --target . > tree .

- tar -acf ../lambda_function.zip . > dir ..\*.zip

 

계층 등록

- 생성한 zip 파일 업로드 

 

계층 생성

 

테스트 결과 타임아웃 

- 람다와 vpc 연결될 수 있도록 해줘야 함 

> RDS > 연결된 컴퓨팅 리소스 > 작업에 Lambda 연결 설정 : 연결하기위해서 vpc 

>> 람다함수에 VPC를 설정 해야함 

 

VPC 설정 

- createnetworkinterface 권한 추가 > IAM > 역할 > 본인 > 권한 추가 AWSLamdaVpcAccess 

 

람다 vpc 연결

 

API gateway 대시보드 

- rest api : http 서비스 활용 

> 리소스 생성 

 

메소드(method) 생성

 

후에 테스트 진행

-요청과 호출 로그 보여짐 

 

API 배포 

- 외부에서 쓸수있도록 배포

- 스테이지 : 용도에 맞는

 

>URL 호출 : API gateway의 앤드포인트로 접근

 

API Gateway 주소를 호출하도록 리액트 수정 

 

apigateway에서 /emp > cors활성화

 

후에 API 다시 재배포

 

정리 

- EC2인스턴스 종료

- S3 버킷 비우고 삭제

- Lambda 함수 삭제

- API Gateway API 삭제 

- vpc 삭제