아래 AWS 아키텍처를 보다가 생각이 든게 왜 S3랑 DynamoDB는 VPC외부에 위치에서 쓸까라는 생각이 들었음...
찾아보니 설계 철학이 그 이유를 설명해주었음

1. 무한한 확장성
VPC내부에 서비스를 만들어서 사용한다는 것은 나의 사설 IP주소를 할당해서 쓴다는 것임
S3(object storage)의 경우 엄청난 파일 등..을 저장하는 역할을 수행하는데,
만약 S3가 VPC안에 위치해 있다면 객체(파일, 버킷..)마다 IP를 할당해야하는 번거로움이 발생함
즉, VPC내부의 IP주소가 고갈될 수도 있는 문제가 발생할 수 있는 거임
그렇기에 AWS가 관리하는 거대한 공용 영역에 위치하게 된 것임
2. 내구성과 가용성
VPC의 subnet은 기본적으로 하나의 AZ(가용 영역)에 묶여 있음
만약 S3가 특정 서브넷에 묶여 있으면 재해 복구가 쉽지 않음
S3의 설계를 보면 파일을 올리면 최소 3개 이상의 AZ(데이터 센터)에 복제해서 저장하게 됨
즉, 트정 VPC나 AZ에 갇혀 있으면 자동 다중 복제가 복잡가 쉽지 않게 됨
3. API기반 접속 방식
S3는 URL을 가진 웹 서비스임 (HTTP 프로토콜로 통신을 함)
인터넷 어디서든(온프레미스, 다른 클라우드, 모바일 앱..) 접근 가능하게 만들자라는 목표를 가지고 있기에, VPC안에 가두는 것은 목표 달성이 쉽지 않게 됨
DynamoDB도 마찬가지
그래서 외부로 나가기 위해 Gateway Endpoint를 사용하게 되는 것임
RDS vs DynamoDB
그런데 RDS는 EC2와 함께 VPC 내부에 위치해 있다
이 이유에 대해서도 알아봤다..
RDS와 통신을 할려면 socket을 먼저 연결을 해야함(회선을 미리 설정해야 함)
1. 3-way Handshake가 발생하고
2. 인증 절차를 가짐
3. 세션을 생성하게 되며
4. keep-alive 현상에 의해 유지됨
여기서 서버의 메모리는 한정되어 있기 때문에 DB 서버 하나가 열어줄 수 있는 물리적 개수 한계가 발생하게 됨
ex) lambda에 트래픽이 갑자기 증가하게 되어 1000개가 동시에 실행하게 되면, lambda는 stateless이기에, 새로운 DB연결을 시도하게 됨
즉, 1000개의 RDS생성 요청을 하게 되는데 이러면 문제가 발생함
그래서 RDS를 serverless로 사용할려면 RDS Proxy 같은 connection-Pool 미들웨어가 필수적임
cf)
Proxy는 Multiplexing 역할을 수행 함
proxy는 RDS와 미리 회선을 설정하고, lambda가 요청을 보낼 때, Handshake과정 없이 lambda의 요청을 수행 함
이러한 과정을 Transaction Multiplexing이라고 함
회선을 미리 몇개 설정 하고, 여러 요청이 들어와도 미리 설정한 회선에서 돌려서 많은 요청을 처리하게 됨
반면, DynamoDB는 아래와 같은 절차를 가짐
1. 요청 준비: 데이터를 JSON형태로 만들음
2. 인증: 아이디/비번으로 로그인 하는게 아니라, 요청 패킷 헤더에 IAM Key로 암호화한 서명을 붙임
3. HTTP Post로 요청하고, 응답을 받으면 끝남
4. 끝나면 연결 해제됨
즉, stateless를 나타내고 있음
Lambda가 1000개가 동시에 요청해도, DynamoDB는 HTTP 요청 1000개를 그냥 받아버리게 됨
정리하자면RDS는 TCP/IP(Layer4)기반의 독자 프로토콜이고, DynamoDB는 HTTP/HTTPS(Layer7)의 프로토콜을 가짐