Serverless
서버리스 서비스를 사용하는 개발자는 서버를 관리할 필요가 없다.
그저 코드를 배치하기만 하면 된다.
서비리스는 Function as a Service (FaaS) 를 뜻했지만, 지금은 의미가 확장되었다.
개발자가 직접 서버를 관리하지 않는 managed 서비스는 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
가상의 함수로서, 관리할 서버 없이 코드를 프로비저닝하여 실행할 수 있게 한다.
최대 15분으로 작동 시간 제한이 있다.
on-demand 로 실행되기에, 함수가 실제로 동작해야 할 때만 Lambda가 실행된다.
관리형 서비스이기에 스케일링은 자동으로 관리된다.
- 가격 측정이 쉬워진다.
- 수신하는 요청의 횟수와 컴퓨트 타임에 따라 과금된다.
- 다양한 AWS 서비스와 통합된다.
- Lambda에 다양한 프로그래밍 언어를 사용할 수 있다.
- Node.js
- Python
- Java
- C# / .NET Core
- Golang
- Ruby
- Custom Runtime API
- CloudWatch 와의 모니터링 통합이 쉽다.
- 함수당 최대 10GB의 RAM을 프로비저닝할 수 있다.
- Lambda Container Image 를 지원한다.
- ECS 나 Fargate는 Lambda Runtime API 가 구현되지 않은 컨테이너를 사용할 때 주로 쓰인다.
서버리스로 S3 에 업로드 된 이미지의 섬네일 작업이나, CRON 같은 작업 등에 대표적으로 된다.
Limits
Execution Limits
- Memory allocation : 128MB ~ 10GB
- Maximum execution time : 900 seconds
- Environment variables (4 KB)
- function container (temp Disk capacity) : 512MB
Deployment Limits
- 압축된 zip의 최대 크기는 50MB, 압축되지 않은 최대 크기는 250MB를 넘으면 안된다.
- /tmp 폴더를 부팅 시 다른 파일을 불러오는 디렉토리로 사용할 수 있다.
- Environment variables (4 KB)
Edge
Lambda의 또다른 동기식 호출 유형이다.
CloudFront에 CDN 을 배포하였을 때, Edge마다 Lambda가 실행되고 나서 요청이 처리되도록 할 수 있다.
- CloudFront의 요청과 응답을 변경할 수 있다.
- 글로벌 어플리케이션을 만들 수 있다.
- 검색 엔진 최적화, 실시간 이미지 변환 등에 쓰일 수 있다.
Lambda 함수를 CloudWatch 와 통합하는 것으로 이해할 수 있다.
DynamoDB
완전 관리형 데이터베이스로 가용성이 매우 높으며 다중 AZ 에 걸쳐 자동으로 데이터가 복제되는 데이터베이스이다.
NoSQL 데이터베이스이며, 대량 작업과 분산형 데이터베이스 환경에 적합하다.
IAM 과 완전 통합되어있어 보안, 권한, 관리에 탁월하다.
DynamoDB Stream 은 이벤트 기반 프로그래밍에도 적합하다.
- 테이블로 구성된다. DB로 구성되지 않는다.
- 각 테이블에 기본 키가 있고, 이는 테이블 생성 시 선언되어야 한다.
- 각 테이블의 행은 무한대로 존재할 수 있다.
- 각 아이템에는 속성이 있으며 이 속성이 바로 열이 된다.
- 아이템의 최대 크기는 400KB이다.
- 스칼라 타입의 데이터를 지원한다.
- 문자열, 숫자, 바이너리, 불리언, Null
- Document 타입의 데이터를 지원한다.
- List, Map
- Set 타입의 데이터를 지원한다.
- String Set, Number Set, Binary Set
Primary Key : 하나 혹은 두 개의 열로 만들어지는데, 이는 Partition Key 와 Sort Key의 조합으로 만들어진다.
Read / Write Capacity Modes
테이블의 용량을 제어하는 방법이다.
EC2 인스턴스를 프로비저닝할 필요 없이, 읽기 및 쓰기 용량만 정의하면 된다.
Provisioned Mode (default)
테이블에 필요하다고 생각되는 읽기/쓰기 횟수를 지정하는 것이다.
RCU (Read Capacity Units) & WCU (Write Capacity Units) 의 프로비저닝된 개수만큼 과금된다.
RCU와 WCU 는 auto scaling 이 가능하다.
On-demand Mode
워크로드에 따라 자동으로 읽기와 쓰기 성능을 스케일한다.
정확히 사용한 만큼 비용을 부담하게 된다. (프로비전 모드보다 비싸다)
아주 예측하기 힘든 워크로드에 사용된다.
DynamoDB Accelerator (DAX)
완전 관리되며, 가용성이 높고 무결성이 있는 DynamoDB 인 메모리 캐시이다.
가장 많이 읽은 데이터를 캐시에 저장해 읽기 혼잡을 해결할 수 있다.
어플리케이션 로직을 변경할 필요가 없다.
데이터 인덱스는 5분간의 TTL 을 가진다.
DynamoDB Streams
테이블의 항목 수정을 표시하는 정렬된 데이터 스트림이다.
항목을 생성하고 업데이트 및 삭제할 때마다 DynamoDB Stream으로 이동한다.
- Kinesis Data Stream 로 전송
- AWS Lambda 에 의해 읽기
- Kinesis Client Library에 의해 읽기
이 데이터는 최대 24시간동안 보존된다.
- 테이블에서 실시간으로 변화에 대응하는 경우
- 새로운 사용자에게 환영 이메일 보내기 등
- 파생 테이블을 DynamoDB에 삽입하기
- 분석
- ElasticSearch
- Cross-Region Replication
등등에 사용이 가능하다.
DynamoDB Global Tables
테이블이 여러 리전에 걸쳐서 존재하는 것으로서, 두 테이블 사이에서 양방향 복제가 일어나는 것이다.
- 여러 리전에 걸쳐 데이터를 이용할 때 지연 시간이 줄어든다.
- DynamoDB Stream을 이용하기 때문에 이를 활성화해야 한다.
Time To Live (TTL)
타임스탬프 만료 후에 자동으로 아이템을 삭제할 수 있다.
이를 통해 테이블 크기 통제나 규제 준수가 가능해진다.
Indexes
Global Secondary Index, Local Secondary Index 가 존재한다.
DynamoDB 테이블의 인덱스는 여러 속성에 쿼리를 수행할 수 있다.
Transactions
트랜젝션을 통해 동시에 두 테이블에 쓰거나 아무 테이블에도 쓰지 않을 수 있다.
특정한 쓰기의 일부로 여러 테이블에 내용을 작성하거나 아무 테이블에도 쓰지 않을 수 있다.
API Gateway
클라이언트가 Lambda 함수를 직접 실행하려면 IAM 권한이 필요하다.
또는 어플리케이션 로드 밸런서를 클라이언트와 Lambda 사이에 두고 HTTP 엔드 포인트로 노출하는 방법도 있다.
이를 대신할 방법으로서, API Gateway 를 사용할 수 있다.
이는 클라이언트가 사용 가능한 공용 REST API 를 제공 가능하게 해준다.
즉, Lambda 함수에 대한 요청을 프록시 해주며, HTTP 엔드포인트보다 더 많은 기능을 제공한다.
- Lambda와 통합이 가능하며 managed 서비스이므로 관리할 인프라가 없다.
- WebSocket Protocol 을 지원한다.
- API 버전 관리를 맡는다.
- 여러 환경을 다룰 수 있다.
- 보안 달성 수단을 다양히 제공한다.
- API 키 생성이나 요청 throttling 이 가능하다.
- Swagger / OpenAPI 임포트가 가능하다
- API 응답을 캐시에 저장할 수 있다.
Lambda Integration
Lambda 함수를 불러와 통합하여, REST API 지원을 만들 수 있다.
HTTP Integration
백엔드의 HTTP 엔드 포인트로도 노출할 수 있다.
온프레미스 HTTP API, ALB 등에 사용할 수 있다.
비율 제한이나 캐싱, 유저 인증 등을 달성하기에 도움을 준다.
AWS Service
API Gateway를 이용하면 어떤 AWS API 라도 노출이 가능하다.
Endpoint Types
- Edge-Optimized (default)
- 글로벌 클라이언트를 위한 것이다.
- 모든 CloudFront 엣지 로케이션에서 요청 라우팅으로 지연 시간을 개선한다.
- Regional
- 모든 사용자가 API Gateway 를 생성한 리전에 있을 경우 사용한다.
- 캐싱 전략과 CloudFront 배포 설정을 더욱 상세히 다룰 수 있다.
- Private
- 사설 API Gateway 로도 사용이 가능하다.
- VPC 를 통해서만 접근이 가능하게 된다.
- 리소스 정책을 이용해 액세스를 제한한다.
Security
IAM Permissions
사용자나 Role에 API 접근 권한을 주고 싶을 경우 정책을 연결하게 된다.
인프라에서 API 접근 권한을 부여할 때 아주 유용하다.
Sig v4 를 사용하여 IAM 과의 인증을 수행한다.
AWS 외부에 사용자에게 권한을 부여할 때는 사용할 수 없다.
Lambda Authorizer (Custom Authorizers)
요청의 헤더로 보내지는 토큰을 유효화하는 데에 Lambda 를 사용한다.
OAuth, SAML 등의 타사 인증을 쓰는 경우에 사용된다.
Lambda 는 IAM 정책을 사용자에게 리턴하게 된다.
Cognito User Pools
Cognito 가 사용자의 수명 주기를 전부 관리하고, API Gateway는 Cognito에서 자동으로 신원을 증명한다.
Cognito 는 인증에만 관여하고, 권한 부여는 돕지 못한다.
Facebook 이나 Google login 같은 외부 사용자 풀이 있다면 적합하다.
AWS Cognito
Cognito는 사용자에게 자격을 부여하여 서버나 어플리케이션과 상호작용 하도록 한다.
Cognito User Pools
모바일 어플리케이션용 서버리스 사용자 데이터베이스이다.
사용자명이나 이메일, 비밀번호를 이용해 쉽게 로그인하고 이멤일이나 핸드폰 번호를 인증할 수 있다.
MFA 를 추가하거나 비밀번호 규칙을 생성할 수 있다.
Federated Identities (Facebook, Google 등) 로그인 방식을 허용한다.
로그인 결과로 JSON Web Token (JWT) 를 반환한다.
- API Gateway 와 통합될 수 있다.
Federated Identity Pools
Cognito Identity Pools 이라고도 한다.
이 방법을 통해서 AWS 자격 증명을 일시적으로 Federation Identity Pool 에서 얻게 된다.
- AWS 자격 증명을 직접 어플리케이션 사용자에게 제공하여 AWS 리소스에 직접 액세스하도록 한다.
- 자격 증명 제공자로서 Cognito 사용자 풀과 통합된다.
- Facebook Login 을 통해서 S3 bucket write access 를 얻는 상황 등
Cognito Sync
장치에서 Cognito 로 데이터를 동기화하는 것이다.
AppSync 로 대체되었다.
설정을 저장하고, 어플리케이션간 동기화를 진행해준다.
이를 이용하려면 사용자 풀이 아닌 Federated Identity Pool 이 필요하다.
AWS SAM
Serverless Application Model 으로서, 서버리스 어플리케이션을 배포하고 개발하는 프레임워크이다.
YAML 코드로 서버리스 어플리케이션이 구성된다.
- Lambda Functions
- DynamoDB tables
- API Gateway
- Cognito User Pools
이러한 서비스를 YAML 에 따라 자동으로 구성해줄 수 있다.
CodeDeploy와 통합해서 Lambda를 빠르게 배포할 수 있게 해준다.
'공부한 이야기 > 클라우드' 카테고리의 다른 글
AWS SAA - Test Exam Summary (0) | 2022.08.04 |
---|---|
AWS SAA - Networking (0) | 2022.08.04 |
AWS SAA - Monitoring & Audit (0) | 2022.08.04 |
AWS SAA - Identifications (0) | 2022.08.04 |
AWS SAA - Storages (0) | 2022.08.02 |