Serverless
Serverless?
- 서버리스 서비스를 사용하는 개발자는 서버를 관리할 필요가 없습니다.
- 서버가 없다는 것은 아니고 관리할 필요가 없다는 뜻입니다.
- 원래 서버리스는 FaaS, 즉 Function as a Service를 뜻했지만 지금의 서버리스는 더 많은 것을 의미합니다.
- 서버리스가 처음 개발된 건
AWS Lambda
데이터베이스
, 메시징
, 스토리지
등 서버를 프로비저닝 하지 않는 모든 것들을 포함합니다.
- 서버리스란 서버가 없는 게 아니라 서버가 보이지 않거나 서버를 프로비저닝 하지 않는 것입니다.
- 서버리스 예시
- AWS 안에 서버리스
- AWS Lambda
- DynamoDB
- AWS Cognito
- AWS API Gateway
- Amazon S3
- AWS SNS & SQS
- AWS Kinesis Data Firehose
- Aurora Serverless
- Step Functions
- Fargate
AWS Lambda
AWS Lambda란?
AWS Lambda은 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다.
- 람다는 가상의 함수입니다.
- 관리할 서버 없이 코드를 프로비저닝하면 함수가 실행되는 겁니다.
- 제한 시간이 있어서 실행 시간이 짧습니다. (15분)
- 온디맨드로 실행됩니다.
- 비용 역시 함수가 실행되는 동안만 청구됩니다.
- 마지막으로 스케일링이 자동화됩니다.
장점 :
- 과금이 쉽습니다.
- Lambda가 수신하는 요청의 횟수 즉, 호출 회수와 컴퓨팅 시간 = Lambda가 실행된 시간만큼.
- 프리 티어에서 Lambda 요청 1백만 건과 40만 GB-초의 컴퓨팅 시간 제공합니다.
- 다양한 AWS 서비스와 통합됩니다.
- Lambda에 여러 가지 프로그래밍 언어를 사용할 수 있어서 상당히 자유로운 편
- CloudWatch와의 모니터링 통합도 쉽습니다.
- 함수당 최대 10GB의 램을 프로비저닝 할 수 있습니다.
- 만약 함수의 RAM을 증가시키면 CPU 및 네트워크의 품질과 성능도 함께 향상될 것입니다.
사례) 데이터를 프로세싱하는 데에 대략 1시간 정도가 걸리는 Lambda 함수를 생성했습니다.
코드를 머신에서 로컬로 실행했을 때에는 문제가 없었으나, Lambda 함수를 호출할 때는 3초가 지난 후 ‘시간초과' 오류가 발생하여 실패할 때는 코드를 EC2 인스턴스처럼 다른 곳에서 실행할 수도 있고, Amazon ECS를 사용할 수도 있습니다
Lambda가 지원하는 언어
- Node.js (JavaScript)
- Python
- Java (Java 8 compatible)
- C# (.NET Core)
- Golang
- C# / Powershell
- Ruby
- Custom Runtime API (community supported, example Rust)
- Lambda Container Image
- 컨테이너 이미지는 Lambda 런타임 API에서 실행되야 합니다.
- 해당 컨테이너가 Lambda 런타임 API를 구현하지 않으면, ECS나 Fargate에서 컨테이너를 실행해야 합니다
AWS Lambda 통합
- API Gateway: REST API를 생성하고 람다 함수를 호출합니다.
- Kinesis: Lambda를 이용해 바로 데이터를 변환합니다
- DynamoDB: 트리거를 생성할 때 사용되는데, 데이터베이스에 어떤 일이 생기면 람다 함수가 작동되도록 합니다.
- Amazon S3: 언제든 람다 함수를 작동시킵니다.
예) S3에 파일이 생성되거나 할 때
- CloudFront: Lambda@Edge인데 Lambda@Edge는 전 세계 AWS 로케이션에서 서버를 프로비저닝 또는 관리할 필요 없이 Node.js 함수를 실행할 수 있는 서비스입니다.
- CloudWatch Events EventBridge: AWS의 인프라에 어떤 일이 생기고 그 상황에 대응하고자 할 때
예)파이프라인이 끊기거나, 상태가 바뀌는 경우 등 상황에 따라 자동화를 실행
- CloudWatch logs: 어디든 해당 로그를 스트리밍 합니다
- SNS: 알림과 SNS 토픽에 대처
- SQS: SQS 대기열 메시지를 처리
- Cognito는 사용자가 데이터베이스에 로그인할 때마다 응답
Lambda 과금방식
- 여기에서 전체 가격 정보를 찾을 수 있습니다.
https://aws.amazon.com/lambda/pricing/
- 통화당 지불:
- 처음 1,000,000건의 요청은 무료입니다.
- 이후 요청 1백만 건당 $0.20(요청당 $0.0000002)
- 기간당 지불: (1ms 단위)
- 매월 400,000GB-초의 컴퓨팅 시간 무료
- == 기능이 1GB RAM인 경우 400,000초
- == 기능이 128MB RAM인 경우 3,200,000초
- 이후 600,000GB-초에 1달러
- 일반적으로 AWS Lambda를 실행하는 것이 매우 저렴하므로 매우 인기가 있습니다.
Lambda 제한
리전마다의 제한
- 실행 제한
- 메모리 할당이
128MB
에서 10GB
입니다.
- 단위는 1MB씩 증가합니다.
- 최대 실행 시간은 900초 다시 말해 15분입니다.
- 환경 변수로 최대 4KB를 가집니다.
- 큰 파일을 끌어와야 한다면 (/tmp)임시 공간을 사용할 수 있는데, 크기는 512MB입니다.
- 최대 1000건까지 람다 함수의 동시 실행이 가능하고 요청에 따라 늘어날 수 있습니다. (동시성은 미리 예약해두는 것이 좋습니다.)
- 배포 제한
- 압축된 zip의 최대 크기는 50MB
- 압축되지 않으면 250MB
- 이보다 더 큰 파일에는 대신 /tmp 공간을 사용해야 합니다. (임시공간)
- 환경 변수는 동일하게 4KB입니다.
--
Cloudfront & Edge
cloudfront란?
Amazon CloudFront는 .html, .css, .js 및 이미지 파일과 같은 정적 및 동적 웹 콘텐츠를 사용자에게 더 빨리 배포하도록 지원하는 웹 서비스입니다.
Cloudfront 동작방식 및 기능
CloudFront 기능
- JavaScript로 작성된 경량 함수
- 대규모의 지연 시간에 민감한 CDN 맞춤화
- 밀리초 미만의 시작 시간, 초당 수백만 건의 요청
- 뷰어 요청 및 응답을 변경하는 데 사용됩니다.
- 뷰어 요청: CloudFront가 뷰어로부터 요청을 받은 후 뷰어
- 뷰어 응답: CloudFront에서 최종 사용자에게 응답을 전달하기 전
- CloudFront의 기본 기능(CloudFront 내에서 코드 전체 관리)
- CloudFront 함수는 고성능, 고확장성이 필요할 때, 뷰어 요청과 뷰어 응답에만 사용
Lambda@Edge란?
Lambda@Edge를 사용하면 Node.js 및 Python Lambda 함수를 실행하여 CloudFront가 제공하는 콘텐츠를 사용자 지정하여 AWS 위치의 함수를 최종 사용자와 더 가깝게 실행할 수 있습니다
CloudFront를 통해 CDN을 배치했는데 만약 엣지 로케이션마다 글로벌 람다 함수를 실행하고 싶다면 어떻게 할까요? 혹은 어떻게 요청 필터링을 애플리케이션 도착 전에 구현할 수 있을까요?
- Lambda@Edge 를 사용하면됩니다.
- Lambda@Edge는 CloudFront CDN을 통해서 특정 리전이 아닌
전 세계의 모든 리전
에 람다 함수를 배치합니다.
- 응답성이 뛰어난 애플리케이션을 구축하기 위해서 입니다.
- 서버 관리할 필요 없이 글로벌적으로 람다가 배치됩니다.
- CDN을 통해 전송되는 콘텐츠를 사용자 지정할 수 있고 사용량만큼 청구되기 때문입니다.
Lambda@Edge 동작방식 및 기능
- NodeJS 또는 Python으로 작성된 Lambda 함수
- 초당 1,000개의 요청으로 확장
- CloudFront 요청 및 응답을 변경하는 데 사용됩니다.
- 뷰어 요청 – CloudFront가 사용자로부터 요청을 받은 후 뷰어
- 오리진 요청 – CloudFront가 오리진에 요청을 전달하기 전
- 오리진 응답 – CloudFront가 오리진으로부터 응답을 받은 후
- 뷰어 응답 – CloudFront가 최종 사용자에게 응답을 전달하기전
- 하나의 AWS 리전(us-east-1)에서 함수를 작성하면 CloudFront가 해당 위치로 복제합니다.
CloudFront와 Lambda@Edge 공통 사용 예:
- 웹 사이트 보안 및 프라이버시
- 엣지의 동적 웹 애플리케이션
- 검색 엔진 최적화
- SEO
- 오리진 및 데이터 센터 사이의 지능적 경로
- 엣지에서의 봇 활동 완화
- 실시간 이미지 변환
- A/B 테스트
- 오리진 도달 전의 사용자 인증 및 권한 부여
- 사용자 우선순위 지정 사용자 추적 및 분석
CloudFront Function vs Lambda@Edge
CloudFront Functions Lambda@Edge 기능
CloudFront 기능
- 캐시 키 정규화
- 요청 속성(헤더, 쿠키, 쿼리 문자열, URL)을 변환하여 최적의 캐시 키 생성
- 헤더 조작
- 요청 또는 응답에서 HTTP 헤더를 삽입/수정/삭제합니다
- URL 재작성 또는 리디렉션
- 인증 및 승인 요청
- 요청을 허용/거부하기 위해 사용자 생성 토큰(예: JWT) 생성 및 검증
Lambda@Edge 기능
- 긴 실행 시간(수 ms)
- 조정 가능한 CPU 또는 메모리
- 귀하의 코드는 서드파티 라이브러리 에 의존합니다(예: 다른 AWS 서비스에 액세스하기 위한 AWS SDK).
- 처리를 위해 외부 서비스를 사용하기 위한 네트워크 액세스
- 파일 시스템 액세스 또는 HTTP 요청 본문에 대한 액세스
Lambda in VPC
- 기본적으로 Lambda 함수를 시작하면 여러분의 VPC 외부(AWS 소유 VPC)에서 시작되기 때문에, VPC 내의 리소스(RDS, ElastiCache, 내부 ELB...)에 액세스할 권한이 없습니다.
- 인터넷의 퍼블릭 API나 DynamoDB는 가능
- 그렇기 때문에 VPC ID, 서브넷 및 보안 그룹을 정의해야 합니다.
- Lambda는 서브넷에 ENI(Elastic Network Interface)를 생성합니다.
- 그렇게 하면 Lambda 함수를 VPC 내 모든 항목에 비공개로 연결할 수 있습니다.
Lambda with RDS Proxy
VPC 내에서 Lambda를 사용하는 대표적인 사용 사례는 RDS 프록시입니다.
- Lambda 함수가 데이터베이스에 직접 액세스하는 경우 부하가 높은 상태에서 너무 많은 연결을 열 수 있습니다.
- RDS 프록시
- DB 풀링 및 공유를 통한 확장성 향상
- 장애 조치 시간을 66% 단축하고 연결을 유지하여 가용성 향상
- IAM 인증을 시행하고 Secrets Manager에 자격 증명을 저장하여 보안을 강화합니다.
- RDS Proxy는 공개적으로 액세스할 수 없기 때문에 Lambda 함수를 VPC에 배포해야 합니다.
AWS Certified Solutions Architect Associate 시험합격!