[AWS SAA] 솔루션 설계자 관점의 Serverless - Lambda, CloudFront, Lambda@Edge

junghan·2023년 3월 21일
0

AWS SAA

목록 보기
36/51
post-thumbnail

Serverless

Serverless?

  • 서버리스 서비스를 사용하는 개발자는 서버를 관리할 필요가 없습니다.
  • 서버가 없다는 것은 아니고 관리할 필요가 없다는 뜻입니다.
    • 코드, 함수를 배치하는 것입니다.
  • 원래 서버리스는 FaaS, 즉 Function as a Service를 뜻했지만 지금의 서버리스는 더 많은 것을 의미합니다.
  • 서버리스가 처음 개발된 건 AWS Lambda
  • 데이터베이스메시징스토리지 등 서버를 프로비저닝 하지 않는 모든 것들을 포함합니다.
  • 서버리스란 서버가 없는 게 아니라 서버가 보이지 않거나 서버를 프로비저닝 하지 않는 것입니다.
  • 서버리스 예시
  • AWS 안에 서버리스
    • AWS Lambda
    • DynamoDB
    • AWS Cognito
    • AWS API Gateway
    • Amazon S3
    • AWS SNS & SQS
    • AWS Kinesis Data Firehose
    • Aurora Serverless
    • Step Functions
    • Fargate


AWS Lambda

AWS Lambda란?

AWS Lambda은 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다.

  • 람다는 가상의 함수입니다.
  • 관리할 서버 없이 코드를 프로비저닝하면 함수가 실행되는 겁니다.
  • 제한 시간이 있어서 실행 시간이 짧습니다. (15분)
  • 온디맨드로 실행됩니다.
  • 비용 역시 함수가 실행되는 동안만 청구됩니다.
  • 마지막으로 스케일링이 자동화됩니다.

장점 :

  • 과금이 쉽습니다.
    • Lambda가 수신하는 요청의 횟수 즉, 호출 회수와 컴퓨팅 시간 = Lambda가 실행된 시간만큼.
    • 프리 티어에서 Lambda 요청 1백만 건과 40만 GB-초의 컴퓨팅 시간 제공합니다.
  • 다양한 AWS 서비스와 통합됩니다.
  • Lambda에 여러 가지 프로그래밍 언어를 사용할 수 있어서 상당히 자유로운 편
  • CloudWatch와의 모니터링 통합도 쉽습니다.
  • 함수당 최대 10GB의 램을 프로비저닝 할 수 있습니다.
  • 만약 함수의 RAM을 증가시키면 CPU 및 네트워크의 품질과 성능도 함께 향상될 것입니다.

사례) 데이터를 프로세싱하는 데에 대략 1시간 정도가 걸리는 Lambda 함수를 생성했습니다.
코드를 머신에서 로컬로 실행했을 때에는 문제가 없었으나, Lambda 함수를 호출할 때는 3초가 지난 후 ‘시간초과' 오류가 발생하여 실패할 때는 코드를 EC2 인스턴스처럼 다른 곳에서 실행할 수도 있고, Amazon ECS를 사용할 수도 있습니다

Lambda가 지원하는 언어

  • Node.js (JavaScript)
  • Python
  • Java (Java 8 compatible)
  • C# (.NET Core)
  • Golang
  • C# / Powershell
  • Ruby
  • Custom Runtime API (community supported, example Rust)
  • Lambda Container Image
    • 컨테이너 이미지는 Lambda 런타임 API에서 실행되야 합니다.
    • 해당 컨테이너가 Lambda 런타임 API를 구현하지 않으면, ECS나 Fargate에서 컨테이너를 실행해야 합니다

AWS Lambda 통합

https://velog.velcdn.com/images/chan9708/post/2803d83a-25bd-4ded-93fc-9e38f2b78657/image.png

  • API Gateway: REST API를 생성하고 람다 함수를 호출합니다.
  • Kinesis: Lambda를 이용해 바로 데이터를 변환합니다
  • DynamoDB: 트리거를 생성할 때 사용되는데, 데이터베이스에 어떤 일이 생기면 람다 함수가 작동되도록 합니다.
  • Amazon S3: 언제든 람다 함수를 작동시킵니다.
    예) S3에 파일이 생성되거나 할 때
  • CloudFront: Lambda@Edge인데 Lambda@Edge는 전 세계 AWS 로케이션에서 서버를 프로비저닝 또는 관리할 필요 없이 Node.js 함수를 실행할 수 있는 서비스입니다.
  • CloudWatch Events EventBridge: AWS의 인프라에 어떤 일이 생기고 그 상황에 대응하고자 할 때
    예)파이프라인이 끊기거나, 상태가 바뀌는 경우 등 상황에 따라 자동화를 실행
  • CloudWatch logs: 어디든 해당 로그를 스트리밍 합니다
  • SNS: 알림과 SNS 토픽에 대처
  • SQS: SQS 대기열 메시지를 처리
  • Cognito는 사용자가 데이터베이스에 로그인할 때마다 응답

Lambda 과금방식

  • 여기에서 전체 가격 정보를 찾을 수 있습니다.
    https://aws.amazon.com/lambda/pricing/
  • 통화당 지불:
    • 처음 1,000,000건의 요청은 무료입니다.
    • 이후 요청 1백만 건당 $0.20(요청당 $0.0000002)
  • 기간당 지불: (1ms 단위)
    • 매월 400,000GB-초의 컴퓨팅 시간 무료
    • == 기능이 1GB RAM인 경우 400,000초
    • == 기능이 128MB RAM인 경우 3,200,000초
    • 이후 600,000GB-초에 1달러
  • 일반적으로 AWS Lambda를 실행하는 것이 매우 저렴하므로 매우 인기가 있습니다.

Lambda 제한

리전마다의 제한

  • 실행 제한
    • 메모리 할당이 128MB에서 10GB입니다.
    • 단위는 1MB씩 증가합니다.
    • 최대 실행 시간은 900초 다시 말해 15분입니다.
    • 환경 변수로 최대 4KB를 가집니다.
    • 큰 파일을 끌어와야 한다면 (/tmp)임시 공간을 사용할 수 있는데, 크기는 512MB입니다.
    • 최대 1000건까지 람다 함수의 동시 실행이 가능하고 요청에 따라 늘어날 수 있습니다. (동시성은 미리 예약해두는 것이 좋습니다.)
  • 배포 제한
    • 압축된 zip의 최대 크기는 50MB
    • 압축되지 않으면 250MB
    • 이보다 더 큰 파일에는 대신 /tmp 공간을 사용해야 합니다. (임시공간)
    • 환경 변수는 동일하게 4KB입니다.

--

Cloudfront & Edge

cloudfront란?

Amazon CloudFront는 .html, .css, .js 및 이미지 파일과 같은 정적 및 동적 웹 콘텐츠를 사용자에게 더 빨리 배포하도록 지원하는 웹 서비스입니다.

Cloudfront 동작방식 및 기능

CloudFront 기능

  • JavaScript로 작성된 경량 함수
  • 대규모의 지연 시간에 민감한 CDN 맞춤화
  • 밀리초 미만의 시작 시간, 초당 수백만 건의 요청
  • 뷰어 요청 및 응답을 변경하는 데 사용됩니다.
    • 뷰어 요청: CloudFront가 뷰어로부터 요청을 받은 후 뷰어
    • 뷰어 응답: CloudFront에서 최종 사용자에게 응답을 전달하기 전
  • CloudFront의 기본 기능(CloudFront 내에서 코드 전체 관리)
  • CloudFront 함수는 고성능, 고확장성이 필요할 때, 뷰어 요청과 뷰어 응답에만 사용

Lambda@Edge란?

Lambda@Edge를 사용하면 Node.js 및 Python Lambda 함수를 실행하여 CloudFront가 제공하는 콘텐츠를 사용자 지정하여 AWS 위치의 함수를 최종 사용자와 더 가깝게 실행할 수 있습니다

CloudFront를 통해 CDN을 배치했는데 만약 엣지 로케이션마다 글로벌 람다 함수를 실행하고 싶다면 어떻게 할까요? 혹은 어떻게 요청 필터링을 애플리케이션 도착 전에 구현할 수 있을까요?

  • Lambda@Edge 를 사용하면됩니다.
  • Lambda@Edge는 CloudFront CDN을 통해서 특정 리전이 아닌 전 세계의 모든 리전에 람다 함수를 배치합니다.
    • 응답성이 뛰어난 애플리케이션을 구축하기 위해서 입니다.
    • 서버 관리할 필요 없이 글로벌적으로 람다가 배치됩니다.
    • CDN을 통해 전송되는 콘텐츠를 사용자 지정할 수 있고 사용량만큼 청구되기 때문입니다.

Lambda@Edge 동작방식 및 기능

  • NodeJS 또는 Python으로 작성된 Lambda 함수
  • 초당 1,000개의 요청으로 확장
  • CloudFront 요청 및 응답을 변경하는 데 사용됩니다.
    • 뷰어 요청 – CloudFront가 사용자로부터 요청을 받은 후 뷰어
    • 오리진 요청 – CloudFront가 오리진에 요청을 전달하기 전
    • 오리진 응답 – CloudFront가 오리진으로부터 응답을 받은 후
    • 뷰어 응답 – CloudFront가 최종 사용자에게 응답을 전달하기전
  • 하나의 AWS 리전(us-east-1)에서 함수를 작성하면 CloudFront가 해당 위치로 복제합니다.

CloudFront와 Lambda@Edge 공통 사용 예:

- 웹 사이트 보안 및 프라이버시
- 엣지의 동적 웹 애플리케이션
- 검색 엔진 최적화
- SEO
- 오리진 및 데이터 센터 사이의 지능적 경로
- 엣지에서의 봇 활동 완화
- 실시간 이미지 변환
- A/B 테스트
- 오리진 도달 전의 사용자 인증 및 권한 부여
- 사용자 우선순위 지정 사용자 추적 및 분석

CloudFront Function vs Lambda@Edge


CloudFront Functions Lambda@Edge 기능

CloudFront 기능

  • 캐시 키 정규화
    • 요청 속성(헤더, 쿠키, 쿼리 문자열, URL)을 변환하여 최적의 캐시 키 생성
  • 헤더 조작
    • 요청 또는 응답에서 HTTP 헤더를 삽입/수정/삭제합니다
  • URL 재작성 또는 리디렉션
  • 인증 및 승인 요청
    • 요청을 허용/거부하기 위해 사용자 생성 토큰(예: JWT) 생성 및 검증

Lambda@Edge 기능

  • 긴 실행 시간(수 ms)
  • 조정 가능한 CPU 또는 메모리
  • 귀하의 코드는 서드파티 라이브러리 에 의존합니다(예: 다른 AWS 서비스에 액세스하기 위한 AWS SDK).
  • 처리를 위해 외부 서비스를 사용하기 위한 네트워크 액세스
  • 파일 시스템 액세스 또는 HTTP 요청 본문에 대한 액세스

Lambda in VPC

  • 기본적으로 Lambda 함수를 시작하면 여러분의 VPC 외부(AWS 소유 VPC)에서 시작되기 때문에, VPC 내의 리소스(RDS, ElastiCache, 내부 ELB...)에 액세스할 권한이 없습니다.
  • 인터넷의 퍼블릭 API나 DynamoDB는 가능

  • 그렇기 때문에 VPC ID, 서브넷 및 보안 그룹을 정의해야 합니다.
  • Lambda는 서브넷에 ENI(Elastic Network Interface)를 생성합니다.
  • 그렇게 하면 Lambda 함수를 VPC 내 모든 항목에 비공개로 연결할 수 있습니다.

Lambda with RDS Proxy

VPC 내에서 Lambda를 사용하는 대표적인 사용 사례는 RDS 프록시입니다.

  • Lambda 함수가 데이터베이스에 직접 액세스하는 경우 부하가 높은 상태에서 너무 많은 연결을 열 수 있습니다.
  • RDS 프록시
    • DB 풀링 및 공유를 통한 확장성 향상
      - 장애 조치 시간을 66% 단축하고 연결을 유지하여 가용성 향상
    • IAM 인증을 시행하고 Secrets Manager에 자격 증명을 저장하여 보안을 강화합니다.
  • RDS Proxy는 공개적으로 액세스할 수 없기 때문에 Lambda 함수를 VPC에 배포해야 합니다.

AWS Certified Solutions Architect Associate 시험합격!

profile
42seoul, blockchain, web 3.0

0개의 댓글