개발자가 서버를 관리할 필요 없이 Application을 빌드하고 실행 할 수 있는 Cloud Native 개발 모델이다.
클라우드 제공 업체가 서버 인프라에 대한 프로비저닝, 유지 관리, 스케일링 등의 작업을 처리하고 개발자는 서비스를 위한 코드만 제공하면 된다.
표준 서비스로서의 인프라(Infrastructure-as-a-Service, IaaS) 클라우드 컴퓨팅 모델은 사용자가 Resource를 사전 구매해야 한다. 즉 Application을 구동하기 위해 클라우드 공급업체에서 상시 가동 중인 서버에 대한 비용을 지불해야 한다. Scale Up/Scale Down 또는 Scale Out/Scale In 모두 사용자가 제어를 해야 한다.
반면, 서버리스 아키텍처는 Application이 필요할 경우에만 실행된다. 이벤트가 Application 코드를 트리거하면 클라우드 공급업체가 해당 코드에 대한 리소스를 할당하고, 실행이 종료되면 리소스를 회수한다. 비용은 해당 Application이 실행된 시간만큼만 청구된다.
AWS Lambda는 2014년 라스베이거스에서 개최된 AWS re:Invent 행사에서 처음 소개됐다. Lambda는 특정 이벤트의 응답으로 코드를 실행하는 단순한 컴퓨팅 서비스로, 초기 아이디어는 오늘까지도 변함없다.
이벤트는 S3 버킷
에 객체를 업로드하는 작업부터 DynamoDB 테이블에 레코드를 삽입
, Kafka 이벤트
등이 있다.
단순히 AWS Lambda
에 코드를 제공하는 것으로 Lambda
는 코드를 성공적으로 배포하기 위해 내부 인프라 자원을 할당하고 적절히 배포한 다음 운영을 위한 준비와 관리를 한다. 코드의 가용성까지 책임진다.
표준 EC2 인스턴스에서 코드를 실행하는 것과 비교하면 Lambda
가 코드를 컨테이너 기술의 일부 형태로 제공하는 방식이 훨씬 빠르다. 컨테이너는 공통 이미지(Amazon Linux AMI: amzn-ami-hvm-...)로 제작된 EC2 인스턴스를 활용한다. AWS가 직접 컨테이너 혹은 EC2 인스턴스를 관리하기 때문에 사용자가 확인하거나 제어할 수 없다.
배포된 각 함수는 요청할 때마다 호출되거나 특정 유형의 이벤트에 기반을 둬 동적으로 호출될 수 있다. 사용할 수 있는 이벤트는 다음과 같다.
AWS Lambda function은 AWS Console, AWS SAM CLI, IDE Plugin을 사용하여 생성할 수 있다.
이 글에서는 SAM CLI를 통해서 Lambda function을 생성하고 배포하는 과정을 설명한다.
SAM(Serverless Application Model), SAM은 CloudFormation을 확장한 버전으로 CloudFormation에서 제공하던 템플릿과 비슷한 방식으로 API Gateway, DynamoDB, Lambda와 같이 서버리스 서비스에 필요한 템플릿을 손쉽게 작성할 수 있다.
$ brew tap aws/tap
$ brew install aws-sam-cli
$ sam --version
# 성공적으로 설치하면 다음과 같이 버전이 확인된다.
SAM CLI, version 1.57.0
$ brew upgrade aws-sam-cli
windows환경의 경우 여기에서 설치방법 확인
4. Create lambda project
$ sam init
You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1
# 1번을 입력
Choose an AWS Quick Start application template
1 - Hello World Example
2 - Multi-step workflow
3 - Serverless API
4 - Scheduled task
5 - Standalone function
6 - Data processing
7 - Infrastructure event management
8 - Serverless Connector Hello World Example
9 - Multi-step workflow with Connectors
10 - Lambda EFS example
11 - Machine Learning
Template: 1
# 1번을 입력
Use the most popular runtime and package type? (Python and zip) [y/N]: N
# Nodejs 프로젝트를 생성할 것이기 때문에 N을 입력
Which runtime would you like to use?
1 - dotnet6
2 - dotnet5.0
3 - dotnetcore3.1
4 - go1.x
5 - graalvm.java11 (provided.al2)
6 - graalvm.java17 (provided.al2)
7 - java11
8 - java8.al2
9 - java8
10 - nodejs16.x
11 - nodejs14.x
12 - nodejs12.x
13 - python3.9
14 - python3.8
15 - python3.7
16 - ruby2.7
17 - rust (provided.al2)
Runtime: 10
# Nodejs16을 사용할 것이기 때문에 10을 입력
What package type would you like to use?
1 - Zip
2 - Image
Package type: 1
# 파일 업로드 형식으로 배포할 것이기 때문에 1을 입력
Based on your selections, the only dependency manager available is npm.
We will proceed copying the template using npm.
Select your starter template
1 - Hello World Example
2 - Hello World Example TypeScript
Template: 1
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: n
Project name [sam-app]: first-lambda
# 프로젝트 이름을 입력
Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)
-----------------------
Generating application:
-----------------------
Name: first-lambda
Runtime: nodejs16.x
Architectures: x86_64
Dependency Manager: npm
Application Template: hello-world
Output Directory: .
Next steps can be found in the README file at ./first-lambda/README.md
Commands you can use next
=========================
[*] Create pipeline: cd first-lambda && sam pipeline init --bootstrap
[*] Validate SAM template: cd first-lambda && sam validate
[*] Test Function in the Cloud: cd first-lambda && sam sync --stack-name {stack-name} --watch
위와 같이 프로젝트가 성공적으로 생성이 되면 first-lambda
directory하위에 다음과 같은 구조로 프로젝트가 생성된다.
.
├── README.md
├── events
│ └── event.json
├── hello-world
│ ├── app.js # lambda function logic 포함 파일
│ ├── package.json
│ └── tests
│ └── unit
│ └── test-handler.js
└── template.yaml #
.aws-sam/build
배포 파일이 생성된다.$ sam build
$ sam deploy --guided
Deploying with following values
===============================
Stack name : sam-app # CloudFormation Sack name입력
Region : ap-northeast-2 # Lambda function 배포 region 입력
Confirm changeset : False
Deployment s3 bucket : sam-bucket
Capabilities : ["CAPABILITY_IAM"]
Parameter overrides : {} # SAM Template에 정의된 파라미터가 있을 경우 사용
Initiating deployment
=====================
Waiting for changeset to be created..
CloudFormation stack changeset
---------------------------------------------------------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType
---------------------------------------------------------------------------------------------------------------------------------------------------
+ Add HelloWorldFunctionHelloWorldPermissionProd AWS::Lambda::Permission
+ Add ServerlessRestApiDeployment47fc2d5f9d AWS::ApiGateway::Deployment
+ Add ServerlessRestApiProdStage AWS::ApiGateway::Stage
+ Add ServerlessRestApi AWS::ApiGateway::RestApi
* Modify HelloWorldFunctionRole AWS::IAM::Role
* Modify HelloWorldFunction AWS::Lambda::Function
---------------------------------------------------------------------------------------------------------------------------------------------------
2019-11-21 14:33:24 - Waiting for stack create/update to complete
CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-------------------------------------------------------------------------------------------------------------------------------------------------
UPDATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole -
UPDATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole -
UPDATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
UPDATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5 Resource creation Initiated
f9d
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermis Resource creation Initiated
sionProd
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermis -
sionProd
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5 -
f9d
CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5 -
f9d
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage -
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage Resource creation Initiated
CREATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage -
CREATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermis -
sionProd
UPDATE_COMPLETE_CLEANUP_IN_PROGRES AWS::CloudFormation::Stack sam-app -
S
UPDATE_COMPLETE AWS::CloudFormation::Stack sam-app -
-------------------------------------------------------------------------------------------------------------------------------------------------
Stack sam-app outputs:
---------------------------------------------------------------------------------------------------------------------------------------------------
OutputKey-Description OutputValue
---------------------------------------------------------------------------------------------------------------------------------------------------
HelloWorldFunctionIamRole - Implicit IAM Role created for Hello World arn:aws:iam::123456789012:role/sam-app-
function HelloWorldFunctionRole-104VTJ0TST7M0
HelloWorldApi - API Gateway endpoint URL for Prod stage for Hello World https://0ks2zue0zh.execute-api.us-east-1.amazonaws.com/Prod/hello/
function
HelloWorldFunction - Hello World Lambda Function ARN arn:aws:lambda:us-east-1:123456789012:function:sam-app-
HelloWorldFunction-1TY92MJX0BXU5
---------------------------------------------------------------------------------------------------------------------------------------------------
Successfully created/updated stack - sam-app in ap-northeast-2
위와 같이 배포 성공하면 AWS Console에서 배포된 lambda 함수를 확인 할 수 있다.