serverless란 것은 서버가 없는 게 아니라 서버가 보이지 않거나 서버를 프로비전 하지 않은 것을 의미한다.
AWS Lambda
: 람다는 가상의 함수이다.
- 관리할 서버 없이, 그냥 코드를 프로비저닝하고 함수를 실행한다.
- 시간 제한이 있어서 실행 시간이 짧다.(최대 15분)
- 온디멘드로 실행된다.
- 스케일링이 자동화된다.
Benefits of AWS Lambda
- 가격 측정이 쉽다.
- 다양한 서비스와 통합된다.
- 많은 프로그래밍 언어를 사용할 수 있어서 자유롭다.
- CloudWatch의 모니터링 통합이 쉽다.
- 함수당 최대 10GB의 램을 프로비저닝 할 수 있다.
- 함수의 RAM을 증가시키면 CPU와 네트워크의 품질 및 성능도 함께 향상된다.
AWS Lambda Language support
- Node.js, Python, Java, C#/Powershell, Golang, Ruby, Custom Runtime API, Lambda Container Image
- 람다에 컨테이너를 실행해야 할 경우 해당 컨테이너가 람다 런타임 API를 구현하지 않으면 ECS나 Fargete에서 컨테이너를 실행해야 한다.
Synchronous Invocations
: 동기식 호출(콘솔에서 호출한 람다 함수가 실패할 경우 Retry 버튼을 눌러 재시도)
Services
- DynamoDB, Kinesis, SQS...
Lambda Integration with ALB
: 람다 함수를 인터넷에서 호출할 수 있도록 한다.(HTTP, HTTPS 엔드포인트)
ALB 사용
- 람다 함수를 대상 그룹에 등록해야 한다.
- API 게이트웨이 사용
ALB to Lambda: HTTP to JSON
- 쿼리 스트링 매개변수와 헤더(키/값 쌍), 바디가 전부 변환
Lambda to ALB: JSON to HTTP
- 헤더(키/값 쌍), 바디(isBaseEncoded)
: 클라이언트 하나가 ALB에 말을 걸 경우, ALB 설정을 통해 다중 헤더 값을 갖도록 할 수 있다.
- 설정을 활성화하여 두 헤더와 쿼리 스트링 매개변수를 람다 함수로 된 배열로 변환해 줄 수 있다.
- 다중 헤더값은 ALB설정으로 지원 가능하다.
Asynchronous Invocations
: 비동기식 호출로 람다 함수를 뒤에서 불러오는 서비스를 위한 것이다.
- 일부 서비스에는 비동기식 호출만 사용 가능한 경우가 있다.
- 과정의 속도를 높여야 하는 상황에서 처리 시간을 줄여준다.
Services
- S3, SNS, CloudWatch Event, EventBridge...
CloudWatch Evenvts/ EventBridge
- 서버리스 CRON, Rate: EventBridge 규칙을 생성한뒤 일정 시간마다 람다 함수가 작업을 수향하도록 트리거링
- CodePipeline EventBridge 규칙 생성: CodePipeline의 상태가 바뀔 때마다 이를 감지해 상태 변화가 감지되면 람다 함수가 작업을 수행하도록 호출
S3 Events Notifications
: 객체가 생성 또는 제거, 복구나 복제가 일어날 때 알림을 해주는 기능
Lambda-Event Source Mapping
- Kinesis Data Stream, SQS&SQS FIFO queue, DynamoDB Streams 람다가 이 서비스들로부터 폴링을 해야하며, 이런경우 람다 함수는 동기적으로 호출된다.
Streams & Lambda (Kinesis & DynamoDB)
- Kinesis에서든 DynamoDB에서든 샤드에서 아이템이 처리될 때 아이템은 스트림으로부터 제거되지 않으며 Kinesis와 DynamoDB의 다른 소비자들이 데이터를 읽을 수 있다.
Error Handling
: 기본적으로 함수가 오류를 반환하면 함수가 성공할 때까지, 혹은 배치 내의 아이템이 만료될 때까지 모든 배치가 다시 처리된다.
- 오래된 이벤트를 폐기하는 경우에도 그 이벤트 전체가 목적지로 전달된다.
SQS & SQS FIFO
- SQS 대기열은 람다의 이벤트 소스 매핑으로 폴링이 되며, 배치가 반환될 때마다 이벤트 배치를 통해 람다 함수가 동기적으로 호출된다.
- SQS의 경우, 이벤트 소스 매핑이 긴 폴링을 이용해 SQS를 폴링한다.
- 배치 크기는 1에서 10메세지까지 지정 가능하다.
- DLQ를 사용하는 경우, DLQ를 람다가 아닌 SQS 대기열에 설정한다.
Queues & Lambda
- 대기열을 처리하기 위해서 스케일링 될 람다 함수의 수는 활성 메세지 그룹의 숫자와 동일하다.
tip: 시험문제에 이벤트 매퍼 상세히 묻는 문제 출제
Lambda-Event and Context Objects
- Event Object: JSON 형태의, 함수가 처리할 데이터를 갖고 있는 문서
- Context Object: 런타임 환경과 호출 자체의 데이터를 제공
Destinations
- 비동기화 호출: 호출의 결과 또는 이벤트 매퍼의 실패 결과를 다른 어딘가로 전송한다.
- 이벤트 소스 매핑: 처리할 수 없는 이벤트 배치를 폐기하는 경우에 사용이 된다.
Lmabda Execution Role(IAM Role)
: 이벤트 소스 매핑으로 함수를 호출할 때마다 데이터를 읽는 것이 람다이다. 따라서 이벤트 데이터를 읽으려면 실행 역할이 필요하다.
Lambda Resource Based Policies
Lambda Environment Variables
: 문자열 형식의 키-값 쌍으로 코드를 업데이트하지 않고도 함수 행위 특성을 조정할 수 있다.
Lambda Logging & Monitoring
- Lambda는 CloudWatch Logs와 통합되어 있으므로 Lambda의 모든 실행 로그는 자동으로 CloudWatch Logs에 저장된다.
Lambda Tracing with X-Ray
- Lambda 구성에서 Active Tracing으로 쉽게 활성화할 수 있다.
Environment variables to communicate with X-Ray
- _X_AMZN_TRACE_ID
- AWS_XRAY_CONTEXT_MISSING
- AWS_XRAY_DAEMON_ADDRESS: Lambda 함수에 대해 X-Ray 데몬이 실행되는 IP와 포트를 알려준다.
Customization At The Edge
: CloudFront 등을 사용할 때는 엣지 위치에 콘텐츠를 배포한다.
Edge Function
: 지연 시간을 최소화하려는 경우에 사용자와 가까운 곳에서 함수를 실행한다.
- 엣지 함수를 사용하면 서버를 관리하지 않아도 된다.(서버리스)
CloudFront Function
: JS로 작성한 가벼운 함수이며 뷰어 요청과 응답을 수정한다.
- 대기 시간이 중요한 큰 규모의 CDN 사용자 지정 시 사용되어, 시작 시간이 밀리초 미만이고 초당 요청을 수백만 개 수행할 수 있다.
- 뷰어 요청 및 응답에만 해당되어 수준이 높고 규모가 크다.
- 뷰어에만 영향을 미친다.
- 캐시 키 정규화, 헤더 조작, JWT 토큰 검증
Lambda@Edge
: NodeJS나 Python으로 작성되는 함수이며 CloudFront 요청을 변셩하고 다양한 요청, 실제로는 모든 요청에 응답하는 데 사용된다.
- 요청 수는 초당 수천 회
- 뷰어와 오리진 모두에 영향을 미친다.
- CPU와 메모리 조정, 코드에 타사 라이브러리 이용 가능, 네트워크로 액세스하여 처리
Lambda in VPC
- ENI를 생성하기 위해서 Lambda 함수는 AWSLambdaVPCAccessExecutionRole을 필요로 한다.
Internet Access
- Lambda 함수를 공용 서브넷에서 배포한다고 해도 인터넷이나 공용 IP 접근 권한을 얻을 수 없다.
- Lambda 함수를 사설 서브넷에 배포해서 인터넷 액세스 권한을 얻으려면 NAT 게이트웨이나 NAT 인스턴스를 사용해야 한다.
- DynamoDB 사설 경로를 통해 액세스하려면 VPC 엔드 포인트를 사용한다.
Lambda Function Configuration
- 함수가 실행되는 시간을 줄이기 위해서는 애플리케이션에 대한 Lambda 함수 RAM을 늘려야 한다.
- Timeout: Lambda 함수가 3초 이상 실행되는 경우 시간초과 오류가 발생한다.(시간초과 제한은 최대 900초까지 설정 가능)
- 어떤 간격이든 15분이 넘어가면 Lambda에 적합하지 못하다. 이런 경우레는 Fargate나 ECS 혹은 EC2를 사용하는 것이 적합하다.
Lambda Execution Context
: Lambda 함수를 연속으로 여러 번 호출하는 경우, 호출에 대한 컨텍스트를 재사용하고 기존의 데이터베이스 연결 HTTP 클라이언트 등을 재사용하여 Lambda 함수의 속도를 높이고 성능을 향상시킬 수 있기 때문에 아주 유용하다.
Initialize outside the handler
: 핸들러 외부에서 데이터베이스 연결을 초기화함으로써 이를 함수 호출 전반에 걸쳐 재사용할 수 있고 함수 성능을 크게 향상시킬 수 있다.
Lambda Functions /tmp space
: /tmp space를 사용하여 용량이 큰 파일을 다운로드해야 하거나 작업을 수행할 디스크 공간이 필요한 경우 모든 파일을 /tmp 디렉터리에 저장한다.
Lambda Layers
- Lambda의 사용자 지정 런타임을 만든다.
- 종속성을 다시 사용할 수 있게 외부화한다.
- Lambda 계층의 데이터는 수정할 수 없다.
File Systems Mounting
: Lambda 함수가 VPC에서 실행될 경우 EFS 파일 시스템에 액세스할 수 있다.
Lambda Concurrency and Throtting
- 람다 함수의 동시 실행 개수를 제한하기 위해 함수 수준에서 "reserved concurrency"를 설정할 수 있다.
Lambda Concurrency Issue
: 동시성 제한이 계정의 모든 함수에 적용되므로 하나의 함수가 이 제한을 초과해도 다른 함수까지 조절 대상이 된다.
Concurrency and Asynchronous Invocations
Cold Starts & Provisioned Concurrency
- Cold Start: 새로운 람다 함수 인스턴스를 생성할 때에 코드가 로드되어야 하며 핸들러 외부에서 이 코드가 실행되어야 한다.
- Provisioned Concurrency: 함수가 호출되기도 전에 동시성을 할당해 놓는다.
Lambda Function Dependencies
: 람다 함수가 외부 라이브러리에 의존하는 경우, 코드에 패키지를 함께 설치하고 모두 압축해야 한다.
- 압축 파일이 50MB 이하이면 바로 람다에 업로드하는데 그렇지 않으면 S3로 보내서 람다에서 참조한다.
Inline
: 람다 코드를 인라인으로 CloudFormation 템플릿에 정의하여 람다 함수를 업로드 한다.
S3
- 만약 S3에 코드를 업데이트했느나 CloudFormation 템플릿에 S3Bucket, S3Key 혹은 S3ObjectVersion을 하나도 업데이트하지 않았다면 CloudFormation이 함수를 업데이트해 주지 않는다.
through S3 Multiple accounts
Lambda Container Images
- Lambda 런타임 API를 구현하기만 한다면 직접 Lambda 베이스 이미지를 만들 수도 있다.
Best Practice
- 컨테이너 이미지 최적화
- AWS에서 제공된 베이스 이미지 사용
- 멀티 스테이지 빌드 사용
- 안정적인 것부터 자주 변경되는 계층 등, 다양한 계층에 이미지 빌드
- 계층 규모가 큰 함수에는 리포지토리를 하나만 사용
- 최대 10GB에 달하는 아주 큰 Lambda 함수를 업로드하려는 경우에 Lambda에 코드를 그대로 푸시하는 대신 아주 큰 컨테이너 이미지를 만들어 Lambda 함수의 기반으로 사용한다.
AWS Lambda Versions
: 현재 코드 상태에 만족하고 있을 때에 람다 함수를 게시하고 새 버전을 생성할 수 있다.
AWS Lambda Aliases
: 최종 사용자에세 안정적인 엔드 포인트를 제공한다.
Lambda & CodeDeploy
- Linear: 트래픽은 N분마다 100%까지 늘어난다.
- Canary: X%를 시도한 후 100%로 바꾼다.
- AllAtOnce: 가장 빠르면서도 위험
AppSpec.yml
- Name(required)
- Alias(required)
- CurrentVersion(required)
- TargetVersion(reauired)
Function URL
: API 게이트웨이나 애플리케이션 로드 밸런서를 사용하지 않고도 HTTP 엔드포인트로만 Lambda 함수를 노출할 수 있게 한다.
Security
- Resource-based Policy
- Cross-Origin Resource Sharing(CORS)
- AuthType NONE: Lambda 함수에 인증되지 않은 퍼블릭 액세스가 가능하다.
- AuthType AWS_IAM: Lambda 함수에 대한 요청을 인증하고 승인하는 데 IAM 사용(Lambda 호출 함수 URL 권한이 있어야 한다.), 같은 계정 내에 있다면 자격 증명 기반 정책이나 리소스 기반 정책 둘 중 하나로 API 호출을 허용한다. 교차 계정을 사용하는 경우에는 자격 증명 기반 정책과 리소스 기반 정책 모두가 허용되어야 한다.
Lmabda and CodeGuru Profiling
: Lambda 함수의 런타임 성능을 살펴볼 수 있다.
- AmazonCodeGuruProfilerAgentAccess 정책이 함수 IAM 역할에 추가된다.
AWS Lambda Limits to Know - per region
Excution
- 메모리 할당: 128MB - 10GB(1MB 단위로 증감)
- 최대 실행시간 900초
- 환경 변수 최대 4KB
- /tmp 폴더 용량 512MB
- 람다 함수 동시 실행 최대 1000건
Deploy
- zip 압축파일의 최대 크기는 50MB
- 압축하지 않았을 경우 250MB
- 처음부터 큰 파일을 사용해야 한다면 /tmp 디렉터리를 사용한다.
- 환경 변수 최대 4KB
AWS Lambda Best Practices
- 핸들러가 실행되는 시간을 최소화하기 위해 함수 핸들러 외부에서 많은 작업을 수행한다.
- 시간이 지남에 따라 변화하는 모든 것에 대해 환경 변수를 사용한다.
- 배포 패키지 크기를 런타임에 맞게 최소화한다.
- 재귀적인 코드를 피한다. Lambda 함수가 자기 자신을 호출해서는 안된다.