AWS(Amazon Web Service)

[AWS] 솔루션 설계자 관점의 Serverless - Lambda

yunseohhe 2024. 12. 10. 17:09

AWS Lambda

 

  • EC2는 클라우드의 가상 서버라서 프로비저닝이 필요하다.
  • 프로비저닝을 할 메모리와 CPU 크기가 제한된다.
  • 지속적으로 실행되어야해서 최적화를 하기위해 효율적으로 시작하고 중단해야 한다.
      - 그렇지 않으면 인스턴스에 어떤 일이 생기든 관계없이 EC2는 지속적으로 실행된다.
  • 오토 스케일링 그룹으로 스케일링 할 수 있는데, 자동으로 서버를 추가하고 제거하는 그런 작업을 해야 한다는 뜻이다.

  • Lambda는 가상 함수이다.
  • 관리할 서버 없이 코드를 프로비저닝하면 함수가 실행되는 것이다.
  • 제한 시간이 있어서 실행 시간이 짧다고 하지만 최대 15분은 그렇게 짧지는 않다.
  • 온디맨드로 실행된다. 즉, Lambda를 사용하지 않으면 람다함수가 실행되지 않고 비용 역시 함수가 실행되는 동안만 청구되며 호출을 받으면 온디맨드로 실행된다.
  • 스케일링이 자동화된다.
      - 더 많은 람다 함수를 동시에 필요로 하는 경우, AWS가 자동으로 프로비저닝해서 람다 함수를 늘려준다.

 

 

AWS Lambda의 장점

  • 가격 책정이 아주 쉽다.
      - Lambda가 수신하는 요청의 횟수에 따라 과금되는데 호출 횟수와 컴퓨팅 시간, 즉 Lambda가 실행된 시간만큼 청구된다.
      - 프리 티어에서도 Lambda를 넉넉하게 제공해주는데 Lambda 요청 1백만 건과 40만 GB-초의 컴퓨팅 시간이 포함된다.
  • 다양한 AWS 서비스와 통합되기도 한다.
  • Lambda에 여러 가지 프로그래밍 언어를 사용할 수 있어서 상당히 자유로운 편이다.
  • CloudWatch와의 모니터링 통합도 쉽다.
  • 함수당 더 많은 리소스를 프로비저닝 하려면 함수당 최대 10GB의 램을 프로비저닝 할 수 있다.
  • 함수의 RAM을 증가시키면 CPU 및 네트워크의 품질과 성능도 함께 향상된다.

 

AWS Lambda를 지원하는 언어

  • Node.js (JavaScript)
  • Python
  • Java (Java 8 호환)
  • C# (.NET Core)
  • Golang
  • C# / Powershell
  • Ruby
  • 사용자 지정 런타임 API
      - 예를 들어 Rust 언어 함수를 Lambda에서 사용하는 것도 오픈 소스 프로젝트가 있어서 가능하다.
  • Lambda 컨테이너 이미지를 지원한다.
      - 컨테이너 이미지 자체가 Lambda의 런타임 API를 구현해야 한다. 즉, 아무 컨테이너 이미지나 Lambda에서 실행되지는 않고 컨테이너 이미지를 만들 때 전제 조건이 필요하다.
      - ECS와 Fargate는 계속 임의의 도커 이미지를 실행할 때 더 많이 사용된다.
      - Lambda에 컨테이너를 실행해야 할 경우, 해당 컨테이너가 Lambda 런타임 API를 구현하지 않으면 ECS나 Fargate에서 컨테이너를 실행해야 한다.

 

AWS 서비스와 Lambda의 통합

  • API Gateway는 REST API를 생성하고 람다 함수를 호출한다.
  • Kinesis는 Lambda를 이용해 바로 데이터를 변환한다.
  • DynamoDB는 트리거를 생성할 때 사용되는데 데이터베이스에 어떤 일이 생기면 람다함수가 작동되도록 한다.
  • Amazon S3는 언제든 람다 함수를 작동시킬 수 있다.
  • CloudFront용 람다는 Lambda@Edge이다.
  • CloudWatch Events와 EventBridge에서는 AWS의 인프라에 어떤 일이 생기고 그 상황에 대응하고자 할 때, 예를 들어 파이프라인이 끊기거나, 상태가 바뀌는 경우 등 상황에 따라 자동화를 실행하려고 람다 함수를 사용한다.
  • CloudWatch Logs는 어디든 해당 로그를 스트리밍 한다.
  • SNS로 알림과 SNS 토픽에 대처할 수 있다.
  • SQS로는 SQS 대기열 메시지를 처리할 수 있다.
  • Cognito는 예를 들어 사용자가 데이터베이스에 로그인할 때마다 응답한다.

 

예시 : Serverless Thumbnail creation(썸네일 생성)

  • S3 버킷이 있고, 여기서 바로 썸네일을 생성하고 싶다고 해보자.
  • Amazon S3에 새 이미지가 업로드되는 이벤트가 생기고 S3 이벤트 알림을 통해 람다 함수가 작동된다.
  • 그리고 이때 람다 함수에는 섬네일을 생성하는 코드가 있다.
  • 해당 썸네일은 다른 S3 버킷이나 같은 S3 버킷으로 푸시 및 업로드 된다.
      - 원래 이미지보다 작은 크기로
  • 람다 함수는 몇몇 데이터를 DynamoDB에 삽입할 수 있다.
      - 이미지 이름, 크기, 생성 날짜 등 이미지의 메타 데이터가 삽입
  • Lambda 덕분에 기능이 자동화되고 S3에 새 이미지와 앱이 생성되는 이벤트에 대한 반응형 아키텍처를 얻는다.

 

 

예시 : Serverless CRON 작업

  • CRON이란 EC2 인스턴스에서 작업을 생성하는 방법이다.
  • 5분마다, 월요일 10시마다 등등을 지정한다.
  • CRON은 가상 서버에 실행해야 한다.
      - EC2 인스턴스 등에서
      - 즉, 인스턴스가 실행되지 않거나 CRON이 아무 일도 안하면 인스턴스 시간이 낭비된다.
  • CloudWatch 이벤트 규칙 또는 EventBridge 규칙을 만들고 1시간마다 작동되게 설정해서 1시간마다 람다 함수와 통합되면 태스크를 수행할 수 있게 된다.(서버리스 CRON을 만드는 방법이다.)
  • CloudWatch 이벤트는 서버리스이고 람다 함수 역시 서버리스이다.

 

AWS Lambda 가격책정 예시

  • 호출당 청구
      - 처음 1백만 건의 요청은 무료이고, 이후 1백만건 요청마자 20센트가 과금된다.
      - 또한 1ms 단위로 요금이 부과된다.
  • 한 달간 첫 40만 GB 초 동안의 컴퓨팅 시간은 무료로 사용한다.
      - GB 초 = 함수가 1GB RAM을 가질 때 실행 시간이 40만 초이며 실행시간이 8배 늘어나려면 함수의 RAM은 8배 작은 128MB RAM이 되어야 한다.
      - 이후에는 60 GB 초당 1달러가 과금된다.
  • 홈페이지 : https://aws.amazon.com/ko/lambda/pricing/
 

서버리스 컴퓨팅 – AWS Lambda 요금 – Amazon Web Services

 

aws.amazon.com

 

 

 

AWS Lambda의 한도

  • 실행 한도
      - 실행 시 메모리 할당량은 128MB에서 10GB이고 메모리는 1MB씩 증가한다.
      - 메모리가 증가하면 더 많은 vCPU가 필요하다.
      - 최대 실행 시간은 900초(15분)이다.
      - 환경변수는 4KB까지 가질 수 있는데 상당히 제한적인 공간이나 Lambda함수를 생성하는 동안 큰 파일을 가져올 때 사용할 수 있는 임시 공간이 있다.
      - /tmp 폴더에 용량이 있으며 크기는 최대 10GB이다.
      - Lambda함수는 최대 1,000개까지 동시 실행이 가능하며 요청 시 증가할 수 있지만 동시성은 미리 예약해 두는 것이 좋다.
  • 배포 한도
      - 압축 시 최대 크기는 50MB이다.
      - 압축하지 않았을 때는 250MB이다.
      - 용량을 넘는 파일의 경우 /tmp 공간을 사용해야 한다.
      - 시작할 때 크기가 큰 파일이 있으면 /tmp 디렉터리를 사용한다.
      - 배포 시에도 환경변수의 한도는 4KB이다.
      - 예를 들어, 30GB의 RAM과 30분의 실행 시간이 필요하고 3GB의 큰 파일을 있을 때는 워크로드 처리에 Lambda 함수가 적합하지 않다는 걸 판단할 수 있다.

 

 

AWS Lambda의 Snap Start

  • Lambda 함수의 성능을 높이기 위한 Lambda의 기능이다.
  • Java 11 이상에서 실행되는 Lambda 함수들을 추가 비용 없이 성능을 최대 10배 높여준다.
  • Lambda 호출을 몇 개의 수명 주기 단계가 있는데 Snap Start가 비활성화되어 있고 Java에서 실행 중인 Lambda 함수가 있다면 Lambda 함수가 호출되었을 때, 우리의 Java 코드가 초기화된 후에 호출되고 shutdown(종료)될 것이다. 그러나 Snap Start가 활성화되어 있으면 함수가 미리 초기화된 상태에서 호출 될 것이다. 즉, 처음에 함수 초기화가 없다는 의미이다.
  • Snap Start를 활성화하면 Java에서 실행 중인 Lambda 함수가 호출되는데 함수가 이미 초기화 되어있기 때문에 Java에서는 굉장히 오래 지속될 수 있는 초기화 단계가 없어지고 바로 호출 단계로 넘어가고 shutdown 단계로 넘어가게 된다.
  • 완전히 무료인 기능이고 작동하는 방법
      - 새로운 Lambda 버전을 발행할 때 Lambda가 우리의 함수를 초기화 할 것이다. 즉, 이 초기화 단계가 미리 진행되어 있을 것이다.
      - 그 이후에 메모리와 초기화된 함수의 디스크 상태의 스냅샷이 생성된 후 마지막으로 이 스냅샷이 저지연 액세스를 위해 캐시될 것이다. 이는 우리의 함수가 Snap Start, 빠른 시작을 할 수 있도록 한다.