AWS 람다(AWS Lambda)란?

AWS 람다(AWS Lambda)란?

AWS 람다(AWS Lambda) 로고

AWS 람다AWS Lambda아마존 웹 서비스Amazon Web Services에서 제공하는 서비리스 컴퓨팅 서비스입니다. 2014년 11월 AWS 리인벤트AWS re:Invent에서 처음 발표 되었습니다. 서버리스 컴퓨팅은 애플리케이션을 실행하기 위한 별도의 서버 셋업 없이 곧바로 코드를 실행해주는 서비스를 의미하며, 고정 비용 없이 사용 시간에 대해서만 비용이 발생합니다. 아마존 EC2Amazon EC2가 현재 초 단위로 비용을 계산하는 반면* 람다의 경우 100ms당 요금을 계산되어 정확히 사용한만큼만 비용이 발생합니다.

* 아마존 EC2는 2017년 10월부터 시간당 과금에서 초당 과금으로 변경되었습니다.

AWS 람다에서는 2020년 2월 현재 C#, 파워셸PowerShell, 고Go, 자바Java, 자바스크립트JavaScript, 파이썬Python, 루비Ruby를 공식적으로 지원하고 있습니다. 공식 런타임이 없더라도 커스텀 런타임을 통해 지원하지 않는 언어를 사용할 수 있도록 확장할 수 있으며, 리눅스에서 실행가능한 임의의 바이너리를 포함해 실행하는 것도 가능합니다. 람다는 기본적으로 이벤트 드라이븐 방식으로 동작합니다. API 게이트웨이API Gateway와 엘라스틱 로드 밸런서Elastic Load Balancer의 HTTP 요청을 처리할 수 있으며, S3 객체, 다이나모DBDynamoDB, 키네시스Kinesis 등에서 발생하는 이벤트를 트리거로 실행하는 것도 가능합니다.

AWS 람다는 컨테이너를 지원하지 않지만, AWS에서는 람다와 별개로 컨테이너 기반의 서비리스 서비스 AWS 파게이트AWS Fargate를 제공하고 있습니다. AWS 람다와 유사한 컴퓨팅 서비스로는 마이크로소프트 애저Microsoft Azure애저 펑션Azure Functions, 구글 클라우드 플랫폼Google Cloud Platform클라우드 펑션Cloud Functions, 클라우드 런Cloud Run 등이 있으며, 쿠버네티스Kubernetes 위에서 서버리스 실행 환경을 직접 구축할 수 있는 케이네이티브Knative 등이 있습니다.

AWS에서는 2018년에 AWS 서버리스 컴퓨팅을 지원하기 위한 오픈 소스 경량 가상화 도구 파이어크랙커를 공개했습니다. AWS 람다는 파이어크랙커Firecracker를 기반으로 동작한다고 알려져있습니다.

AWS 람다 컴퓨팅 자원

람다의 컴퓨팅 자원은 128MB와 3,008MB 사이에서 64MB 단위로 결정할 수 있습니다. 메모리를 크게 지정할 수록 요금이 올라갑니다. 메모리 할당량은 성능에도 영향을 줍니다. AWS 람다 공식 FAQ 문서에 따르면 CPU 용량과 기타 리소스가 메모리 크기에 비례해서 증가한다고 합니다. 예를 들어 람다 함수에 256MB를 할당한 경우 128MB 할당한 경우보다 CPU 용량은 2배가 됩니다.

Q: 컴퓨팅 리소스는 AWS Lambda 함수에 어떻게 할당됩니까? AWS Lambda 리소스 모델에서 함수에 사용할 메모리 양을 선택하면 이에 비례하여 CPU 용량과 기타 리소스가 할당됩니다. 예를 들어, 256MB 메모리를 선택하면 Lambda 함수에 128MB 메모리를 요청할 때 CPU 용량의 약 두 배가 할당되고 512MB 메모리를 선택할 때 CPU 용량의 절반이 할당됩니다. 자세히 알아보려면 AWS의 함수 구성 설명서를 참조하십시오. AWS Lambda – FAQ

람다 함수 구성 문서에 따르면 1,792MB 메모리를 할당한 경우 1vCPU와 같다고 합니다. 따라서 메모리 크기는 초기 실행 시간과 전체 실행 시간 모두에 영향을 끼치게 됩니다. 유즈케이스에 따라 적절한 메모리를 할당하는 것이 중요합니다.

또한 AWS 람다 함수의 최대 실행 시간은 15분이며 제한 시간을 지정할 수 있습니다. AWS 람다 제한에 대한 자세한 정보는 AWS 람다 한도 문서를 참고해주세요.

AWS 람다 컴퓨팅 요금

AWS 람다는 크게 리퀘스트와 컴퓨팅에 의해서 비용이 됩니다. 2020년 2월 현재 리퀘스트는 1백만 요청당 0.2 USD의 요금이 발생합니다. 컴퓨팅에 대한 요금은 메모리 1GB를 기준으로 100ms당 0.000016667 USD로 계산됩니다.

예를 들어 512MB로 1초 동안 실행되는 람다 함수를 1백만번 호출하는 경우를 생각해보겠습니다.

따라서 총 비용은 83.535 USD가 됩니다.

이 계산은 람다의 비용 구조를 설명하기 위한 대략적인 설명입니다. 정확한 가격과 계산 방법은 AWS 람다 요금 페이지를 참고해주세요. AWS에서는 공식적으로 람다 요금을 미리 계산해볼 수 있는 요금 계산기도 제공하고 있습니다.

AWS 람다에서는 현재 매월 1백만 회의 무료 요청과 월별 400,000GB-초 컴퓨팅 시간을 프리티어로 제공하고 있습니다.

vs. 아마존 파게이트(Amazon Fargate): 컨테이너 기반 서버리스 컴퓨팅

아마존 파게이트Amazon Fargate는 AWS의 컨테이너 기반 서버리스 컴퓨팅 서비스로 AWS의 컨테이너 오케스트레이션 서비스인 아마존 ECSAmazon ECS와 아마존 EKSAmazon EKS를 기반으로 동작합니다. ECS와 EKS 클러스터는 기본적으로 EC2 인스턴스를 기반으로 동작하지만, 파게이트를 사용할 경우 별도의 EC2 인스턴스 없이도 컨테이너를 실행하는 것이 가능합니다.

AWS 람다와 마찬가지로 서비리스 컴퓨팅을 제공하는 서비스라는 면에서는 공통점이 있지만 컨테이너를 기반으로 한다는 차이가 있습니다. 컨테이너를 기반으로 하기 때문에 실행 환경을 람다보다 자유롭게 구성할 수 있습니다. 하지만 람다에 비해서 실행 속도가 느리고, 동시 실행할 수 있는 태스크 수가 적은 편이며, 요금도 비쌉니다. AWS 람다 함수의 최대 실행 시간이 15분인 반면 파게이트에는 시간 제한은 없습니다.

지원 언어 및 실행 환경

AWS에서는 2020년 2월 현재 C#, 파워셸PowerShell, 고Go, 자바Java, 자바스크립트JavaScript, 파이썬Python, 루비Ruby을 네이티브하게 지원하고 있습니다. 람다 함수는 런타임에 따라서 아마존 리눅스Amazon Linux 혹은 아마존 리눅스 2Amazon Linux 2에서 실행됩니다. 아마존 리눅스는 현재 지원 종료가 발표된 상태이므로, 새로 출시되는 런타임들은 아마존 리눅스 2를 기반으로 실행됩니다.

최신 정보는 AWS 람다 런타임 공식 문서의 내용을 참고해주세요.

노드js(Node.js) 런타임

노드jsNode.js 런타임은 현재 10, 12 버전을 지원하고 있습니다. 기존에는 6과 8을 지원했습니다만 현재는 지원 종료 되어서 더 이상 사용할 수 없습니다.

이름 식별자 JavaScript용 AWS SDK 운영 체제
Node.js 12 nodejs12.x 2.536.0 Amazon Linux 2
Node.js 10 nodejs10.x 2.488.0 Amazon Linux 2

2019년 12월 파이썬 3.8, 노드js 12.0, 자바 11 지원이 발표되었습니다.

AWS 람다(Lambda), 프로그래밍 언어 최신 버전 추가 지원: 파이썬 3.8, 노드 12.0, 자바 11

새소식, 2019-12-04 - AWS 람다에서 파이썬 3.8, 노드 12.0, 자바 11 등 프로그래밍 언어 최신 버전을 추가 지원합니다. 새로운 버전의 런타임들은 모두 아마존 리눅스 2를 기반으로 동작합니다.

파이썬(Python) 런타임

현재 AWS 람다에서 지원하는 파이썬 최신 버전은 3.8입니다. 파이썬 2.7은 1월 1일부로 지원 종료가 발표되었습니니다. 아직 AWS 람다에서 2.7 버전 지원 종료 계획은 따로 발표되지 않았습니다.

파이썬(Python) 2.7 공식 지원 종료

새소식, 2020-01-03 - 2020년 1월 1일, 파이썬(Python) 2.7 지원이 종료되었습니다. 이로써 파이썬 2.x 버전이 은퇴합니다. 수고한 연장자에게 작별 인사를, 그리고 이제 3.x 버전으로 넘어갈 시점입니다.
이름 식별자 AWS SDK 운영 체제
Python 3.8 python3.8 boto3-1.10.2 botocore-1.13.2 Amazon Linux 2
Python 3.7 python3.7 boto3-1.9.221 botocore-1.12.221 Amazon Linux
Python 3.6 python3.6 boto3-1.9.221 botocore-1.12.221 Amazon Linux
Python 2.7 python2.7 boto3-1.9.221 botocore-1.12.221 Amazon Linux

루비(Ruby) 런타임

루비 런타임은 2018년 AWS 리인벤트AWS re:Invent에서 발표되었습니다. 현재 루비 최신 버전은 2.7이지만, 2.5 발표 이후에 별도의 업데이트는 없는 상태입니다.

re:Invent 2018 - 람다(AWS Lambda), 프로그래밍 언어 루비(Ruby) 공식 지원을 발표

새소식, 2018-12-05 - 올 해도 re:Invent 2018에서는 다양한 서비스들을 발표했습니다. AWS 람다에서는 드디어 프로그래밍 언어 루비가 공식 지원됩니다. 또한 커스텀 엔진을 지원함으로서 공식 지원하지 않는 언어들도 사용할 수 있게되었습니다. 여기서는 루비 코드를 람다에서 실행하는 간단한 예제를 소개합니다.
이름 식별자 AWS SDK 운영 체제
Ruby 2.5 ruby2.5 3.0.1 Amazon Linux

루비 2.6이나 현재 최신 버전인 루비 2.7은 커스텀 런타임으로 사용할 수 있습니다.

AWS 람다(AWS Lambda) 커스텀 런타임 만들기(feat. 루비 2.6.0)

기사, 2019-01-04 - AWS 람다에서 공식 지원하지 않는 언어나 버전을 사용하고 싶은 경우 커스텀 런타임 기능을 활용할 수 있습니다. 이 글에서는 아직 AWS 람다에서 공식 지원하고 있지 않은 루비 2.6 최신 버전을 커스텀 런타임 기능을 사용해 실행하는 방법을 소개합니다.

자바(Java) 런타임

이름 식별자 AWS SDK 운영 체제
Java 11 java11 amazon-corretto-11 Amazon Linux 2
Java 8 java8 java-1.8.0-openjdk Amazon Linux

고(Go) 런타임

이름 식별자 AWS SDK 운영 체제
Go 1.x go1.x Amazon Linux

.NET 런타임

이름 식별자 AWS SDK 운영 체제
.NET Core 2.1 dotnetcore2.1 Amazon Linux

람다 함수 트리거

람다는 특정 이벤트를 기반으로 요청 받은 그 즉시 실행됩니다. API 게이트웨이나 애플리케이션 로드밸런서가 받은 요청을 기반으로 실행할 수도 있으며, AWS의 다양한 서비스와 연동할 수 있습니다. 또한 이벤트 브릿지를 통해 외부 서비스의 이벤트로 람다 함수를 실행하는 것도 가능합니다.

다른 서비스와 함께 사용하는 방법에 대한 자세한 내용은 공식 문서를 참고해주세요. 아래에서는 람다를 호출하는 가장 일반적인 패턴들을 소개합니다.

클라우드와치 이벤트(CloudWatch Events)

클라우드 와치 이벤트로 람다 트리거

클라우드 와치 이벤트를 소스로 람다 함수를 트리거링 할 수 있습니다. 클라우드 와치 이벤트 규칙의 소스는 크게 시간과 다른 서비스의 이벤트로 나뉩니다. 시간을 사용하는 경우 크론잡과 같이 실행 스케줄을 지정해 람다 함수를 실행하는 것이 가능합니다. 이벤트 기반으로 소스를 받는 경우 AWS의 다른 서비스들과 느슨하게 결합해서 람다를 실행할 수 있습니다.

S3 객체 이벤트

S3 객체 변경 이벤트로 람다 트리거

S3 버킷의 특정한 이벤트를 소스로 받아 람다 함수를 실행하는 것이 가능합니다. 예를 들어 사용자가 파일을 추가하거나 변경하면 자동적으로 메타데이터를 추출하는 람다 함수를 실행하거나, 이미지가 업로드 되면 특정 크기로 리사이즈하는 람다 함수를 실행할 수 있습니다.

외부 이벤트

데이터독 이벤트로 람다 트리거

아마존 이벤트브릿지Amazon EventBridge를 통해서 외부 서비스의 이벤트를 기반으로 람다 함수를 실행할 수 있습니다. 2020년 2월 현재 데이터독Datadog, 뉴 렐릭New Relic, 페이저듀티PagerDuty, 젠데스크ZenDesk 등의 서비스를 지원하고 있습니다. 지원하는 모든 외부 서비스 목록은 Amazon EventBridge 통합 페이지를 참고해주세요.

API 게이트웨이(API Gateway)

API 게이트웨이를 통해서 람다 트리거

API 게이트웨이를 통해 HTTP 요청을 람다 함수를 사용해 처리할 수 있습니다. 원래는 REST API만 지원해서 간단한 API를 구축하기에는 복잡한 편이었지만, 2019년 12월 API 게이트웨이 서비스에 HTTP API 방식이 추가되면서 좀 더 쉽게 사용할 수 있게 되었습니다.

REST API와 HTTP API 두 방식의 차이에 대해서는 다음 문서를 참고해주세요.

애플리케이션 로드 밸런서의 타깃 그룹

애플리케이션 로드 밸런서의 타깃 그룹으로 람다 트리거

람다 함수를 애플리케이션 로드 밸런서의 타깃 그룹으로 지정해서 요청을 처리할 수 있습니다. API 게이트웨이와 달리 애플리케이션 로드 밸런서를 사용하는 경우 고정 비용이 발생합니다.

re:Invent 2018 - ALB 타깃그룹의 새로운 타입으로 AWS 람다(AWS Lambda) 추가

새소식, 2018-12-18 - AWS 람다를 외부에 HTTP(S) 프로토콜로 노출시키기 위해서는 아마존 API 게이트웨이를 사용해야만 했습니다. re:Invent 2018 기간 중에 애플리케이션 로드밸런서 타깃그룹의 새로운 타깃 타입으로 AWS 람다 타입이 발표되었습니다. 이 기능을 사용하면 ALB 리스너로 람다가 연결된 타깃그룹을 사용할 수 있습니다.

AWS 람다 확장 기능 및 관련 서비스

AWS 람다의 확장 기능들과 관련된 서비스들을 소개합니다.

AWS 람다@엣지(AWS Lambda Edge)

람다@엣지Lambda@Edge는 클라우드 프론트에서 제공하는 기능으로 클라우드 프론트 엣지 상에서 람다 함수를 실행해줍니다. 클라우드 프론트 엣지는 CDN 파일을 전송해주는 캐시 서버로 리전보다 훨씬 다양한 위치에 있습니다.* 람다@엣지는 엣지 로케이션 직접 컴퓨팅을 수행하기 때문에 사용자에게 훨씬 더 빠르게 결과를 제공할 수 있습니다. 헤더 조작, SEO, 실시간 이미지 변환 등의 용도로 사용되며 일반 람다 함수보다 실행 시간 및 리소스 제약이 큽니다.

* 2020년 1월 현재 아마존 웹 서비스의 경우 22개 리전과 199개 엣지 로케이션에서 서비스가 되고 있습니다

AWS 람다 레이어(AWS Lambda Layers)

AWS 람다 함수를 배포할 때는 함수 실행에 필요한 모든 파일을 포함해야합니다. 이전에는 다수의 함수를 배포할 때 공통된 부분이 있더라도 매번 같은 내용을 람다 함수에 포함시켜야만 했습니다. 2018년 리인벤트에서 발표된 람다 레이어를 사용하면 공통된 부분을 레이어로 만들고 함수들 간에 공유해서 사용하는 것이 가능합니다. 레이어는 같은 계정뿐만 아니라 다른 계정들 사이에도 서로 공유해서 사용하는 것이 가능합니다.

re:Invent 2018 - AWS 람다(AWS Lambda), 함수 간 공유 가능한 레이어 기능 지원

새소식, 2018-12-26 - AWS 람다는 서버리스 애플리케이션 실행 환경입니다. re:Invent 2018에서는 루비 런타임 지원, ALB 타깃 그룹 타입 추가와 더불어 람다 레이어라는 새로운 기능을 발표했습니다. 람다 레이어는 람다 함수의 의존성을 분리하거나 함수간의 파일을 공유할 수 있는 기능입니다.

AWS 람다 레이어(AWS Lambda Layers)를 다른 계정이나 조직과 공유하기

기사, 2019-01-03 - 리인벤트(re:Invent) 2018에서는 AWS 람다의 새로운 기능으로 람다 함수들 간의 공통 부분을 공유할 수 있는 람다 레이어를 발표했습니다. 람다 레이어는 하나의 계정에서 공통 부분을 분리하는 데 사용할 수도 있지만 다른 조직이나 계정과 공유해서 사용하는 것도 가능합니다. 이 글에서는 람다 레이어를 다른 계정과 공유하는 방법에 대해서 알아봅니다.

프로비저닝 컨커런시(Provisioned Concurrency)

프로비저닝 컨커런시는 콜드 스타트 문제를 해결하기 위해 미리 람다 함수를 실행할 수 있도록 준비해두는 기능입니다.

람다 함수는 사용자 요청을 받은 즉시 환경을 준비하고 실행됩니다. 따라서 처음 실행될 때 실행 환경을 준비하는 시간이 걸리는 문제가 있습니다. 환경이 준비되어있지 않은 상태에서 함수를 실행하는 것을 콜드 스타트라고 부릅니다. 함수를 여러 번 실행하면 실행 환경이 재활용되기 때문에, 주기적으로 람다 함수를 호출하는 방식으로 콜드 스타트 문제를 완화할 수는 있습니다만, 동시 호출이 급작스럽게 늘어나는 등의 상황에서는 여전히 문제가 될 수 있습니다. 많은 동시 호출과 낮은 레이턴시가 둘 다 중요한 경우 프로비저닝 컨커런시 기능을 사용해 문제를 해결할 수 있습니다.

스텝 펑션(Step Functions)

스탭 펑션은 AWS 람다 함수들을 조합해 위크플로우를 구성하는 서비스입니다. 스탭 펑션은 ASLAmamzon States Lanugage로 작성된 워크플로우(상태 머신)를 실행하며, AWS 람다를 비롯하여 AWS 배치AWS Batch, 아마존 SNSAmazon SNS, 아마존 SQSAmazon SQS, 다이나모DBDynamoDB 등 다양한 서비스와 통합해서 사용할 수 있습니다.

RDS 프록시(RDS Proxy)

RDS 프록시는 클라이언트와 RDS 데이터베이스 사이에서 커넥션을 관리해주는 서비스입니다. 일반적인 서버 애플리케이션의 경우 자체적으로 데이터베이스 연결을 풀링하므로 예상가능한 범위에서 연결수가 유지됩니다. 이와 달리 데이터베이스를 조작하는 람다 함수의 경우 갑작스럽게 요청이 늘어나면 커녁션 수도 급격하게 늘어나서 데이터베이스 메모리 부족 등의 문제가 발생할 수 있습니다. RDS 프록시를 사용하면 이러한 문제를 완화할 수 있습니다.

프레임워크

AWS 람다는 단독으로 개발하고 배포할 수도 있지만, 다른 서비스와의 연동과 배포 편의성 등을 위해 프레임워크를 사용해서 개발하기도 합니다. 아마존 웹 서비스 공식으로 제공되는 AWS 서버리스 애플리케이션 모델 AWS Serverless Application Model을 비롯해 파이썬의 자파Zappa, 루비의 제트Jets, 노드js의 서버리스Serverless, 에이펙스Apex 등이 있습니다.

서버리스(Serverless)

서버리스는 AWS 람다를 비롯해 애저 펑션, 구글 클라우드 펑션 등을 지원하는 범용 서버리스 프레워크입니다. AWS 람다의 경우, 람다 함수 배포 뿐아니라 클라우드 포메이션 스택을 통해 IAM, 다이나모DBDynamoDB, S3, 클라우드 와치 이벤트CloudWatch Events 등 아마존 리소스를 함께 지원하고 있습니다. 오픈소스 버전은 무료로 제공되고 있으며, 추가 기능이 포함된 프로 버전은 유료로 제공됩니다.

에이펙스(Apex)

에이펙스(Apex)는 T. J. 할로웨이척T. J. Holowaychuk의 주도로 2016년 처음 공개된 서버리스 프레임워크입니다. AWS Lambda가 나오고 한 동안 서버리스Serverless 프레임워크와 함께 많이 사용되었습니다만, 현재는 더 이상 개발되고 있지 않습니다.

AWS 람다 활용 사례

당근마켓에서는 람다를 이용해 썸네일을 생성해왔으며, 현재는 람다@엣지를 통해 실시간 이미지 리사이즈를 수행합니다(2019).

로켓펀치에서는 외부 사이트에서 임베드해서 사용하는 사이드 위젯의 트래픽을 처리하기 위해 AWS 람다를 사용하고 있습니다(2017).

빙글에서는 기존의 모노리틱 루비 온 레일스 백엔드 서버를 노드js로 재구현하고 AWS 람다에서 서비스하고 있습니다(2018).

커뮤니티

아마존 웹 서비스 한국 사용자 커뮤니티 AWSKRUG 아래에 서버리스 소모임이 운영되고 있습니다.