12/7 : 서버리스 아키텍처
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
- 서버리스는 도커와 컨테이너 기술 기반으로 만들어짐
- 인프라 관리작업이 필요하지 않아서 코드 작성 시 더 집중할 수 있는 장점
- 시간 단축, 비용절감, 대규모 조정, 우수한 어플리케이션 구축,
서버리스 아키텍처 원칙
- 컴퓨팅 서비스를 사용해서 요구에 맞게 코드를 실행
- 단일 목적의 상태 없는 함수를 작성 ex) http (web기술),
- 푸시 기반, 이벤트 주도 파이프 라인을 설계
- 강한프론트앤드를 만들어야 함
- 서드 파티 서비스를 받아들여야함 > 소셜 로그인
>연계를 통해서 서비스
> 각 다른 환경에서 실행하려면 단일화된 포맷 필요
> 포맷 바꾸는 작업의 이벤트 발생하고 람다함수 실행
> 추출하고 저장
>> 최종작업 후에 사용자에게 알려줌
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모듈 컴파일 하는 방법*
- 람다 러타임 확인- https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
- 람다 런타임과 동일한 EC2 인스턴스 생성 > 아마존 리눅스2 > bitvise 접속 >
- PIL 모듈 빌드
- pillow 모듈을 S3 버킷으로 전송하기 위해서 aws cli명령어를 이용함 > 사용자 크리덴셜을 등록해야 사용 가능
- 업로드한 S3 라이브러리를 람다 계층으로 등록
- 생성한 람다함수에 계층 추가 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
API gateway 대시보드
- rest api : http 서비스 활용
> 리소스 생성
메소드(method) 생성
후에 테스트 진행
-요청과 호출 로그 보여짐
API 배포
- 외부에서 쓸수있도록 배포
- 스테이지 : 용도에 맞는
>URL 호출 : API gateway의 앤드포인트로 접근
API Gateway 주소를 호출하도록 리액트 수정
apigateway에서 /emp > cors활성화
후에 API 다시 재배포
정리
- EC2인스턴스 종료
- S3 버킷 비우고 삭제
- Lambda 함수 삭제
- API Gateway API 삭제
- vpc 삭제