목차
Lambda(람다)란?
람다는 아마존 웹서비스에서 제공하는 서버리스 컴퓨팅 서비스이다.
* 서버리스란? 별도의 서버 셋팅없이 바로 코드를 실행할 수 있는 환경을 말한다.
따라서 서버를 계속 띄우기 보다, API를 호출할때만 서버를 동작하게 하고싶을 때 람다를 사용하면 유용하다!
람다는 어떻게 동작할까?
- 람다가 실행시킬 수 있는 코드용량은 250MB 이다.
- 함수 실행시간은 최대 15분
- 하나의 람다함수는 하나의 실행환경(컨테이너)에서 실행된다.
- 람다는 함수가 호출될때 새로운 컨테이너를 띄워 처리한다.
-> 가볍게 확장이 가능하다.
-> Stateless. = 별도의 상태를 저장하지 않는다. = DB Connection등을 유지할 수 없다.
(개념적으로는 그렇다.. Warm Start경우엔 유지할수도있다..! 아래내용 참고)
⚠ 잠시 생각해보자.
0.1초마다 요청이 들어오는 상황에서, 람다는 매번 새로운 컨테이너를 띄워 처리할까?
0.1초마다 컨테이너를 만들게되면 리소스 낭비가 심해지니 AWS는 람다를 재사용할 수 있게 설정해두었다.
- 람다가 동시호출되면 빨간부분처럼 각각 컨테이너를 생성한다.
- 0.1초 후에 람다를 호출하면 새로운 컨테이너가 생성되는 것이 아니라
녹색부분처럼 기존의 컨테이너를 재사용하게된다!
Cold Start VS Warm Start
- AWS는 리소스를 효율적으로 사용하기 위해 오래 호출되지 않은 람다에 대한 컴퓨팅 파워를 꺼놓는다.
- 람다가 최초실행 되거나, 오랜만에 호출되었을 경우 컨테이너, 실행환경 등을 구성하는 과정을 거친다.
Cold Start라고 하며, 이것저것 준비하는 만큼 응답속도가 살짝 느리다.
- 람다가 빠른시간 내에 다시 호출되었을 경우, 기존 컨테이너를 재사용하는 것을 Warm Start라고 한다.
Warm Start의 경우에는 전역변수도 이전에 변경된 값을 유지할 수 있다.
당연히 Cold Start보다 응답속도가 빠르다
람다 함수 구성
// ❗❗ 핸들러 함수 바깥영역은 Cold Start시에만 실행된다.
exports.myHandler = function(event, context, callback){
// 로직추가
callback(Error error, Object result);
}
- myHandler : 람다함수 이름
- event : 람다를 트리거한 이벤트에 대한 모든 정보를 포함하고 있음.
= 누가 람다를 실행시켰는가에 대한 정보가 담김
EX) HTTP로 람다를 호출할 경우, event에는 Http요청정보가 들어있다.
(참고) event.json 형식
- context : 람다함수가 실행되는 런타임에 대한 정보. 누가 실행시켰는가와 구분없는 정보
(참고) Node.js 환경의 context 속성
- callback : 람다함수가 모두 실행된 후 결과 또는 오류와 함께 callback함수를 호출한다.
람다와 데이터베이스 커넥션
람다가 실행될때마다 DB와 커넥션을 맺고, 함수가 종료되었다고하자.
DB는 람다가 실행종료되었는지 알 수 있을까? 명시적으로 커넥션을 끊은 경우가 아니라면 모른다!
람다 컨테이너가 사라지기까지 3분, DB TTL이 15분이라했을 때,
5분마다 람다에 요청이 들어오면 새로운 커넥션은 계속 맺어지는데 DB에는 기존 커넥션이 종료되지 않은 상태로 남아있게된다.
결국 데이터베이스 커넥션수의 한계까지 도달하면 다른 서비스들에서도 DB에 접근하지 못하게된다!!
=> 핸들러 내부에서 DB와 연결한다면 커넥션을 명시적으로 끊어주자!
람다는 수행시간 * 요청수 만큼 비용을 지불해야한다.
핸들러 함수 내부에서 커넥션을 맺고 끊는다면 그만큼 수행시간이 늘어나 비용폭탄..을 맞을 수 있다.
가장 권장하는 방법은
=> 커넥션을 핸들러 함수 외부에서 맺어 Warm Start시 기존에 맺었던 커넥션을 활용하는 것이다!
람다가 동시에 100번 호출되어 100개의 컨테이너가 생성되고 람다 함수 실행이 종료되어도
컨테이너는 일정시간동안 유지되기 때문에 1초 뒤 100개의 호출이 들어와도 기존의 커넥션을 그대로 활용할 수 있게된다.
람다 Invocation Type
람다는 동기식 / 비동기식으로 함수를 호출할 수 있는데, 이것을 InvocationType으로 설정할 수 있다.
- RequestResponse
함수를 동기적으로 호출
API 응답 : 상태코드 및 추가데이터
Amazon kinesis, DynamoDB Streams, SQS, ALB, API Gateway는 람다를 RequestResponse 방식으로 호출한다. - Event
함수를 비동기적으로 호출.
API 응답 : 상태코드만 존재.
💥응답값이 람다함수의 성공을 의미하는 200이 아닌 요청 잘 받았다!의 202가 떨어진다. 유의
비동기 호출의 경우, 람다는 이벤트를 먼저 Queue에 넣고 여유가 생겼을 때 꺼내와서 처리한다.
실패한 이벤트는 Dead-letter Queues 를 활성화해야 확인할 수 있다.
Amazon S3, Amazon SNS, EventBridge 등은 람다를 Event 방식으로 호출한다. - DryRun
파라미터값의 유효성 검사 & 함수 호출권한 확인
람다의 Invocation Type을 알고있으면 트러블슈팅이 훨씬 편해진다!
시나리오 1
SQS가 람다를 호출하였는데 실패하였다. 데이터는 어디로 갔을까? 람다는 다시 실행될까?
-> SQS는 람다를 동기적으로 호출한다. 몇번 Retry하다가 실패응답을 보내줄 것이다.
-> 동기적으로 호출하다가 실패한 것이니 SQS쪽이 뭔가 잘못보내주고있는 것 같은데?!
시나리오 2
S3가 람다를 호출하였는데 실패하였다. 이벤트는 어디로갈까? 람다는 다시 실행될까?
-> S3는 람다를 비동기적으로 호출한다. S3가 Retry하다가 이벤트가 유실될수도 있다.-> 비동기적으로 호출하다가 실패한 것이니 람다가 뭔가 문제있는것 같은데?!
Serverless Framework
람다를 실행하려면 매번 zip파일로 압축해서 업로드하고 실행시키고 테스트하고 실패하고...를 반복해야한다
귀찮으니 로컬에서 람다를 실행시킬 때 사용하는 것이 Serverless Framework이다
람다 코드에 대한 형상관리도 할 수 있고, 코드수준에서 AWS 리소스를 관리할 수 있게된다!
참고
https://velog.io/@jdd04026/Lambda
https://www.youtube.com/watch?v=_wDRrFa-6Gc
#AWS #Lambda #람다 #람다란 #람다동작방법 #람다함수구성 #람다특징 #람다실행환경 #람다컨테이너 #coldstart #warmstart #event #context #람다와데이터베이스 #람다데이터베이스커넥션 #람다커넥션 #invoke #invocationtype #requestresponse #event #dryrun #serverlessframework #람다프레임워크 #람다로컬실행
'Infra' 카테고리의 다른 글
S3, CloudFront, Lambda@Edge를 이용한 이미지 리사이즈(2) - S3, CloudFront 셋팅 (0) | 2023.05.28 |
---|---|
S3, CloudFront, Lambda@Edge를 이용한 이미지 리사이즈(1) - Lambda@Edge란? (0) | 2023.05.28 |
AWS S3 SFTP로 접속하기 (0) | 2022.06.01 |
CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(3) (0) | 2022.03.18 |
CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(2) (0) | 2022.03.18 |