[AWS] Lambda 정리
AWS Lambda에 대한 자세한 정보가 궁금하다면, AWS 공식 사이트를 참조하시기 바랍니다.
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/welcome.html
AWS Lambda란 무엇인가요? - AWS Lambda
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com
1. AWS Lambda
AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스로서, 모든 유형의 애플리케이션이나 백엔드 서비스에 대한 코드를 별도의 관리 없이 실행 가능합니다.
이는 서버리스 컴퓨팅 플랫폼으로, 서버리스란 서버가 없다는 뜻이 아니며, 개발자가 서버의 존재를 신경 쓸 필요가 없다는 의미입니다. 서버가 잘 돌아가고 있는지, 개수와 사양이 적당한지 등에 대해 신경 쓸 필요 없이 사용자는 오직 코드에만 집중하면 됩니다.
Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패포, 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다. Lambda를 사용하면 Lambda가 지원하는 언어 런타임 중 하나로 코드를 제공하기만 하면 됩니다. 현재 파이썬, 자바, Node.js, 루비, C#, PowerShell, 구글 Go로 작성된 런타임을 지원합니다.
Lambda 함수에 코드를 구성하면, Lambda 서비스는 필요할 때만 함수를 실행하고 자동으로 확장됩니다. 사용자는 사용한 컴퓨팅 시간, 용량에 대해서만 비용을 지불하면 됩니다. (코드가 실행되지 않을 때는 요금이 부과되지 않습니다.)
1.1 Lambda를 사용해야 하는 경우
코드를 계속 실행시키기 보다는 특정한 시기에만 실행시키는 경우에 Lambda를 사용하는 게 유리합니다. 빠르게 스케일 업 해야하고, 수요가 없을 때는 0으로 스케일 다운해야 하는 시나리오에 이상적인 컴퓨팅 서비스입니다.
예를 들면, 아래와 같은 경우에 적합합니다.
1) 서버를 띄우지 않고 간단한 코드를 실행 시키고 싶은 경우
2) 특정 기간 또는 특정 주기로 코드를 실행시켜야 하는 경우
3) 트리거가 실행될때만 코드를 실행시키고 싶은 경우
Lambda를 사용하면 사용자는 자신의 코드에 대해서만 책임을 갖습니다. Lambda는 메모리, CPU, 네트워크 및 기타 리소스의 균형을 제공하는 컴퓨팅 플릿을 관리하여 코드를 실행합니다. Lambda가 이러한 리소스를 관리하며, 사용자를 대신하여 용량 관리, 모니터링 및 Lambda 함수 로깅을 비롯한 운영 및 관리 활동을 수행합니다.
* 컴퓨팅 플릿(Computing Flick)
가상 혹은 물리적인 컴퓨팅 자원들의 집합을 의미합니다. 이 개념은 컴퓨팅 리소스를 필요에 따라 유연하게 확장하거나 축소할 수 있는 환경을 제공하기 위해 만들어졌습니다. 컴퓨팅 플릿은 클라우드 컴퓨팅의 한 형태로서, 사용자가 필요한 만큼의 컴퓨팅 자원을 동적으로 할당 받을 수 있게 해줍니다. 이를 통해 사용자는 자신의 애플리케이션 또는 작업에 필요한 컴퓨팅 리소스를 신속하게 얻을 수 있으며, 비용을 절감하고 유연성을 높일 수 있습니다.
1.2 Lambda 실행 환경
하드웨어에서도 업그레이드 할 수 있는 메모리나 CPU 제한이 있듯이, Lambda에도 실행 환경 스펙 제한이 있습니다.
1) CPU: EC2 처럼 정해져 있는 게 아니고, 메모리에 따라 CPU 사양이 자동으러 설정되는 형태입니다.
2) 메모리: 128MB ~ 10240MB (2020년 기준 10GB로 향상)
3) 임시 저장용 디스크 공간: 512MB ~ 10240MB
4) 최대 실행 시간: 900초 (람다 함수는 최대 15분까지만 실행할 수 있습니다.)
5) 압축 시 패키지 크기: 50MB
6) 압축을 풀었을 때 패키지 크기: 250MB
여기서 패키지 크기는 함수를 실행하는 데 필요한 모든 코드를 일컫습니다. (의존성도 포함) 압축하지 않은 패키지의 경우 최대 250MB가 제한이며 압축된 경우 50MB 제한이 적용됩니다.
1.3 Lambda의 장단점
1) 장점
1-1) 비용 절감
필요할때만 함수가 호출되어 처리한다는 점에서 항상 서버를 켜두고 있지 않아도 되므로 비용을 절약할 수 있습니다.
Lambda 함수의 요청 수와 Lambda 코드의 실행 시간에 따라서 요금이 부과됩니다.
프리티어의 경우, 1GB 메모리 환경에서 월 100만 건, 월 40만 초의 실행 시간이 무료로 제공됩니다.
1-2) 인프라 운영 관리 부담 절감
성능이나 보안 등 서버 자체의 관리는 AWS가 자체적으로 해주기 때문에 서버를 관리할 필요가 없으므로, 운영 관리에 대한 부담이 줄어듭니다. 예를 들면 Lambda는 트래픽이 증가할 경우 자동 오토 스케일링을 실행합니다.
* 참고로 Lambda는 컨테이너 개념으로 스케일링 됩니다. EC2의 오토 스케일링 같이 가상 OS가 새로 생성되는 게 아니라, OS 위에 독립적인 하나의 프로그램을 키는 방식이기 때문에 훨씬 가볍게 확장이 가능합니다. 이벤트가 발생할 때 생성되고, 더 이상 사용하지 않을때는 제거됩니다.
1-3) 빠른 개발 배포
Lambda를 이용하게 되면 개발 및 배포에 대한 소요 시간이 상당히 짧아지게 됩니다. AWS 자체에서 많은 기능을 제공해주고 있어서 API 연동이 쉬우며, 서버리스의 강점인 배포 방식 역시 매우 쉬운편입니다. 그저 함수를 수정해주기만 하면 됩니다.
2) 단점
2-1) 리소스 제한
Lambda는 메모리는 최대 10GB, 처리 시간(함수 실행 시간)은 최대 900초, 15분으로 제한되어 있습니다. 즉, 하나의 함수가 한 번 호출될 때 AWS에서는 최대 10GB의 메모리까지 사용이 가능하며, 처리 시간은 최대 15분을 넘어갈 수 없습니다.
2-2) Stateless (상태 비저장)
Lambda는 함수가 호출되면 새로운 컨테이너를 띄우는 방식이기 때문에, 별도의 상태를 저장하지 않습니다. 이는 Lambda 함수가 이벤트에 의해 트리거 될 때마다 완전히 새로운 환경에서 호출된다는 것을 의미합니다. 그래서 이전 이벤트의 실행 컨텍스트에 대한 액세스 권한이 업다보니, DB Connection을 유지하는 것 같은 기능은 수행하지 못합니다.
2-3) ColdStart
Lambda는 리소스를 효율적으로 사용하기 위해서 오래 사용하지 않을 경우 잠시 컴퓨팅 파워를 끄고 있게 됩니다. 그래서 다시 사용하려고 할 때, Lambda 컨테이너를 띄우기 위해 서버를 키고, 실행 환경을 구성하는데 약간의 시간이 걸립니다.
즉, 요청이 와서 Lambda 함수를 실행하게 되면 어느정도 딜레이가 발생됩니다.
* 하지만 EC2 같은 경우 항상 가동된 상태에서 요청을 받을 준비가 되었기 때문에 딜레이가 존재하지 않습니다. 이를 ColdStart의 반댓말인 WarmStart 라고 부릅니다. Lambda는 WarmStart인 AWS EC2에 비해 약 1ms 만큼의 지연이 있습니다.
즉, 서버리스의 최대 단점인 ColdStart 문제를 해결하는 게 가장 큰 관건이라 할 수 있습니다.
[ ColdStart 해결 방법 ]
(1) Lambda를 계속 호출해줍니다.
사실 항상 컨테이너가 준비되어 있게 하도록 Lambda를 지속적으로 호출하는 게 가장 좋습니다. 하지만 호출이 될 때마다 비용이 산정되는 방식이기 때문에 그만큼 비용이 더 들 수 있습니다.
(2) 람다의 메모리를 늘려 스펙을 높입니다.
메모리를 더 할당할 수록 컴퓨팅 스펙이 높아지기 때문에 처리 속도가 빨라져서 딜레이가 줄어들 수도 있습니다.
(3) 프로비저닝 된 동시성을 활성화 하는 방법입니다.
2019년 콜드 스타트 문제를 해결하기 위해 나온 옵션으로 함수의 호출에 바로 응답할 수 있게 미리 준비하는 옵션입니다. 이를 활성화 하면 미리 함수의 환경을 세팅해두기 때문에 딜레이가 줄어들지만, 추가적인 비용이 들게 됩니다.
2-4) 동시성 제한
동시성이란 특정 시각에 함수가 제공하는 요청의 수 입니다. 함수가 호출되면 Lambda 함수의 인스턴스를 할당하여 이벤트를 처리하고, 실행을 마치면 다른 요청을 처리할 수 있습니다.
Lambda는 각 리전 별 동시에 실행할 수 있는 Lambda 함수의 개수를 최대 1000개로 제한하고 있습니다. 그러므로 요청 수가 1000개를 넘어가게 되면 Lambda가 수행되지 않는 문제점이 발생할 수도 있습니다.
* Lambda의 동시성이란 특정 시간에 Lambda 함수가 처리할 수 있는 요청의 수 입니다. Lambda는 기본적으로 1개의 워커를 가지고 있는 컨테이너의 개념입니다. 그러므로 요청에 의해 함수가 호출이 되면, 하나의 컨테이너를 띄우고 작업을 처리합니다. 만약 요청을 처리하는 와중에 다시 Lambda 함수가 호출된다면 또 다른 컨테이너를 띄우기 때문에 동시성이 증가합니다.