본문 바로가기

Infrastructure/Certificate

[SAA] AWS Lambda

AWS Lambda

이번 장에서는 SAA를 준비하며 AWS Lambda에 대해서 알아보도록 한다.


Serverless Overview

  • 서버리스(Serverless)는 개발자들이 서버를 더 이상 관리할 필요가 없는 새로운 패러다임이다.
  • 단지 코드를 배포하거나, Function을 배치하는 것만으로 작동한다.
  • 처음에는 AWS Lambda에서만 Serverless 개념이 사용되었지만 현재는 "데이터베이스, 메시징, 스토리지 등" 관리되는 모든 것을 포함한다.
  • Serverless라고 해서 서버가 없는 것은 아니며, 개발자가 직접 서버를 Manage/Provision 할 필요가 없다는 것을 의미한다.
  • 아래는 AWS에서 제공되는 여러 Serverless 서비스다.
    • AWS Lambda
    • DynamoDB
    • AWS Cognito
    • AWS API Gateway
    • Amazon S3
    • AWS SNS & SQS
    • AWS Kinesis Data Firehose
    • Aurora Serverless
    • Step Functions
    • Fargate


AWS Lambda

  • Amazon EC2:
    • 클라우드의 가상 서버다.
    • RAM 및 CPU에 의해 제한된다.
    • 지속적으로 실행된다.
    • 스케일링은 서버의 추가나 제거를 위한 개입을 위미한다.
  • Amazon Lambda:
    • Virtual Functions: 관리할 서버가 없다.
    • 시간 제한: 짧은 실행시간을 가진다.
    • 온-디멘드 실행
    • 스케일링이 자동화된다.

Benefits

  • 간편한 가격 정책
    • 요청당, 컴퓨팅 시간당 지불하면 된다.
    • 1,000,000개의 AWS Lambda 요청 및 400,00GB의 컴퓨팅 시간이 Free Tier에 포함된다.
  • AWS 전체 서비스 제품군과 통합된다.
  • 많은 프로그래밍 언어와 통합된다.
  • AWS CloudWatch를 통한 간편한 모니터링이 가능하다.
  • 기능당 더 많은 리소스 확보가 용이하다.(최대 10GB RAM)
  • RAM을 증설하는 경우, CPU와 Network 성능도 향상된다.

언어 지원

  • AWS Lambda는 아래의 언어 및 프레임워크를 지원한다.
    • Node.js (Javascript)
    • Python
    • Java (Java 8 호환)
    • C# (.NET Core)
    • Golang
    • C# / Powershell
    • Ruby
    • Custom Runtime API (커뮤니티 지원, 대표적으로 Rust)
    • Lambda Container Image
      • 컨테이너 이미지는 Lambda Runtime API를 구현해야 한다.
      • ECS/Fargate는 임의의 Docker 이미지를 실행하는 데 선호된다.
  • AWS Lambda는 아래와 같이 많은 AWS 서비스와 통합된다.

  • AWS Lambda를 사용하여 아래와 같이 썸네일을 생성할 수 있다.

  • CloudWatch EventBridge를 사용하여 일정 시간마다 CRON Job을 실행시킬 수 있다.

Pricing

  • 전반적인 가격 정보는 여기에서 확인할 수 있다.
  • 호출당 가격:
    • 최초 1,000,000건의 요청은 무료로 제공된다.
    • 이후 요청 100만 건당 $0.2(요청당 $0.0000002)
  • 지속되는 시간당 가격(1ms 단위로 증가):
    • 매달 400,000GB 초의 무료 컴퓨팅 시간이 제공된다.
    • == 기능이 1GB RAM인 경우 400,000초
    • == 기능이 128MB RAM인 경우 3,200,000초
    • 이후 60만 GB-second에 1달러를 지불하면 된다.
  • AWS Lambda를 운영하는 것은 일반적으로 매우 저렴하기 때문에 인기가 많다.

Lambda 제한(Limit) - 지역별

  • 실행(Execution)
    • 메모리 할당: 128MB ~ 10GB(1MB씩 증분)
    • 최대 실행시간: 900초(15분)
    • 환경변수(4KB)
    • "Function Container"의 디스크 용량(/tmp): 512MB ~ 10GB
    • 동시 실행: 1,000(증가 가능)
  • 배포(Deployment)
    • Lambda 함수의 배포 사이즈(compressed.zip): 50MB
    • 압축되지 않은 배포 사이즈(코드 + 의존성): 250MB
    • 시작할 때 /tmp 디렉토리를 사용하여 다른 파일을 로드할 수 있다.
    • 환경 변수의 크기: 4KB

Customization At The Edge

  • 현대의 많은 응용 프로그램들은 Edge에서 어떤 형태로든 로직을 실행한다.
  • Edge Function:
    • CloudFront 배포판에 사용자가 작성하고 첨부하는 코드다.
    • 사용자 가까이에서 실행하여 지연 시간을 최소화한다.
  • CloudFront는 CloudFront Function과 Lambda@Edge 두 가지 유형을 제공한다.
  • 전 세계에 구축된 서버를 관리할 필요가 없다.
  • 사용 사례: CDN 컨텐츠 사용자 정의
  • 사용하는 것에 대해서만 지불하면 된다.
  • 완전 Serverless

CloudFront Functions & Lambda@Edge 사용 사례

  • 웹사이트 보안 및 개인정보 보호
  • Edge의 동적 웹 애플리케이션
  • 검색엔진 최적화(SEO)
  • 오리진 및 데이터 센터 전반에 걸친 지능적인 경로
  • Edge의 Bot 완화
  • 실시간 이미지 변환
  • A/B 테스트
  • 사용자 인증 및 권한 부여
  • 사용자 우선순위 지정
  • 사용자 추적 및 분석

CloudFront Functions

  • Javascript로 작성된 경량 함수다.
  • 대기 시간에 민감한 대규모 CDN Customization이다.
  • Sub-ms의 시작 시간을 가지고 있으며, 수백만 건의 요청을 초단위로 처리한다.
  • 뷰어 요청(Viewer Request) 및 응답(Viewer Response)을 변경하는 데 사용한다.
    • Viewer Request: CloudFront가 viewer로 부터 요청을 수신한 후
    • Viewer Response: CloudFront가 View에게 응답을 전달하기 전
  • CloudFront의 기본 기능(Code를 전적으로 CloudFront 내에서 관리)

Lambda@Edge

  • NodeJS 또는 Python으로 작성된 Lambda 함수다.
  • 초당 1,000개의 요청으로 확장한다.
  • CloudFront 요청 및 응답 변경에 사용된다.
    • Viewer Request - CloudFront에서 Viewer로 부터 요청을 받은 후
    • Origin Request - CloudFront가 Origin에 요청을 전달하기 전
    • Origin Response - CloudFront가 Origin으로부터 응답을 받은 후
    • Viewer Response - CloudFront가 Viewer에게 응답을 전달하기 전
  • 하나의 AWS 영역(Region)에서 Function을 작성한 후 CloudFront가 해당 위치로 복제한다.

CloudFront Functions vs Lambda@Edge

  • CloudFront Functions 사용 사례
    • 캐시키 정규화: 요청 속성(헤더, 쿠키, 쿼리 문자열, URL)을 변환하여 최적의 캐시 키를 생성한다.
    • 헤더 조작: HTTP 요청 및 응답의 헤더 삽입/수정/삭제
    • URL 다시 쓰기 또는 Redirects
    • 요청 인증(Authentication) 및 인가(Authorization): 요청을 허용/거부하기 위한 사용자 생성 토큰(예 JWT) 생성 및 검증
  • Lambda@Edge 사용 사례
    • 실행 시간이 길어짐(ms)
    • 조정 가능한 CPU 또는 메모리
    • 코드는 제3의 라이브러리(예: 다른 AWS 서비스에 액세스하기 위한 AWS SDK)에 의존한다.
    • 처리를 위해 외부 서비스를 사용해야 하므로 네트워크에 액세스한다.
    • 파일 시스템 액세스 또는 HTTP 요청 Body에 대해 액세스한다.

Lambda by default

  • 기본적으로 Lambda Function은 VPC 외부(AWS 소유의 VPC)에서 실행된다.
  • VPC의 리소스(RDS, ElastiCache, 내부 ELB)에 액세스할 수 없다.

  • VPC ID, 서브넷 및 Security Group을 정의해야 한다.
  • Lambda는 서브넷에 ENI(Elastic Network Interface)를 생성한다.

Lambda with RDS Proxy

  • Lambda Function가 데이터베이스에 직접 액세스할 경우 높은 부하가 발생하는 경우 너무 많은 DB Connection을 생성할 수 있다.
  • RDS Proxy
    • DB 풀링 및 공유를 통해 확장성을 향상한다.
    • Failover 시간을 66% 단축하고 연결을 유지하여 가용성을 향상 시킨다.
    • IAM 인증을 시행하고 Secrets Manager에 자격 증명을 저장하여 보안을 향상시킨다.
  • RDS Proxy는 공개적(Public)으로 액세스할 수 없기 때문에 Lambda Function을 VPC에 배포해야 한다.

  • DB 인스턴스 내에서 Lambda 함수를 호출할 수 있다.
  • 데이터베이스 내에서 데이터 이벤트를 처리할 수 있다.
  • PostgreSQL 및 Aurora MySQL에 대한 RDS를 지원한다.
  • DB 인스턴스(Public, NAT GW, VPC Endpoint) 내에서 Lambda 함수에 대한 아웃바운드 트래픽을 허용해야 한다.
  • DB 인스턴스가 Lambda 함수(Lambda Resource-based Policy & IAM Policy)를 호출하는 데 필요한 권한을 가지고 있어야 한다.

RDS Event Notifications

  • DB 인스턴스 자체(생성, 중지, 시작)에 대한 정보를 알려주는 알림
  • 데이터 자체에 대한 정보가 없다.
  • DB 인스턴스, DB 스냅샷, DB 매개변수 그룹, DB Security Group, RDS Proxy, Custom Engine Version 등 이벤트 범주에 구독(Subscribe)한다.
  • 실시간에 가까운 이벤트(최대 5분)
  • SNS로 알림 전송 또는 Event Bridge를 사용한 이벤트 구독


참고한 자료

'Infrastructure > Certificate' 카테고리의 다른 글

[SAA] API Gateway  (0) 2023.10.02
[SAA] Amazon DynamoDB  (0) 2023.10.02
[SAA] Container  (0) 2023.10.02
[SAA] Integration And Messaging  (0) 2023.10.02
[SAA] Hybrid Storage Cloud  (0) 2023.09.24