서버가 없어도 되는 실행할 수 있는 함수이다. 15분의 시간제한이 있어서 실행시간이 짧다. 실행한만큼 비용을 내게 되는 서비스이다.
Lambda Function을 타겟 그룹에 포함 시켜야 한다. ALB는 Lambda로 invoke할 때 HTTP데이터를 JSON으로 변경시킨다. 그리고 받아서 보내줄 때도 다시 변경시켜서 사용자에게 보내준다.
ALB 설정을 통해서 Multi HeaderValue를 가질 수 있다. URL 파라미터에 name = foo & name = bar
라고 되어 있다면, 람다에 전달 될 때, name = ["foo", "bar"]
이렇게 전달된다.
CloudFront와 함께 쓴다. viewer request / origin request / origin response / viewer response 를 람다로 변형시킨다. 클라이언트와 서버 사이에 응답과 요청을 람다로 변형시킨다는 말이다.
이를 통해 웹사이트 보안 및 개인정보 보호, SEO 향상, 실시간 이미지 변형, 지능적인 오리진 및 데이터센터 라우팅, bot 완화, A/B 테스팅, 사용자 우선 순위, 트래킹, 분석, 인증, 권한 부여 등을 할 수 있다.
이벤트 큐가 있고 수명주기를 가진다. (디폴트 6시간) 요청을 보내면 202로 accepted를 받게되고 요청의 성공여부는 모른다. 실패할 경우 몇번 다시 retry하고 실패하면 Dead-letter Queue(SQS)에 남겨지게 된다.
레코드가 소스에서 폴링되는 형식이다.
예를 들어 스트림 형식 서비스 연결할 때, 어떠한 데이터가 흘러 들어와서 람다를 통해서 데이터가 가공되고 다시 스트림 서비스로 들어가는 형식이다.
이벤트 매퍼의 실패결과를 다른 곳으로 전송하는 것이다. 비동기로 움직이며, DLQ가 아니라 다른 목적지로 실패한 레코드를 보낼 수도 있다. 성공한 것 뿐만아니라 실패한 것도 목적지를 만들 수 있어서 좋다.
cron으로 람다함수 실행 혹은 상태 변경(이벤트)을 통해서 람다함수 실행
상태 변경(이벤트)을 통해서 람다함수 실행
예제: S3 event -> 람다 -> other 서비스(ex. dynamoDB)
환경변수를 저장할 수 있다. KMS를 통해서 암호화하는데 도움을 받을 수 있다.
Configuration -> 환경변수에서 설정 가능
람다는 개인의 VPC가 아니라 AWS의 VPC에서 실행된다. 그러므로 람다는 개인 VPC에 원래 접속할 수 없다. 개인 VPC로 연결하고 싶다면 람다함수에 보안그룹이랑 VPC ID, Subnet, ENI 를 설정해줘야 한다. 그리고 AWSLambdaVPCAccessExecutionRole을 설정해주면 ENI로 연결가능하게 된다.
예제: 람다 -> ENI -> RDS 이렇게 접속
여기에는 주의사항이 있다. 람다에서는 공용 서브넷에 배포해도 인터넷 엑세스 공용 IP 접근 권한이 없다. Private VPC에서 람다를 사용해서 퍼블릭 액세스를 만들려면 NAT Gateway 혹은 Instance 가 필요하다. VPC Endpoint가 사용가능한 서비스에는 NAT대신 VPC Endpoint를 사용해도 된다. (NAT 비용 꽤 나감)
RAM은 128 ~ 10 GB 설정할 수 있고, CPU는 RAM의 용량을 따라간다. 1792MB당 1 vCPU이다. 그러므로 CPU bound 작업 시엔 RAM에 따라 CPU가 만들어지기 때문에 RAM을 증가시켜야 한다. 2GB당 2 vCPU이기 때문이다.
타임아웃 3 ~ 900초 설정할 수 있고, 15분이 넘어가는 작업은 다른 서비스로 해야한다. 람다 실행 Context가 있다. 다시 호출 될 것을 생각하고 일정 기간 문맥을 가지고 있기 때문에 재사용으로 성능 향상이 가능하다. 실행컨텍스트에는 /tmp 디렉터리가 추가되어있고 실행전반에 쓸 수 있다. (용량이 큰 파일을 잠시 저장할 때나, 정적파일 사용할 때 쓰는게 좋다. 512MB가 맥스치이며, 넘어가는 것은 S3로 사용하면 된다.)
재요청이 많을 경우, 람다 함수 밖의 컨텍스트는 유지시켜주니까, 함수 밖에서 HTTP client, db 커넥션같은 것을 초기화 시키는 게 좋다.
동시에 1000개만큼 동시실행이 가능하다. 티켓열어서 1000개보다 더 키울 수도 있다. 해당 설정을 제한할 수 있는데, 안 그러면 비용이 어마무시하게 나올 수 있다. 그리고 다른 서비스에는 더 많이 실행되게 설정안해놨는데 얘만 커질 수도 있기 때문에 제한은 무조건 하는 걸로 하자.
Throttle이 생길 경우, 동기일때는 429 Error가 떨어지고, 비동기 일때는 DLQ로 넘어간다. DLQ에서 이벤트 큐로 넘겨서 재시도 가능하다. 재시도 간격은 1초 ~ 5분 으로 지수간격 재시도를 실시한다. (최대 6시간동안)
콜드 스타트는 사용자가 새롭게 람다 요청을 했을 때 람다가 켜지고 있을 상황에 사용자 경험이 안좋아지는 것을 뜻하는데, 프로비저닝 동시성을 통해 개선 가능하다. (어플리케이션 오토 스케일링 미리 람다를 켜놓는 것) 스케줄, 아니면 어떠한 메트릭 값을 트리거링해서 설정할 수도 있다.
외부라이브러리를 사용하는 경우, 코드에 패키지를 설치하고 압축해야 한다. 50MB 이하면 바로 업로드, 아니라면 S3 업로드해서 가져오면 되는데, SDK는 패키징이 필요없다.
Inline Function은 외부 라이브러리를 사용 못하는 단점이 있다. 아니라면 S3에서 zip파일을 가져오는 방법이 있다. 이 때는 S3 버저닝을 추천한다. 코드가 업데이트 되었을 때, 객체버전만 바꿔서 바로 적용할 수 있으니까.
다중 계정에서도 가능하다. 계정 1의 S3에 버켓 폴리시를 설정하고, 계정 2에서 CloudFormation이 실행역할로 계정 1의 S3의 데이터를 가져온 다음 람다를 실행할 수 있다.
람다 함수 안에서 다른 함수를 모듈로 사용할 수 있다는 말이다. 라이브러리를 레이어로 놓으면 바로 사용할 수 있기 때문에 편의성에 매우 중요하다!
10GB까지 가능하고, ECR에서 이미지 가져온다. 기본이미지는 Lambda Runtime API를 사용해야 한다. (베이스 이미지) 거기 위에 내가 놓고 싶은 이미지들을 올리면 된다.
게시를 할 때마다 람다함수가 V1, V2 하면서 각 버전은 immutable 상태가 된다. lastest 버전은 계속 변하는 버전이기 때문에 mutable하다. Alias를 통해서 사용자가 편하게 사용할 수 있도록 만들 수 있다. 예를 들면, dev alias는 latest 버전을 가져오고 TEST alias는 V2 가져오고 Prod alias는 V1 을 가져오는 형식이다.
Alias는 블루/그린 배포가 가능하게 한다. (V1에 95%, V2에 5% 트래픽 보내기) 별칭은 다른 별칭을 참조할 수 없고, 자신의 ARN을 가진다.