이 글은 24년 하반기 AWS Certified Solutions Architect - Associate(이하 AWS SAA-C03) 자격증 취득을 위해서 아래 유데미 강의를 보고, 공부한 내용을 정리하였습니다.
https://www.udemy.com/course/best-aws-certified-solutions-architect-associate
서버리스
- 개발자가 서버를 관리할 필요 없음(서버가 없는건 아님)... 코드(함수)만 배치하면됨
- 원래는 FaaS를 의미.. AWS lambda로 시작된 서버리스는 현재 원격 관리되는 모든 것을 포함(서버를 프로비저닝 하지 않는 것)
- 람다, DynamoDB, Cognito, API Gateway, S3, SNS & SQS, Kinesis Data Firehose, Aurora Serverless, Fargate 등
Lambda
lambda란
- 람다는 가상의 함수로 서버를 관리할 필요없이 코드를 프로비저닝하면 함수가 실행됨
- 실행 시간 제한 (최대 15분) 이 있음
- 온디맨드로 실행 - 필요할 때만 실행되고, 함수가 실행되는 동안만 비용 청구
- 자동화된 스케일링.. AWS가 자동으로 프로비저닝
장점
- 요금 계산 쉬움.. 호출 횟수와 컴퓨팅 시간으로만 청구(프리티어에서도 넉넉함)
- 여러 언어 지원, 여러 AWS 서비스와 통합됨
- 모니터링 쉬움
- 함수당 10GB 램을 추가로 프로비저닝할 수 있음
- RAM을 늘리면 CPU와 네트워크의 품질이 함께 향상됨
지원하는 언어
- 웬만한 언어 다 가능, Custom Runtime API있어서 오픈 소스로 가능
- lambda 컨테이너 이미지 지원... 컨테이너 이미지가 람다 런타임 API를 구현해야함
- 보통은 ECS나 Fargate에서 컨테이너 실행
AWS 서비스와 통합
- API Gateway : REST API를 생성하고 람다 함수를 호출
- Kinesis : 람다로 데이터를 변환
- DynamoDB : 트리거를 생성할 때 사용
- S3 : 람다함수의 트리거로 작동
- CloudFront : lambda+edge
- EventBridge : 자동화를 실행
- CloudWatch logs
- SNS, SQS : 소비자로 사용
- Cognito : 사용자가 OO에 로그인할 때마다 트리거
사례
서버리스 썸네일 생성 - 반응형 아키텍처
1. S3버킷에 새 이미지가 업로드되면 람다함수를 트리거
2. 람다 함수에서 썸네일 생성
3. 다른 S3 버킷에 생성된 썸네일 푸시 + DynamoDB에 메타데이터 저장
서버리스 cron 작업
1. EventBridge 규칙 생성
2. N 시간마다 람다 함수 실행
Lambda 한도
실행 한도
- 메모리 할당량 : 128MB~10GB
- 최대 실행 시간 : 15분
- 환경변수 : 4KB
- /tmp 디스크 용량 : 최대 10GB
- 1000개까지 동시 실행 가능
배포 한도
- 압축 시 50 MB / 압축 안하면 250MB 까지
- 시작할 때 큰 파일이 있으면 /tmp 디렉터리 이용
- 환경변수 : 4KB
Lambda SnapStart
- 함수 성능을 높이기 위해 사용.. 자바 11 이후 버전에 대해 무료로 10배 이상 성능 향상
- SnapStart 없다면 자바로된 함수 실행시 '코드 초기화 - 호출 - 종료'의 단계
- SnapStart 활성화 시 함수가 미리 초기화된 상태에서 호출됨
원리
- 람다가 함수를 초기화 한 뒤, 메모리와 초기화된 함수의 디스크 상태의 스냅샷 생성
- 스냅샷이 저지연 액세스를 위해 캐시됨
Lambda@Edge & CloudFront 함수
엣지 사용자 지정
- CloudFront를 사용하면 특정 리전이 아닌 엣지 로케이션을 통해 콘텐츠를 배포함
- 애플리케이션에 도달하기 전에 엣지에서 로직을 실행하도록 요구하는 경우가 있는데, 이때 엣지함수를 사용
ㄴ CloudFront 배포시에 연결 가능
- 사용자 근처에서 실행되어 지연 시간 줄이는 목적
- CloudFront 함수와 Lambda@Edge 2가지 종류가 있음
- 사례 : CDN 컨텐츠를 사용자 지정 하는 경우
세부사례
- 웹사이트 보안과 프라이버시
- 엣지에서의 동적 웹 애플리케이션
- 검색 엔진 최적화
- 오리진 및 데이터 센터 간 지능형 경로에 활용
- 엣지에서 봇 완화
- 엣지에서 실시간 이미지 변환
- A/B 테스트
- 사용자 인증 권한 부여
- 사용자 우선순위 지정
- 사용자 추적 및 분석
CloudFront 동작원리
1. client가 CloudFront에 뷰어 요청
2. CloudFront가 오리진 요청을 오리진 서버에 전송
3. 서버가 CloudFront에 오리진 응답을 보냄
4. CloudFront가 클라이언트에게 뷰어 응답 전송
CloudFront 함수
- JS로 작성된 경량 함수 뷰어 요청과 뷰어 응답을 수정할 때 사용
- 확장성 높고 지연시간에 민감한 CDN 사용자 지정에 사용
- 시작 시간 1ms 미만.. 초당 백만 개의 요청 처리
- CloudFront의 네이티브 기능으로 코드가 CloudFront에서 관리됨
- 사례 : 캐시 키를 정규화, 요청/응답에 HTTP 헤더를 삽입/수정/삭제, URL을 다시 쓰거나 리디렉션, JWT 생성 혹은 검증
Lambda@Edge
- NodeJS나 Python으로 작성
- 초당 수천개 요청 처리
- 모든 CloudFront 요청 및 응답 변경 가능(뷰어 요청/응답, 오리진 요청/응답)
- 함수는 us-east-1에서만 작성 가능 (CloudFront 배포를 관리하는 리전임)
- 작성하면 CloudFront가 모든 리전에 해당 함수 복사
- 실행 시간은 상대적으로 김(몇 ms)
- CPU 메모리 증가로 여러 라이브러리 로드 가능.. 타사 라이브러리에 코드 의존 가능
- 네트워크 액세스를 통해 외부 서비스에서 데이터를 처리 가능... 대규모 데이터 통합 수행 가능
- 파일 시스템이나 HTTP Body에도 직접 액세스 가능
Lambda VPC
- 기본적으로 람다 함수 실행시 VPC 외부에서 실행... VPC 內 리소스 액세스 권한 없음
- DynamoDB와 같은 퍼블릭 리소스에는 기본적으로 접근 가능
- VPC에서 람다를 시작하면 내부 리소스에 접근할 수 있음
- VPC ID, 서브넷, SG 설정
- 서브넷에 ENI 생성해서 람다와 연결해야함
사례 : RDS 프록시
- 그냥 lambda에서 VPC 연결만하고 RDS를 바로 붙여서 쓰면, lambda가 생겼다 없어졌다 하면서 DB 커넷션이 늘어나서 로드가 커짐
- 이때, RDS 프록시를 이용해 연결하면, 연결을 한 곳으로 모으고 문제 해결 가능
- RDS 프록시는 퍼블릭 연결이 안되서 람다함수를 꼭 VPC 안에서 실행해야함
장점
- 연결의 풀링과 공유를 통해 확장성 향상
- 장애 발생시 페일오버 가능 및 연결성 보장(RDS, Aurora 둘다 가능)
- RDS 프록시 수준에서 IAM 연결 강제로 보안 향상
RDS & Aurora와 Lambda 함수의 통합
- DB 인스턴스 안에서 발생하는 '데이터 이벤트'로 람다를 직접 호출할 수도 있음
- RDS PostgreSQL & Aurora MySQL에서 지원됨
- RDS DB 인스턴스로부터 람다 함수로 오는 인바운드 트래픽을 허용해줘야함(Public NAT GW, VPC 엔드포인트 등을 활용)
- 네트워크 연결성이 중요 & 올바른 권한 필요
- RDS Event 알림과 완전히 다름... 이 알림들은 AWS 안에서 이뤄지고 DB 인스턴스 자체에 대한 정보를 알려주는 알람이 있음(ex. 생성/정지/시작 시간 등)
`- DB안에 데이터 자체에 대한 정보는 받지못함
- DB 인스턴스, DB 스냅샷, 파라미터 그룹, 보안 그룹, 프록시, 커스텀 엔진 버전에 관한 이벤트를 구독 가능
- 최대 5분인 근 실시간 이벤트를 받고, 그걸 SNS에 전송하거나 EventBridge를 이용할 수 있음
`DynamoDB
- 완전 관리형 DB, 데이터가 다중 AZ에 복제
- 클라우드 네이티브 NoSQL DB, AWS 독점 서비스
- 트랜잭션 지원 기능
- 초당 수 백만 요청 처리, 수조 개의 행, 수백 TB 스토리지를 가짐
`- 성능은 한자리수 ms.. 일관성도 높음
- IAM과 통합, 보안 권한부여
- 오토스케일링 가능.. 유지관리, 프로비저닝 필요없음
- 액세스가 빈번한 데이터에는 Standard 클래스, 액세스가 빈번하지 않으면 IA 테이블 클래스에 저장
특징
- 테이블로 구성되며 DB 생성할 필요 없음, 이미 DB가 존재하는 서비스임
- 테이블을 생성하면 각 테이블에 기본 키가 부여됨... 기본 키는 생성시 결정
- 테이블에 무한히 행을 추가할 수 있음
- 각 항목은 속성을 가지며 속성은 열에 표시됨(속성은 나중에 추가하거나 null도 가능)
- DynamoDB 항목의 최대 크기는 400KB(큰 객체 저장시엔 적합하지 않음)
- 다양한 타입 지원
- 스칼라타입 - string, number, binary, boolen, null
- 문서 타입 - list, map
- 집합 타입 - string set, number set, binary set
`- 스키마를 빠르게 전개해야할 때 DynamoDB 선택
R/W 용량 모드 설정
1. 프로비저닝된 모드(기본)
- 미리 용량 프로비저닝
- 초당 RW 요청 수를 예측해서 미리 지정
- 프로비저닝된 RCU와 WCU만큼의 비용을 지불
- 프로비저닝되어 있어도 오토스케일링 가능(production 환경에서 이렇게 사용)
- 사례 : 로드 예측되고, 서서히 증가하며 비용 절감을 원할 때 적합
2. 온디맨드 모드
- RW 용량이 워크로드에 따라 자동으로 확장
- RCU, WCU 개념 자체가 없음
- 정확히 사용한 만큼의 비용을 지불... 모든 RW에 비용 지불(2,3배 비쌈)
- 워크로드를 예측할 수 없거나, 급격히 증가하는 경우에 유용
- 사례 : 수 천개의 트랜잭션을 수백만개로 1분만에 확장해야한다면 온디맨드 모드 선택
심화 기능
DynamoDB Accelerator(DAX)
- DynamoDB를 위한 고가용성의 완전 관리형 구결절 인메모리 캐시
- DynamoDB 테이블에 읽기 작업이 많을 때, DAX 클러스터를 생성하고 데이터 캐싱하여 읽기 혼잡 해결
- ms 수준의 지연시간
- DAX 클러스터는 기존 DynamoDB API와 호환됨.. 애플리케이션 로직 변경 안해도됨
- 캐시 TTL 변경 가능(기본 5분)
- ElastiCache 아니라 DAX 사용 이유 : DAX는 DynamoDB 앞에서 개별 객체 캐시와 쿼리와 스캔 쿼리를 처리하는데 유용
ㄴ 집계 결과를 저장할 때는 ElastiCache가 좋고, DAX는 대용량의 연산을 저장할 때 좋음
스트림 처리
- 테이블의 모든 수정사항 스트림 생성 가능
- DynamoDB 테이블의 변경 사항에 실시간으로 반응하는데 활용 가능
- 사례
1. 새로운 사용자 등록시 환영 이메일 보내기
2. 실시간 사용량 분석
3. 파생 테이블 삽입
4. 리전간 복제(스트림에서 DynamoDB가 변경 로그를 가져오고, 이를 사용해 다른 AWS 리전에 있는 복제 테이블이 서로의 데이터를 복제할 수 있는 기능이 활성화되는 원리)
5. 람다함수 실행
- 스트림 처리 방식
1. DynamoDB Streams
- 보존 기간 24h, 소비자 수 제한
- 람다 트리거와 함께 사용하면 좋음
- 자체적으로 읽기 실행하려면 DynamoDB Stream Kinesis 어댑터 사용
2. Kinesis Data Streams
- 보존 기간 1년, 소비자 수 늘어남
- 데이터를 처리하는 방법이 많아짐
글로벌 테이블
여러 리전 간에 복제가 가능한 테이블(양방향 복제 가능)
- 복수 리전에서 짧은 시간에 액세스 가능
- 다중 활성 복제... 애플리케이션이 모든 리전에서 테이블을 읽고 쓸 수 있음
- DynamoDB 스트림을 활성화해야함
TTL 기능
- 만료 타임스탬프가 지나면 자동으로 항목을 삭제하는 기능
- 사례 : 최근 항목만 저장, 규정 준수, 웹 세션 핸들링
재해 복구
지정 시간 복구(PITR)
- 지속적인 백업 가능... 35일간 지속
- 복구하면 새로운 테이블 생성
온디맨드 백업
- 삭제할 때까지 보존
- DynamoDB 성능에 영향 없음
- 백업을 좀 더 제대로 관리하려면 AWS Backup이용(수명 주기 정책 활성화 가능)
- 리전 간 백업 가능
S3와의 통합
- S3에 테이블을 내보낼 수 있음(지정 시간 복구 기능 활성화)
- Amazon Athena 엔진으로 S3에서 쿼리 호출 가능
- 35일 이내 어떤 시점이라도 내보낼 수 있고, 읽기 용량이나 성능에 영향 X
- 내보내기 하여 데이터 분석 가능
- 다시 불러오기 전에 데이터 ETL 등 대규모 변경 실행 가능
- 내보낼 때는 DynamoDB JSON이나 ION 포멧 사용
S3에서 import
- CSV, DynamoDB JSON or ION 형식으로 내보내고 새로운 테이블 생성
API Gateway
- 클라이언트가 lambad 함수를 invoke(지연 호출)하려면...
1. 클라이언트에 IAM 권한 부여 2. 로드밸런서로 HTTP 엔드포인트 제공 3. API Gateway
- API Gateway : AWS의 서버리스 서비스로 REST API 생성 가능(클라이언트가 퍼블릭 액세스 가능)
- lambda 함수에 요청을 프록시함
기능
- 람다와 통합시 인프라 관리가 필요없음
- websocket 지원... 두 가지 방법의 실시간 스트리밍 가능
- API 버저닝 핸들
- 여러 환경 핸들링(dev, test, prod)
- 보안에도 활용( 인증 권한부여 등)
- API 키 생성, 클라이언트 요청이 과도할 때 요청 스로틀링 가능
- Swagger / Open API 와 같은 공통 표준을 사용하여 신속히 API 정의 가능
- API 게이트웨이 단계에서 요청 transform 가능
- SDK나 API 스팩을 생성, API 응답을 캐시
통합
- 람다 함수
- 람다를 사용하는 REST API 서버리스 애플리케이션
- HTTP 엔드포인트.. 속도제한, 캐싱, 유저 인증, API 키 등 기능 추가
- 어떠한 AWS API도 노출시킬 수 있음... AWS 단계 함수 워크플로우, SQS에 메시지 게시
엔드포인트 유형
1. 엣지 최적화
- 글로벌 클라이언트로 모든 요청이 CloudFront 엣지 로케이션을 통해 라우팅
- 모든 CloudFront 리전에서 특정 리전에 있는 API Gateway에 액세스 가능
2. 리전 배포
- 모든 사용자는 API Gateway를 생성한 리전과 같은 리전에 있어야함
- 자체 CloudFront 배포를 생성할 수도 있음.. 이러면 엣지 최적화와 같은효과 + 캐싱 전략, CloudFront 설정에 더 많은 권한 가짐
3. 프라이빗
- VPC 내에서만 액세스... ENI 같은 VPC 엔드포인트 이용
보안
사용자 식별
- IAM Roles : 내부 애플리케이션에서 유용
- Cognito : 모바일/웹 애플리케이션의 외부 사용자에 대한 보안 조치
- 사용자 지정 권한 부여자 : 자체 로직 실행.. 람다 함수
HTTPS 보안
- AWS ACM과 통합
- 엣지 최적화면 인증서는 us-east-1에 위치, 리전 배포면 인증서 리전과 그 리전이 같아야함
- CNAME이나 A별칭으로 도메인과도 통합해줘야함
AWS Step Function
- 서버리스 워크플로를 시각적으로 구성 가능
- 람다 함수 오케스트레이션에 사용
- 시퀀싱, 병행 실행, 조건 실행, 타임아웃, 에러처리하기
- 람다 뿐만 아니라 EC2, ECS, 온프레미스 서버, API 게이트웨이, SQS 등 다양한 서비스와 연결 가능
- 워크플로우에 개입해서 승인해야 함
- 사례 : 주문 이행, 데이터 처리, 웹 애플리케이션 등 구성하기 복잡한 워크플로를 시각적으로 구성
Cognito
- 사용자에게 웹 및 모바일 앱과 상호작용할 수 있는 자격 증명을 부여
- 일반적으로 사용자들은 AWS 계정 외부에 있음... 모르는 사용자에게 자격 증명을 부여해 사용자를 인식(Cognito)할 수 있음
- IAM과 달리 Cognito는 AWS 외부 사용자를 대상으로 함
`- 키워드 : 수백명의 사용자, 모바일 유저, SAML로 인증
종류
Cognito 사용자 풀
- 앱 사용자에게 가입 기능을 제공
- API Gateway 및 애플리케이션, 로드밸런서와 원활히 통합
Cognito 자격 증명 풀 (페더레이션 자격 증명)
- 앱에 등록된 사용자에게 임시 AWS 자격 증명을 제공해서, 일부 AWS 리소스에 직접 액세스할 수 있도록 함
- Cognito 사용자 풀과 원활히 통합
Cognito User Pools(CUP)
- 웹/앱을 대상으로 하는 서버리스 사용자 DB
- 사용자 이름 또는 이메일, PW의 조합으로 로그인 절차 정의
- PW 재설정 기능
- 이메일 및 전화번호 검증
- MFA
- 소셜로그인 가능(googlem, fb)
- API Gateway와 ALB와 연결 가능
ex) 유저는 Cognito에서 인증 토큰을 받고, API Gateway에 요청할 때 같이 전달.. API Gateway에서 확인하고, 사용자 자격 증명으로 변환되어 백엔드에 전달됨
ex2) Cognito에서 인증하고 ALB에 리스너와 룰을 이용해서 TG에 자격 증명과 함께 추가 헤더 전송
Cognito 자격 증명 풀 (페더레이션 자격 증명)
- 사용자에게 자격 증명을 제공함, 임시 AWS 자격 증명을 사용해 AWS 계정에 직접 액세스
- 사용자는 Cognito 사용자 풀 內 사용자일 수도 있고, 타사 로그인이 될 수 있음
- API Gateway나 ALB 안거치고도 직접 AWS 서비스에 액세스 가능
- 자격 증명이 적용되는 IAM 정책은 Cognito 자격 증명 풀 서비스에 사전 정의
- 기본 IAM 역할 정의 가능.. 로그인 안되면 기본 IAM 역할 상속 받음
- 사례 : DynamoDB 행 수준 보안 설정 가능