사전 AWS Lambda
구현체

AWS Lambda

gabury1고친 사람 github-actions[bot]

Lambda 는 코드 한 덩이를 맡아 두었다가 부를 때만 실행해 주는 아마존의 서비스입니다. 서버를 빌려 켜 둘 필요가 없습니다. 아무도 부르지 않는 동안에는 아무것도 돌지 않고 요금도 붙지 않습니다.

쉽고 빠른 이해

코드 한 덩이를 아마존에 맡겨 두면 부를 때만 돌려 주는 서비스입니다. 사진이 올라오면 작은 미리보기를 만드는 코드를 맡겨 두면, 사진이 올라올 때만 그 코드가 돕니다.

서버를 직접 굴리면 아무도 안 쓰는 새벽에도 켜 두어야 하고, 켜 둔 시간만큼 돈이 나갑니다. 사람이 몰릴 때 서버를 늘리고 잦아들면 줄이는 일도 직접 해야 합니다.

돌아가는 방식은 이렇습니다.

  1. 코드를 올리고 무엇이 이 코드를 부를지 정해 둡니다
  2. 그 일이 벌어지면 아마존이 코드를 돌릴 환경을 마련해 실행합니다
  3. 코드가 결과를 돌려주면 그 실행은 끝납니다

대가가 있습니다. 한참 안 부르다 처음 부르면 그다음 호출보다 오래 걸립니다. 실행이 끝나면 메모리에 담아 둔 것이 남는다는 보장이 없습니다. 한 번에 오래 걸리는 일에는 맞지 않습니다.

상세

AWS Lambda 는 AWS(Amazon Web Services, 아마존 웹 서비스)가 빌려주는 서비스 가운데 하나입니다. 받아서 설치하는 프로그램이 아니라, 코드를 아마존에 맡겨 두고 실행을 대신 시키는 물건입니다.

이 절은 Lambda 에 무엇을 맡기게 되는지, 그 대신 무엇을 손에서 놓게 되는지를 차례로 봅니다. 사진이 올라오면 작은 미리보기를 만드는 코드 하나를 줄곧 예로 씁니다.

이름이 비슷한 람다 계산법의 람다와는 관계가 없습니다. 이 편에서 말하는 Lambda 는 아마존이 서비스에 붙인 제품 이름입니다.

맡기는 것은 함수 하나

서버를 직접 굴릴 때는 프로그램을 통째로 올리고 계속 켜 둡니다. 요청이 오든 안 오든 그 프로그램은 메모리에 떠 있고, 켜 둔 시간만큼 요금이 나갑니다. 사람이 몰릴 때 서버를 늘리고 잦아들면 줄이는 일도 굴리는 쪽이 합니다.

Lambda 에 올리는 것은 함수 하나입니다. 입력을 하나 받아 처리하고 결과를 돌려준 뒤 끝나는 코드 덩이입니다. 미리보기 예로 보면 「사진 한 장을 받아 작은 사진을 만들어 저장한다」가 함수 하나입니다.

코드를 올릴 때는 그 안에서 어디부터 시작할지 한 군데를 정해 알려 줍니다. 이 시작 지점을 핸들러라고 부릅니다. Lambda 가 코드를 부를 때 핸들러부터 들어옵니다.

나머지는 Lambda 가 정합니다. 코드를 어느 컴퓨터에 둘지, 언제 띄울지, 몇 개나 띄울지를 맡기는 것입니다. 그 결정권을 넘기는 것이 이 서비스를 쓰는 값이자 대가입니다.

이렇게 함수 단위로 코드를 올려 두고 부를 때만 돌리는 방식을 서버리스라고 부릅니다. Lambda 는 그 방식을 클라우드에서 파는 제품 가운데 하나입니다.

부를 때만 도는 실행

호출이 오면 Lambda 는 코드를 담을 실행 환경을 하나 마련합니다. 그 안에 올려 둔 코드를 넣고 핸들러를 부릅니다. 함수가 결과를 돌려주면 그 호출은 끝납니다.

부르는 쪽이 없으면 돌고 있는 실행 환경도 없습니다. 켜 둔 서버가 없으니 대기하는 동안 내는 요금도 없습니다. 요금은 부른 횟수와 함수가 돈 시간으로 매겨집니다.

한 번 마련한 실행 환경은 호출이 끝나도 잠시 남아 있습니다. 그동안 다음 호출이 오면 그 환경을 다시 씁니다. 한참 아무도 안 부르면 그 환경은 사라집니다.

stateDiagram-v2
    [*] --> 없음
    없음 --> 마련: 첫 호출이 왔다
    마련 --> 실행: 핸들러를 부른다
    실행 --> 대기: 결과를 돌려줬다
    대기 --> 실행: 다음 호출이 왔다
    대기 --> 없음: 한참 안 불렀다

그림에서 요금이 붙는 구간은 「실행」뿐입니다. 「없음」과 「대기」는 쓰는 쪽이 내는 것이 없습니다.

사라진 뒤의 첫 호출은 환경을 새로 마련하고 코드를 올리는 일부터 해야 합니다. 그래서 그 호출은 뒤따르는 호출들보다 오래 걸립니다. 이것을 콜드 스타트라고 부릅니다.

동시에 불리면 환경이 늘어난다

실행 환경 하나는 한 번에 호출 하나만 처리합니다. 앞 호출이 끝나기 전에 다음 호출이 오면 Lambda 는 환경을 하나 더 마련합니다.

flowchart TD
    subgraph A["호출이 하나씩 올 때"]
        C1["호출"] --> E1["실행 환경 1"]
    end
    subgraph B["호출 셋이 겹칠 때"]
        C2["호출"] --> E2["실행 환경 1"]
        C3["호출"] --> E3["실행 환경 2"]
        C4["호출"] --> E4["실행 환경 3"]
    end

그래서 스케일 아웃을 사람이 지시하지 않습니다. 부르는 쪽이 늘면 환경 수가 따라 늘고, 잦아들면 줄어듭니다. 서버를 몇 대 띄울지 미리 고민하던 일이 없어집니다.

늘어나는 데에도 끝이 있습니다. 한 계정이 한꺼번에 돌릴 수 있는 환경 수에 상한이 걸려 있고, 거기 닿으면 남은 호출은 거절되거나 기다립니다. 함수 하나가 트래픽을 다 먹으면 같은 계정의 다른 함수까지 같이 막힙니다.

실행이 끝나면 남는 것이 없다

함수가 결과를 돌려준 뒤에는 그 코드가 더 돌지 못합니다. 응답을 먼저 보내 놓고 뒷정리를 이어서 하는 식은 통하지 않습니다. 할 일은 결과를 돌려주기 전에 끝내야 합니다.

다음 호출이 앞서 쓰던 실행 환경으로 갈지 새 환경으로 갈지는 정해져 있지 않습니다. 그래서 메모리에 담아 둔 값은 다음 호출에 남아 있을 수도, 사라졌을 수도 있습니다. 세어 둔 횟수나 장바구니처럼 남아야 하는 값을 메모리에 두면 값이 들쭉날쭉해집니다.

남아야 하는 값은 데이터베이스나 오브젝트 스토리지 같은 바깥 저장소에 둡니다. 이렇게 실행과 실행 사이에 아무것도 남기지 않는 성질을 무상태라고 부릅니다.

함수 한 번의 실행이 이어질 수 있는 시간에도 상한이 있습니다. 상한을 넘기면 하던 일이 끊깁니다. 큰 파일을 통째로 변환하거나 밤새 도는 배치처럼 오래 걸리는 일에는 맞지 않습니다.

함수를 부르는 쪽

함수를 부르는 것은 대개 사람이 아니라 다른 서비스입니다. 저장소에 파일이 놓이거나 큐에 메시지가 쌓이면 그쪽이 Lambda 를 부릅니다. 이렇게 「무슨 일이 벌어졌다」를 알리는 한 건을 이벤트라고 부릅니다.

함수는 그 이벤트를 입력으로 받습니다. 무엇이 어디서 벌어졌는지가 거기 적혀 있습니다. 미리보기 예로 보면 「어느 저장소에 어떤 이름으로 사진이 올라왔다」가 입력입니다.

부르는 쪽이 결과를 기다리느냐 아니냐가 갈립니다. 기다리는 호출은 함수의 결과를 돌려받습니다. 안 기다리는 호출은 일을 맡겨 두고 갑니다.

안 기다리는 쪽은 실패하면 부르는 쪽이 다시 부릅니다. 그래서 같은 이벤트로 함수가 두 번 돌 수 있습니다. 두 번 돌아도 결과가 달라지지 않게 짜는 것을 멱등성이라고 부릅니다.

무엇을 포기했나

Lambda 가 덜어 주는 것과 가져가는 것은 같은 결정 하나에서 나옵니다. 서버를 내 것으로 두지 않기로 한 것입니다. 켜 두는 일을 아마존에 넘기는 대신, 켜져 있는 동안 할 수 있던 것을 놓습니다.

서버를 직접 굴릴 때 Lambda 에 맡기면
프로세스를 띄워 두고 메모리에 캐시를 쌓습니다 실행이 끝나면 남는다는 보장이 없습니다
배치를 몇 시간이고 돌립니다 한 번의 실행이 도는 시간에 상한이 있습니다
운영체제와 설치할 프로그램을 내가 고릅니다 Lambda 가 준비한 실행 환경 위에서 돕니다
서버에 들어가 도는 프로세스를 들여다봅니다 남긴 로그와 지표로만 들여다봅니다
서버 한 대 값이 고정입니다 부른 만큼 냅니다
같은 프로그램을 다른 곳에 그대로 띄웁니다 부르는 방식과 이벤트 모양이 AWS 것입니다

마지막 줄이 벤더 종속입니다. 함수 안의 계산 코드는 옮기기 쉽지만, 무엇이 이 함수를 부르고 어떤 모양의 입력이 들어오는지는 AWS 에 맞춰 짜여 있습니다. 옮기려면 그 부분을 다시 짭니다.

요금도 한 방향으로만 유리하지는 않습니다. 부르는 일이 드물면 켜 둔 서버보다 적게 냅니다. 쉬지 않고 불리는 함수라면 같은 일을 서버 한 대로 받는 편이 쌀 수 있습니다.

언제 쓰고 언제 안 쓰나

맞는 일은 한 건이 짧게 끝나고, 언제 얼마나 올지 모르는 일입니다. 올라온 사진에서 미리보기를 만드는 일이 그렇습니다. 하루에 몇 장이 올라올지 모르고, 한 장을 처리하는 데 오래 걸리지 않습니다.

안 맞는 일도 뚜렷합니다. 한 번에 오래 도는 일, 첫 호출이 늦는 것을 못 견디는 일, 실행 환경을 손봐 가며 써야 하는 일입니다.

쉬지 않고 대량으로 불리는 일도 다시 따져 봅니다. 그 경우에는 Amazon EC2(Elastic Compute Cloud, 엘라스틱 컴퓨트 클라우드) 같은 서버를 빌리는 쪽과 요금을 견줘 보고 정합니다.

관련 항목

AWS Lambda 를 이루는 실행 단위

함수 · 핸들러 · 실행 환경 · 런타임 · 이벤트 · 페이로드

AWS Lambda 가 속하는 상위 분류

AWS · 서버리스 · FaaS · 클라우드 컴퓨팅 · 관리형 서비스 · 이벤트 기반 아키텍처

AWS Lambda 함수를 깨우는 이벤트 발생원

Amazon S3 · Amazon SQS · Amazon SNS · API 게이트웨이 · Amazon DynamoDB · Amazon EventBridge · 크론

AWS Lambda 에서 자주 걸리는 문제

콜드 스타트 · 동시 실행 제한 · 타임아웃 · 스로틀링 · 중복 실행 · 벤더 종속

AWS Lambda 함수가 상태를 맡기는 저장소

데이터베이스 · 오브젝트 스토리지 · Amazon RDS · Redis · 캐시 · 큐

같은 역할을 두고 겨루는 함수 실행 서비스

Google Cloud Functions · Azure Functions · Cloudflare Workers · Knative · OpenFaaS

같은 코드를 대신 돌릴 수 있는 다른 실행 방식

Amazon EC2 · 컨테이너 · Amazon ECS · Kubernetes · AWS Fargate · 가상 머신

AWS Lambda 함수를 배포하고 들여다보는 도구

AWS CLI · AWS SDK · AWS CloudFormation · Terraform · Amazon CloudWatch · 로그 · 지표

AWS Lambda 함수가 지켜야 하는 설계 성질

무상태 · 멱등성 · 스케일 아웃 · 최소 권한 · IAM · 분산 추적

이름만 겹치고 뜻이 다른 이웃

람다 계산법 · 익명 함수 · 람다 표현식

다른 이름: Lambda · AWS 람다 · aws lambda