카테고리 없음

AWS_CLOUD_3rd

elenalee 2025. 8. 23. 11:16

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 설정 )

프로토콜(HTTP), 포트(8080, 자바백엔드)

 

- 동작 생성 : 경로, 원본 선택, 프로토콜 선택 후 생성  

  ( Path: /api/*, Origin:EC2선택, Caching:Disabled, HTTP Method:all, Headers:All)

기본적으로 Cache Disabled (옵션으로 사용가능), 나머지도 default

 

동작 생성완료 ( /api로 들어오는 요청은 백엔드 서버로 연동 )

 

③ static 파일 렌더링을 위한 동작 설정 ( static 경로 추가 )

- S3에 /static의 경로를 추가하고 해당 경로로 접근시 파일 렌더링하도록 동작생성 

s3의 원본에 '/static'에 대한 추가적인 동작을 설정 (CachePolicy변경시도, default TTL 864000으로 변경)

 

(4) CloudFront로 엔드포인트 통합  ( 도메인 통합으로 CORS설정 불필요) 

프론트의 환경설정에서 백엔드 공란 ( 접속 URL을 비운 뒤 재빌드하여 S3에 반영 ) 

# VITE_API_URL=http://[backend_url]:8080
# Cloud Front 설정시 비워줘야 Backend로 갈수 있음

 

백엔드의 CORS설정 삭제

접속이 안되면 무효화 설정

 

③ 함수를 통한 경로 설정

- 정규 표현식으로 event의 처리 ( 에지 로케이션 호출시 event의 요청 주소반영 )

- 멀티 오리진 : /api 요청(전달), 파일확장자 요청 (전달) , spa route ( index.html 연결 ) 

함수 코드 추가 및 저장
함수를 CloudFront에 연결

 

# 함수 내용 

#정규 표현식
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의 멀티 오리진 반영 

SPA Route로 접근(/todos) 및 파일명 접근(/static/파일명)시 경로 접속결과

 

(5) WAF 설정 

- 보안 설정 ( Edge Location에서 SQL관련 보호와 접속 용량 제한 설정 등 ) 

- CloudFront - 보안 탭 - WAF manage - 보안보호 활성화 (국가별 접근 허용/제한 가능)

SQL Injection, XSS Scripting 등의 보안이나 Rate Limiting 설정(지나친 접속 제한)
하단에서 특정 국가제한 가능

 

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 입력 (  인증서 등록 후에 나타난 이름/값을 추가 )

Authoritative server (가용성을 위해 4개)

 

인증서 발행 후 내부에 설정된 내용 등록

 

② 인증서 발행 ( Authentication Manager, N.Virginia )

- 도메인 이름 설정 ( 주소 외에 *.주소 등 관련 Sub Domain 추가가능 ) 

- Route53에서 레코드 생성 

검증 대기중인 인증서에 접속하여 레코드 생성

 

(2) 도메인 구매처에 Route53 에서 생성한 Name Server설정 

( 여러개의 서버를 모두 등록해서 해당 name server에 등록된 테이블로 routing )

 

 

(3) CloudFront에 연결 

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

 

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