AWS Lambda

chris·2022년 10월 22일
0

AWS

목록 보기
1/2

서버리스(serverless) 컴퓨팅이란

개발자가 서버를 관리할 필요 없이 Application을 빌드하고 실행 할 수 있는 Cloud Native 개발 모델이다.
클라우드 제공 업체가 서버 인프라에 대한 프로비저닝, 유지 관리, 스케일링 등의 작업을 처리하고 개발자는 서비스를 위한 코드만 제공하면 된다.


서버리스 아캐텍처 개요

표준 서비스로서의 인프라(Infrastructure-as-a-Service, IaaS) 클라우드 컴퓨팅 모델은 사용자가 Resource를 사전 구매해야 한다. 즉 Application을 구동하기 위해 클라우드 공급업체에서 상시 가동 중인 서버에 대한 비용을 지불해야 한다. Scale Up/Scale Down 또는 Scale Out/Scale In 모두 사용자가 제어를 해야 한다.
반면, 서버리스 아키텍처는 Application이 필요할 경우에만 실행된다. 이벤트가 Application 코드를 트리거하면 클라우드 공급업체가 해당 코드에 대한 리소스를 할당하고, 실행이 종료되면 리소스를 회수한다. 비용은 해당 Application이 실행된 시간만큼만 청구된다.

서버리스 컴퓨팅의 장점

  • 관리할 필요 없음: 서버리스 컴퓨팅 환경에서는 클라우드 제공 업체가 직접 운영체제의 하드웨어부터 애플리케이션 플랫폼까지 모두 관리한다. 사용자는 소스코드만 준비하면 된다.
  • 빠른 샐행 시간: 일반적으로 함수를 실행하기까지 걸리는 시간이 표준 클라우드 인스턴스에서는 1~2분 정도 소요되는 반면 서버리스 컴퓨팅에서는 보통 수초면 충분하다. 함수가 컨테이너 플랫폼 위에서 실행되도록 만들어졌기 때문에 가능하다.
  • 적은 비용: 클라우드 인스턴스의 호스팅 관리 비용보다 상당히 저렴하다. 일반적으로 비용은 함수 실행 소요 시간과 실행하는 동안 사용한 메모리 양을 토대로 청구된다.
  • 다양한 프로그래밍 언어 지원: Java, Node.js, Python, C#, Go와 같은 다양한 프로그래밍 언어를 지원한다.
  • 마이크로서비스 호환성: 서버리스 컴퓨팅 함수는 특정 역할이나 활동을 수행하는 작고 독립적인 코드 단위다. 따라서 마이크로서비스의 전달 수단으로 사용할 수 있다. 클라우드 환경에서 효율적으로 확장하기 어려운 모놀리식 애플리케이션과 비교해 엄청난 장점이라 할 수 있다.
  • 이벤트 중심 애플리케이션: 서버리스 함수는 특정 이벤트에 반응하고 몇몇 동작을 수행하는 이벤트 중심 애플리케이션을 설계하고 실행하는데 제격이다. 예를 들어 클라우드 스토리지에 이미지를 업로드하면, 원본 이미지에 대한 섬네일 이미지를 생성하는 기능을 트리거하거나, Kafka 이벤트를 처리하는데 사용할 수 있다.

서버리스 컴퓨팅의 단점

  • 실행 소요 시간: 서버리스 함수는 짧은 시간 동안 실행하도록 설계됐다. AWS Lambda의 경우 최대 실행 시간이 15분이다. 때문에 15분 이상이 소요되는 Application엔 적합하지 않다.
  • 상태 없음(Stateless): 서버리스 함수에서 상태는 존재하지 않는다. 함수 실행을 완료하거나 특정 이유로 종료되더라도 데이터를 로컬 디스크에 저장하지 않는다.
  • 벤더 락인(lock-in): 클라우드 제공 업체는 서버리스 컴퓨팅에 각기 고유한 도구와 서비스를 제공하기 때문에 특정 벤더에 종속적인 경향이 있다. 작성한 함수를 수정하지 않고 다른 클라우드 제공 업체의 서비스에 배포 할 수 없다.

AWS Lambda

AWS Lambda는 2014년 라스베이거스에서 개최된 AWS re:Invent 행사에서 처음 소개됐다. Lambda는 특정 이벤트의 응답으로 코드를 실행하는 단순한 컴퓨팅 서비스로, 초기 아이디어는 오늘까지도 변함없다.
이벤트는 S3 버킷에 객체를 업로드하는 작업부터 DynamoDB 테이블에 레코드를 삽입, Kafka 이벤트 등이 있다.
단순히 AWS Lambda에 코드를 제공하는 것으로 Lambda는 코드를 성공적으로 배포하기 위해 내부 인프라 자원을 할당하고 적절히 배포한 다음 운영을 위한 준비와 관리를 한다. 코드의 가용성까지 책임진다.


동작방식

표준 EC2 인스턴스에서 코드를 실행하는 것과 비교하면 Lambda가 코드를 컨테이너 기술의 일부 형태로 제공하는 방식이 훨씬 빠르다. 컨테이너는 공통 이미지(Amazon Linux AMI: amzn-ami-hvm-...)로 제작된 EC2 인스턴스를 활용한다. AWS가 직접 컨테이너 혹은 EC2 인스턴스를 관리하기 때문에 사용자가 확인하거나 제어할 수 없다.
배포된 각 함수는 요청할 때마다 호출되거나 특정 유형의 이벤트에 기반을 둬 동적으로 호출될 수 있다. 사용할 수 있는 이벤트는 다음과 같다.

  • Amazon S3: S3 버킷에 객체가 생성, 갱신, 삭제될 때 Lambda 함수를 트리거
  • DynamoDB: 특정 DynamoDB 테이블에 행 삽입, 삭제 등과 같은 갱신 작업이 발생할 때 Lambda 함수를 트리거
  • Amazon Simple Notification Service(SNS): 메시지가 NSN Topic에 발행될 때 Lambda 함수를 트리거
  • 이벤트 스케줄링: cron 작업과 같이 예약된 이벤트로 Lambda 함수 실행
    Lambda 함수를 생성할 때 함수가 필요한 메모리 양과 실행하는 데 걸리는 대략적인 시간, 즉 제한 시간(timeout)을 지정해야 한다.
    메모리는 128MB~10240MB
    제한 시간은 3s~900s까지 설정할 수 있다.
    메모리와 제한 시간을 모두 상한값으로 설정해도 함수 동작 시 최대치로 사용하지 않는다.


AWS Lambda 시작하기

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와 같이 서버리스 서비스에 필요한 템플릿을 손쉽게 작성할 수 있다.

SAM CLI을 이용한 AWS Lambda Project 생성

  1. SAM CLI 설치
$ brew tap aws/tap
$ brew install aws-sam-cli
  1. SAM CLI 설치 확인
$ sam --version
# 성공적으로 설치하면 다음과 같이 버전이 확인된다.
SAM CLI, version 1.57.0
  1. SAM CLI 업데이트
$ 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 # 
  1. Build project
    프로젝트를 패키징하고 배포할 수 있도록 소스 코드를 스테이징 Directory로 복사한다. 빌드에 성공하면 .aws-sam/build 배포 파일이 생성된다.
$ sam build
  1. Deploy
$ 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 함수를 확인 할 수 있다.

profile
software engineer

0개의 댓글