1. RDS (Relational Database Service)
- 완전 관리형 RDB ( 자동 OS업데이트, 백업/복구, 모니터링, Read Replicas(읽기 성능향상을 위해 읽기전용 복제본 인스턴스 운영), 고가용성 ( Multi-AZ 적용 : 기본인스턴스에서 보조 인스턴스로 Failover), EBS연동, 자동 스케일링 )
- Amazon Aurora ( MySQL/Postgre와 호환되는 DB, 성능 극대화 )
고가용성/내구성 ( 자동 Scale-out, 128TB 확장가능, 6개 복사본을 3개의 AZ에 분산배치 )
- RDB 프록시 : RDS와 Aurora DB연결하는 DB 풀링서비스 ( 어플리케이션과 DB사이의 연결의 커넥션 pool, 최적화 )
1) 생성 (region에 종속)
데이터베이스 생성 - DB종류, 용도(개발), 구조, 이름
DB 정보생성 - 마스터이름 (루트 계정) - 자격증명관리 추천( 실습 시에는 자체관리, 암호 주기 8자리 이상)
리소스 종류 - 리소스, 스토리지 (gp3, 20), 내 VPC(변경불가), 서브넷 자동설정(public 억세스 X),
** 보안그룹 (이름 세팅후 자동설정 ), 이외의 설정은 default
** metric ( 1분 단위로 지표수집 ) : CPU Utilization (scaling의 주요지표), Database Connections ( 평균 connection 표시 )
2) 연결
(1) EC2 연결
- EC2에서(public) rds의 엔드포인트에 연결 (ssh 불가, elastic ip연결 후 mysql-client설치하여 접속)
** 보안그룹의 설정에 bastion host에 ec2 추가
mysql --version
mysql Ver 8.0.43-0ubuntu0.24.04.1 for Linux on x86_64 ((Ubuntu))
mysql -h [my-rds-name-source] -u root
mysql> create database todolist;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| todolist |
+--------------------+
5 rows in set (0.00 sec)
(2) client도구 (dbeaver)
- rds접속 정보(url, 사용자, 비번, db이름)와 ssh(EC2 url, ubuntu사용자와 key-pem등록)

기본 DB 연결설정 - RDS Url, 설정한 사용자, 비밀번호
SSH연결 - EC2를 경유하여 연결 (EC2 url, ubuntu 사용자, pem-key 연결, rds 사용자명/비번 )
3) todolist에 rds 연결 실습
- backend에 CORS 및 RDS(DB정보) 설정
(1) yml의 정보 설정 변경후 재빌드 및 실행
(2) 데몬으로 실행중인 경우 systemd의 설정에 cors관련 환경변수 수정 및 재시동
- /etc/systemd/system내의 백엔드 환경변수 조정
sudo nano /etc/systemd/system/springboot.service #systemd의 환경변수 설정파일 진입
sudo systemctl daemon-reload
sudo systemctl restart springboot.service
** 편집된 springboot.service 실행 파일
http://[my-s3-bucket].amazonaws.com/todos[Unit]
Description=Spring Boot Todo App
After=network.target
[Service]
Type=simple
User=ubuntuWorkingDirectory=/home/ubuntu/aws-labs-v1/apps/todo-list/backend
ExecStart=/home/ubuntu/aws-labs-v1/apps/todo-list/backend/gradlew bootRun
Environment=DB_HOST={RDS_URL}
Environment=MYSQL_DATABASE=todolist
Environment=MYSQL_USER={DB사용자명 추가}
Environment=MYSQL_PASSWORD={Password추가}
Environment=CORS_ALLOWED_ORIGINS={프론트_서버_URL}
Environment=CORS_ALLOW_CREDENTIALS=false
Environment=JWT_expirationMs=3600000
Restart=always
[Install]
WantedBy=multi-user.target
2. CloudFront
- CloudFront (CDN), Route53(DNS서비스), AWS Global Accelerator(네트워크 속도 향상), AWS Shield(분산 서비스 거부(DDoS) 공격 회피), AWS WAF(Web Application Firewall)
1) Origin과 Edge
(1) 엣지 로케이션 ( 근접한 AWS의 캐시서버 )
- 분산된 데이터 센터 ( 콘텐츠를 캐싱/제공 )
- 지연시간 최소화, 웹 콘텐츠나 데이터를 신속히 전달 (origin의 콘텐츠를 가져와서 캐싱)
- 엣지 로케이션, 리젼 엣지 로케이션등이 있음
(2) Origin
- 원본 콘텐츠가 저장된 웹서버(웹서버, S3등 다른 AWS 서비스)
- 이미지, 동영상 파일을 저장하는 버킷이나 서버가 origin
2) CloudFront
- CDN (Contents Delivery Service) : 정적/동적 콘텐츠 전달
- 분산된 엣지 로케이션을 사용하여 정적/동적 콘텐츠를 빠르고 효율적으로 제공
(1) 주요 사용처
정적 웹사이트 배포 (HTML, CSS, JS, 이미지 파일), S3를 origin으로 설정
미디어 스트리밍 - 대기 시간 감소/버퍼링 최소화 ( 대용량 미디어 파일을 빠르게 응답 )
API 가속 - 응답속도 개선 ( redis 사용하는 것과 같은 효과, 네트워크 속도 개선, CORS설정 불필요 )
보안 콘텐츠 전송 - SSL/TLS암호화로 보안 콘텐츠 제공, DDoS공격으로 보호

4) 실습
(1) RDS snapshot으로 복구 후 frontend와 backend연동

(2) Backend, FrontEnd 모두 구동 ( 기존에 작업한 데이터 연결 )
- 초기 로딩 시 시간이 소요됨

(3) CloudFront 생성 및 멀티 오리진 설정
- Edge Location을 사용하므로 global (region에 종속되지 않음)
- 멀티 Origin ( 정적인 리소스 외에도 EC2, ELB, 이미지나 동영상 스트리밍 등 )
① CloudFront생성 및 정적 서비스 원본 연결 ( 프론트엔드, S3)
resource 이름 설정 - origin type설정 - origin 리소스 설정 (end포인트 사용)- 보안 비활성화 - 배포 생성
** 도메인 적용 가능, Cache Optimization등 추가조건 설정가능
② 동적 서비스 원본 연결 ( 백엔드 EC2 추가, 멀티 오리진 생성 )
- 네트워크 Latency개선 ( network경로 최적화 및 연결수립, 3way handshake 불필요 )
- 원본 추가 : EC2의 public DNS추가
( EC2의 Public IPv4 DNS주소 - IP주소 사용X, 포트 8080-Java Backend 설정 )

- 동작 생성 : 경로, 원본 선택, 프로토콜 선택 후 생성
( Path: /api/*, Origin:EC2선택, Caching:Disabled, HTTP Method:all, Headers:All)


③ static 파일 렌더링을 위한 동작 설정 ( static 경로 추가 )
- S3에 /static의 경로를 추가하고 해당 경로로 접근시 파일 렌더링하도록 동작생성

(4) CloudFront로 엔드포인트 통합 ( 도메인 통합으로 CORS설정 불필요)
① 프론트의 환경설정에서 백엔드 공란 ( 접속 URL을 비운 뒤 재빌드하여 S3에 반영 )
# VITE_API_URL=http://[backend_url]:8080
# Cloud Front 설정시 비워줘야 Backend로 갈수 있음
② 백엔드의 CORS설정 삭제

③ 함수를 통한 경로 설정
- 정규 표현식으로 event의 처리 ( 에지 로케이션 호출시 event의 요청 주소반영 )
- 멀티 오리진 : /api 요청(전달), 파일확장자 요청 (전달) , spa route ( index.html 연결 )




# 함수 내용
#정규 표현식
var regexExpr = /^\/.*\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|webp|pdf)$/;
function handler(event) {
var request = event.request;
var uri = request.uri;
// API 요청은 그대로 전달 (멀티 오리진 환경)
if (uri.startsWith('/api/')) {
return request;
}
// 파일 확장자가 있는 요청은 그대로 (JS, CSS, 이미지 등)
if (regexExpr.test(uri)) {
return request;
}
// SPA 라우트는 index.html로 리다이렉트
request.uri = '/index.html';
console.log('Rewriting URI from ' + uri + ' to /index.html');
return request;
}
** CloudFront의 멀티 오리진 반영

(5) WAF 설정
- 보안 설정 ( Edge Location에서 SQL관련 보호와 접속 용량 제한 설정 등 )
- CloudFront - 보안 탭 - WAF manage - 보안보호 활성화 (국가별 접근 허용/제한 가능)


3. Route53
1) 개요
(1) 주요 기능
- 도메인 이름을 등록/관리, IP 라우팅 ( EC2, ELB, S3, CloudFront 등을 라우팅 )
- 트래픽 관리 ( 지연시간/가중치/장애조치/지리적 요소 등을 상세하게 설정하여 가까운 리전의 서버로 전달 )
- 상태검사( 헬스 체크 후 실패 시 다른 리소스 전환 ), 고가용성/재해복구
- 인증서 필요 인증서 필요 ( ACM : 통신 연결에 필요한 서버로서의 인증서, North Virginia지역 )
(2) 동작원리

① 사용자의 요청 →→ 재귀네임서버(Resolver) : IP주소 검색 ( Cashing된 값이면 바로반환 )
② 재귀네임서버(Resolver) →→ Root Name 서버 : 최상위 도메인별 TLD서버 반환(.com, .kr등)
③ Root Name →→ TLD서버 : 해당 도메인을 담당하는 Authoritative Domain을 알려줌
④ Authoritative 서버 : 실제 IP주소를 반환하는 서버
2) 실습
- 도메인 구매
- AWS에서 호스팅 영역 생성/인증 ( 도메인 등록, 네임 서버 생성 )
- 도메인 구매처에 네임 서버 주소연결
** Hosted Zone
- NS, SOA(StateOfAuthority), CNAME(Canonical Name), A(Address)등의 레코드 테이블 저장
(1) Route53 설정
① 호스팅 영역 생성 ( 글로벌 )
- 가용성을 위해 다수의 서버에 연관되어 나타남 ( Authoritative name server )
- CNAME 입력 ( 인증서 등록 후에 나타난 이름/값을 추가 )


② 인증서 발행 ( Authentication Manager, N.Virginia )
- 도메인 이름 설정 ( 주소 외에 *.주소 등 관련 Sub Domain 추가가능 )
- Route53에서 레코드 생성


(2) 도메인 구매처에 Route53 에서 생성한 Name Server설정
( 여러개의 서버를 모두 등록해서 해당 name server에 등록된 테이블로 routing )

(3) CloudFront에 연결
- 도메인 등록 ( 주소등록 후 및 www.추가한 주소 등 여러가지 추가 가능 )

- Route53에 등록한 도메인으로 CloudFront접근
