[SAA] Serverless

SMALL

1. Serverless

  • 서버리스 서비스를 사용하는 개발자는 더이상 서버를 관리할 필요가 없다. 서버가 없다는 뜻이 아닌, 관리할 필요가 없다는 의미이다.
  • 개발자는 단지 코드를 배포하고 함수를 배치하기만 하면 됨
  • 초기의 서버리스는 Faas(Function as a service)를 의미했지만, 지금의 서버리스는 더 많은 것을 의미
  • AWS Lambda로부터 서버리스는 개발되었고, 이제는 DB, Messaging, Storage 등을 포함한 모든 관리형 서비스를 의미함
  • 서버리스는 서버가 없음을 의미하는 것이 아니라 서버가 보이지 않거나 관리하지 않고 프로비저닝 하지 않는 것을 의미
  • Serverless in AWS
    • AWS Lambda
    • DynamoDB
    • AWS Cognito
    • AWS API Gateway / Amazon S3
    • AWS SNS & SQS
    • AWS Kinesis Data Firehose / Aurora Serverless
    • Step Functions
    • Fargate

2. AWS Lambda

  • Why AWS Lambda
    • Amazon EC2
      • 클라우드 가상 서버 - 프로비저닝 필요
      • RAM과 CPU 크기가 제한됨
      • 지속적으로 실행됨
      • 스케일링은 서버를 추가하거나 제거하는 작업을 해야 함
    • Amazon Lambda
      • 가상 함수 - 관리할 서버가 없음
      • 제한 시간이 잆음 - 짧은 실행시간
      • 온디맨드로 실행(호출 시 실행)
      • 스케일링 자동화
  • AWS Lambda의 장점
    • 쉬운 가격 정책
      • 호출횟수 및 컴퓨팅 시간, Lambda가 실행된 만큼 청구
      • Lambda 요청 1백만건과 40만 GB 컴퓨팅 시간에 대한 프리 티어 제공
    • AWS의 전체 서비스와 통합 가능
    • 다양한 프로그래밍 언어 사용 가능
    • AWS CloudWatch를 통한 쉬운 모니터링
    • 함수당추가 리소스 확보가 쉬움 (최대 10 gb의 램을 프로비저닝 할 수 있음)
    • RAM을 증가시키면 CPU 및 네트워크 성능도 향상됨
  • 사용가능 언어
    • Node.js (Javascript)
    • Python
    • Java(compatible with Java8)
    • C# (.NET Core)
    • Golang
    • C# / Powershell
    • Ruby
    • Custom Runtime API (Community-supported, ex) Rust)
    • Lambda 컨테이너 이미지 지원
      • Lambda 컨테이너 이미지는 Lambda. Runtime API를 구현해야 함
      • 임의의 Dockeer 이미지를 실행하기 위해서는 ECS 또는 Fargate를 사용하는 것이 권장됨
  • AWS Lambda Integrations Main ones
    • API Gateway: REST API 생성, 람다 함수 호출
    • Kinesis: Lambda를 이용해 바로 데이터 변환
    • DynamoDB: 데이터베이스에 트리거가 생기면 람다 함수가 작동
    • S3: 언제든 lambda 함수를 작동시킬수 있음
    • CloudFront: Lambda@Edge
    • CloudWatch Events & EventBridge: AWS의 인프라에 어떤 일이 생기고 그상황에 대응하고자 할 때 상황에 따라 자동화를 실행하기 위해 람다함수 호출
    • CloudWatch Logs: 어디든 해당 로그를 스트리밍
    • SNS: 알림과 SNS 주제에 대처 가능
    • SQS: SQS 대기열 메시지 처리 기능
    • Cognito: 사용자가 데이터베이스에 로그인할 때마다 응답
  • AWS Lambda Pricing
    • 요청당 지불
      • 처음 1백만건 요청 무료
      • 이후 1백만건 요청마다 $0.2 (요청당 $0.0000002)
    • 기간당 지불
      • 월당 첫 40만 GB/sec의 컴퓨팅 시간은 무료
        • == 함수가 1GB RAM인 경우 40만초
        • == 함수가 128MB RAM인 경우 320만초
      • 이후 60만 GB/sec 에 대해 $1 청구
    • AWS Lambda의 실행 비용은 매우 저렴하여 사용자에게 인기가 있음
  • AWS Lambda Limits to know - per region
    • 실행
      • 메모리 할당: 128mb ~10gb (메모리는 1mb씩 증가)
      • 최대 실행 시간: 900초(15분)
      • 환경 변수: 4kb 까지
      • "함수 컨테이너"의 디스크 용량(/tmp 폴더): 512mb ~ 10gb
      • 동시 실행 횟수: 1,000회 (증가 가능)
    • 배포
      • Lambda 함수 배포 시 최대 크기(압축된 .zip 파일): 50mb
      • 압축하지 않았을 때의 배포 크기(코드 + dependecies): 250mb
      • 시작 시 다른 파일을 로드하기 위해 /tmp 디렉토리 사용 가능
      • 환경 변수: 4kb
  • Edge Function: Lambda@Edge & CloudFront Functions
    • Customization At The Edge
      • 보통은 함수와 애플리케이션을 특정 리전에서 배포하지만 CloudFront를 사용할 때에는 엣지 로케이션을 통해 콘텐츠를 배포한다.
      • 모던 애플리케이션에서는 애플리케이션에 도달하기 전에 엣지에서 로직을 실행하돋록 요구하기ㅗㄷ 함
      • 엣지 함수
        • CloudFront 배포에 연결하고 작성한 코드
        • 지연시간을 최소화하기 위해 사용자에게 가까운 위치에서 실행됨
      • CloudFront
        • CloudFront Functions
        • Lambda@Edge
      • 서버를 관리할 필요 없이 전역으로 배포됨
      • ex) CDN 콘텐츠를 사용자가 지정하는경우
      • 사용한 만큼 비용 지불
      • 완전한 서버리스
      • CloudFront Functions & Lambda@Edge Use Cases
      • 웹사이트 보안 및 개인정보 보호
      • 엣지에서 동적 웹 애플리케이션
      • 검색 엔진 최적화(SEO)
      • 다양한 오리진과 데이터 센터 간 지능적인 라우팅
      • 엣지에서의 봇 완화
      • 실시간 이미지 변환
      • A/B 테스팅
      • 사용자 인증 및 권한 부여
      • 사용자 우선 순위 지정
      • 사용자 추적 및 분석
      • CloudFront Functions
        • Javascript로 작성된 경량화된 함수
        • 확장성이 높고 지연 시간에 민감한 CDN 사용자 지정에 사용됨
        • 시작 시간은 1ms 이하, 초당 수백만개의 요청 처리
        • Viewer 요청 및 응답 변경에 사용
          • 뷰어 요청: CloudFront가 뷰어로부터 요청을 받은 다음 뷰어 요청 수정 가능
          • 뷰어 응답: CloudFonrt가 뷰어에게 응답을 보내기 전에 뷰어 응답 수정 가능
        • CloudFront의 네이티브 기능(모든 코드가 CloudFront에서 직접 관리)
        • CloudFront는 고성능, 고확장성이 필요할 때 뷰어 요청과 뷰어 응답에만 사용됨
        • 사용 사례
          • 캐시키 정규화 - 요청 속성(헤더, 쿠키, 쿼리 문자열, URL)을 변환하여 최적의 캐시키 생성
          • 헤더 조작 - 요청 또는 응답에서 http 헤더 삽입/수정/삭제
          • URL 재작성 또는 리디렉션
          • 요청 인증 및 권한 부여 - 사용자가 생성한 토큰(jwt 등) 생성 및 유효성 검사를 통한 요청 허용/거부
      • Lambda@Edge
        • Node.js 또는 Python으로 작성된 Lambda 함수
        • 초당 수천개의 요청 처리
        • 모든 CloudFornt 요청 및 응답 변경에 사용
          • 뷰어 요청: CloudFront가 뷰어로부터 요청을 받은 다음 뷰어 요청 수정 가능
          • 오리진 요청: CloudFront가 오리진에 요청을 전송하기 전에 수정
          • 오리진 응답: CloudFront가 오리진에서 응답을 받은 후에 수정
          • 뷰어 응답: CloudFront가 뷰어에게 응답을 보내기 전에 뷰어응답 수정 가능
        • 함수는 하나의 AWS 리전(us-east-1)에서 작성하고, CloudFront가 모든 로케이션에 해당 함수 복제
        • 더 긴 실행시간 (수밀리초)
        • 조정 가능한 CPU 또는 메모리
        • 코드가 3rd party library에 의존하는 경우(ex: 다른 aws 서비스에 액세스하기 위한 aws sdk)
        • 데이터 처리를 위한 외부 서비스에 대한 네트워크 액세스를 통해 대규모 데이터를 통합 수행
        • 파일 시스템 액세스 또는 http 요청의 본문에 대한 액세스
CloudFront Functions Lambda@Edge
Runtime Support JavaScript Node.js, Python
# of Requests Millions of requests per second Thousands of requests per second
CloudFront Triggers Viewer Request/Response - Viewer Request/Response - Origin Request/Response
Max. Execution Time < 1 ms 5 - 10 seconds
Max. Memory 2 mb 128 mb up to 10 gb
Total Package Size 10 kb 1 mb - 50 mb
Network Access, File System Access no yes
Access to the Request Body no yes
Pricing free tier available, 1/6th price of @Edge no free tier charge per request & duration
  • Lambda in VPC
    • 기본적으로 Lambda 함수는 사용자의 VPC가 아닌 AWS 소유의 VPC에서 실행됨, VPC 내에서 리소스(RDS, ElasticCache, 내부 ELB)에 액세스 할 수 없음
    • 사용자의 VPC에서 Lambda 함수를 실행하려면 VPC ID Lambda 함수를 시작하려는 서브넷을 지정하고 Lambda 함수에 보안그룹을 추가해야 함, Lambda는 사용자의 서브넷에 ENI(Elastic Network Interface)를 생성
  • Lambda with RDS Proxy
    • VPC에서 Lambda를 사용하는 대표적인 사용사례는 RDS Proxy이다.
    • RDS 데이터베이스가 프라이빗 서브넷에 있어도 Lambda 함수로 직접 해당 DB에 액세스할 수 있다.
    • 위의 방법으로 Lambda 함수가 직접 DB에 액세스 하게 되면 RDS 데이터베이스의 로드가 상승해 시간 초과 등의 문제로 이어지기 때문에 RDS Proxy를 사용한다.
    • RDS Proxy
      • DB 연결의 풀링과 공유를 통해 확장성 향상
      • 장애가 발생할 경우 장애 조치 시간을 66%까지 감소시키고 연결을 유지함으로써 가용성 향상
      • IAM 인증을 강제화하고 자격 증명을 Secret Manager에 저장함으로써 보안을 향상시킴
    • RDS Proxy는 퍼블릭 액세스가 불가능하므로 Lambda 함수는 반드시 사용자의 VPC에 배포되어야 함

3. Amazon DynamoDB

  • 완전 관리형 데이터베이스
  • 다중 AZ간의 데이터 복제를 통해 고가용성 제공
  • NoSQL (관계형 DB X, transaction 지원)
  • 대규모 워크로드로 확장 가능한 분산 데이터베이스
  • 성능이 빠르고 일관성을 유지함(한 자릿수 밀리초의 성능)
  • 보안, 인가 및 관리를 위해 IAM과 통합되어 있음
  • 저렴한 비용, 오토 스케일링 기능 제공
  • 유지 관리나 패치 작업이 필요 없으며 항상 사용 가능
  • Standard 및 Infrequent Access(IA) 테이블 클래스 지원
  • DynamoDB는 테이블로 구성
  • 각 테이블에는 PK(Primary Key)가 있음 - 생성 시 부여
  • 각 테이블에는 무한한 개수의 항목(=rows)를 가질 수 있음
  • 각 항목은 속성이 있음(추후 추가 가능 / null 가능)
  • 항목의 최대 크기는 400kb
  • 지원하는 데이터 타입
    • Scalar Types: string, number, binary, boolean, null
    • Document Types: list, map
    • Set Types: String set, Number Set, Binary Set
  • 스키마를 빠르개 전개해야할 때 Aurora나 RDS보다 DynamoDB가 더 나은 선택임
  • Read/Write Capacity Modes
    • 테이블의 용량 (읽기/쓰기 처리량)을 관리하는 방식을 제어
    • Provisioned Mode(default)
      • 초당 읽기/쓰기 수를 예측하여 미리 지정
      • 용량을 사전에 계획히야 함
      • 프로비저닝된 읽기 용량 단위(RCU) 및 쓰기 용량 단위 (WCU)에 대해 비용을 지불
      • RCU 및 WCU에 대한 오토 스케일링 가능
    • On-demand Mode
      • 읽기/쓰기 작업량에 따라 자동으로 확장/축소
      • 용량 계획 필요 X
      • 사용한만큼 비용을 지불하며, 비용이 더 비싸지만 사용량에 따라 유연하게 대응 가능
      • 예측할 수 없는 작업량이나 급격한 증가가 예상되는 경우에 적합
  • DynamoDB Advanced Features
    • DynamoDB Accelerator(DAX)
      • DynamoDB를 위한 완전 관리형 무결절 인메모리 캐시
      • DynamoDB 테이블에 읽기 작업이 많을 때 DAX 클러스터를 생성하고 데이터를 캐싱하여 읽기 혼잡을 해결
      • 캐시된 데이터에 대한 마이크로초 수준의 지연 시간
      • 애플리케이션 로직 수정이 필요 X (기존 DynamoDB API와 호환)
      • 캐시의 기본 TTL 값은 5분
      • DynamoDB Accelerator(DAX) VS ElasticCache
        • DAX는 DynamoDB 앞에 있고 개별 객체 캐시, 쿼리, 스캔 캐시를 처리하는 데에 유용
        • 집계결과 저장시에는 Amazon ElasticCache가 좋고, 대용량 연산 저장 시에는 Amazon DynamoDB가 좋다.
    • Stream Processing
      • 데이터의 변경 사항을 실시간으로 감지하고 처리하는 기술
      • DynamoDB의 스트림은 테이블엥서 발생하는 모든 항목의 생성, 업데이트, 삭제 작업에 대한 변경 이벤트를 기록하는 일련의 이벤트 스트림
      • ex) 실시간으로 변경 사항에 대응하기(사용자에게 환영 이메일 보내기), 실시간 사용 분석, 파생 테이블 삽입, 리전 간 복제 구현, DynamoDB 테이블 변경 시 AWS Lambda 호출
      • DynamoDB Stream
        • 보존기간: 24 hours
        • 소비자 수 제한
        • Lambda 트리거 또는 DynamoDB Stream adapter 사용 가능
      • Kinesis Data Stream
        • 보존기간: 1 year
        • 더 많은 소비자 수
        • AWS Lambda, Kinesis Data Analytics, Kinesis Data Firehose, AWS Glue Streaming ETL 등에 사용
    • DynamoDB Global Table
      • 여러 리전간에 짧은 지연 시간으로 액세스 할 수 있도록 하는 기능
      • active - active 복제
      • 애플리케이션은 어떤 리전에서든 해당 테이블을 읽고 쓸 수 있음
      • Global Tables를 설정하기 위해서는 먼저 테이블에 DynamoDB Streams를 활성화해야 함
    • Time To Live(TTL)
      • 만료 타임스탬프가 지난 항목을 자동으로 삭제하는 기능
      • ex) 최근 항목만 저장, 규정 준수, 웹 세션 핸들링 등
    • Backups for disaster reecovery
      • 지정 시간 복구(Point-in-time Recovery, PITR)을 통한 지속적인 백업
        • 선택적으로 활성화 가능, 최근 35일간 지속
        • 활성화하면 백업 기간 내에는 언제든 백업 윈도우 내에서 복구 가능
        • 복구 과정에서는 새로운 테이블 생성
      • On-Demand backups
        • 장기 보관을 위해 명시적으로 삭제할때 까지 보관되는 전체 백업 수행
        • 성능이나 지연 시간에 영향을 주지 않음
        • AWS Backup Service에서 구성 및 관리할 수 있음(교차 리전 복사 기능 사용 가능)
        • 복구 과정에서는 새로운 테이블 생성
    • Integration with Amazon S3
      • S3로 내보내기 (Export to S3) - PITR 기능을 활성화해야 함
        • 최근 35일 이내 어떤 시점으로든 테이블을 내보낼 수 있음
        • 읽기 용량이나 성능에 영향 X
        • 데이터 분석 수행 가능
        • 감사 목적으로 스냅샷 확보 가능
        • 데이터를 다시 DynamoDB로 가져오기 전에 데이터 ETL등 대규모 변경을 실행할 수 있음
        • DynamoDB JSON 또는 ION 형식으로 내보내
      • S3에서 가져오기 (Import from S3)
        • S3에서 CSV, DynamoDB JSON 또는 ION 형식의 데이터를 가져와 DynamoDB에 새로운 테이블로 import
        • 쓰기 용량을 소모하지 않음
        • import 중 발생하는 오류는 모두 CloudWatch Logs에 기록

4. AWS API Gateway

  • AWS Lambda + API Gateway: 완전 서버리스 애플리케이션이 구축되므로 인프라 관리가 필요 없음
  • WebSocket 프로토콜 지원: 양방향 통신 가능
  • API 버전 관리
  • 환경 관리(dev, test, prod)
  • 보안 관리
  • API 키 생성, 요청 스트롤링
  • Swagger/OpenAPI와 같은 공통 표준을 사용하여 신속히 API를 정의하여 가져올 수 있고 Swagger/OpenAPI로 내보낼 수 있음
  • 요청 변환 및 유효성 검사
  • API 응답 캐시
  • Integrations High Level
    • Lambda Function
      • Lambda 함수를 호출하는 방식, 백엔드와의 통합 구성
      • AWS Lambda를 백엔드로 사용하여 REST API를 간편하게 호출
    • HTTP
      • 백엔드에 있는 HTTP 엔드포인트를 노출하는 방식으로 통합 구성
      • 온프레미스에 있는 내부 HTTP API나 Application Load Balancer와 같은 시스템 연결 가능
      • 속도 제한, 캐싱, 사용자 인증, API 키 등의 기능을 추가 가능
    • AWS Service
      • API Gateway를 통해 어떤 AWS API라도 노출할 수 있음
      • AWS Step Functions 워크플로우를 시작하거나 SQS에 메시지를 게시하는 등의 작업을 수행 가능
      • 인증, API Public 배포, 특정 AWS 서비스에 속도 제한 추가 가능
  • AWS Service Integration Kinesis Data Streams example
      1. Kinesis Data Stream에 사용자가 데이터를 전송할 수 있지만 AWS 자격증명은 가질 수 없도록 보안 설정 가능
      1. Kinesis Data Stream과 클라이언트 사이에 API Gateway를 둠
      1. 클라이언트가 API Gateway로 HTTP 요청을 보내면 Kinesis Data Stream에 전송하는 베시지로 구성해 전송 (따로 서버 관리 필요 X)
      1. Kinesis Data Stream에서 Kinesis Data Firehose로 레코드 전송
      1. 최종적으로 JSON 형식으로 Amazon S3 버킷에 저장
  • Endpoint Types
    • Edge-Optimized(default): 글로벌 클라이언트용
      • 요청이 클라우드프론트 엣지 위치를 통해 라우팅(지연 시간 개선)
      • API Gateway는 여전히 생성된 리전에 위치 - but 모든 CloudFront Edge Location에서 액세스 가능
    • Regional
      • 동일한 리전 내의 클라이언트용 - 모든 사용자는 API Gateway를 생성한 리전과 같은 리전에 있어야 함
      • 수동으로 CloudFront와 결합 가능(캐싱 전략 및 배포에 대해 더 많은 제어 가능)
    • Private
      • 인터페이스 VPC 엔드포인트(ENI)를 사용하여 VPC 내에서만 액세스할 수 있음
      • 리소스 정책을 사용하여 액세스 정의
  • Security
    • User Authentication through
      • IAM Roles - 내부 애플리케이션에서 유용
      • Cognito - 외부 사용자를 위한 신원 확인(모바일 사용자)
      • 사용자 지정 권한 부여 - 자체 로직 실행
    • Custom Domain Name HTTPS security through integration with AWS Certificate Manager (ACM)
      • Edge-Optimized 엔드포인트를 사용하는 경우 인증서는 us-east-1에 있어야 함
      • regional 엔드포인트 사용 시에 인증서는 API Gateway 리전에 있어야 함
      • Route 53에서 CNAME 또는 A-alias 레코드를 설정하여 도메인 및 API Gateway를 가리키도록 해야 함

5. AWS Step Functions

  • Lambda 함수를 조율하기 위한 서버리스 워크플로우를 시각적으로 구축할 수 있는 서비스
  • 기능: 시퀀스, 병렬처리, 조건부 실행, 타임아웃, 오류 처리 등
  • Lambda 함수 뿐만 아니라 EC2, ECS, On-Premise Server, API Gateway, SQS Queue 등 다양한 AWS 서비스와 통합 가능
  • 사람이 개입해서 승인을 해야만 진행되는 단계를 설정할 수 있음
  • 주문 처리, 데이터 처리, 웹 애플리케이션 등 구성하기 복잡한 다양한 워크플로우를 시각적으로 구성하려고 할 때 사용
LIST

'develop > AWS' 카테고리의 다른 글

[SAA] Databases  (0) 2024.06.20
[SAA] Serverless Architectures  (1) 2024.06.19
[SAA] Container: ECS, Fargate, ECR, EKS  (0) 2024.06.17
[SAA] Advanced Storage on AWS  (1) 2024.05.31
[SAA] Global Infrastructure  (1) 2024.05.10