1919 - [ Route53과 DNS 서비스] ( #route53과-dns-서비스 )
2020[ CDN과 성능 최적화 비교] ( #cdn과-성능최적화 )
2121
22-
2322### 개요
23+
2424#### 파이프라인 다이어그램 (diagrams)
25+
2526![ Image] ( https://github.com/user-attachments/assets/471e09f6-fbd4-4437-9174-c2cafa64e829 )
2627
2728#### 파이프라인 플로우 차트
29+
2830``` mermaid
2931graph TB
3032 Dev[👨💻 Developer] --> |코드 작성 및 커밋| LocalRepo[📁 Local Git Repository]
3133 LocalRepo --> |git push origin main| GitHub[🐙 GitHub Repository]
32-
34+
3335 GitHub --> |트리거| GitHubActions[⚡ GitHub Actions]
34-
36+
3537 subgraph "GitHub Actions Workflow"
3638 GitHubActions --> Checkout[📥 Checkout Code<br/>actions/checkout@v4]
3739 Checkout --> NodeSetup[🔧 Setup Node.js<br/>actions/setup-node@v4]
@@ -41,28 +43,28 @@ graph TB
4143 AWSConfig --> S3Upload[📤 Upload to S3<br/>aws s3 sync ./out s3://bucket]
4244 S3Upload --> CloudFrontInvalidation[🔄 CloudFront Invalidation<br/>aws cloudfront create-invalidation]
4345 end
44-
46+
4547 subgraph "AWS Services"
4648 S3[📦 Amazon S3<br/>Static File Hosting<br/>• HTML, CSS, JS 파일<br/>• 이미지 및 정적 자산<br/>• 버킷 정책 설정]
4749 CloudFront[🌐 Amazon CloudFront<br/>CDN 서비스<br/>• 전 세계 엣지 로케이션<br/>• 캐시 관리<br/>• HTTPS 지원]
4850 IAM[🔒 AWS IAM<br/>• GitHub Actions용 사용자<br/>• S3 읽기/쓰기 권한<br/>• CloudFront 무효화 권한]
4951 end
50-
52+
5153 subgraph "보안 관리"
5254 GitHubSecrets[🔑 GitHub Repository Secrets<br/>• AWS_ACCESS_KEY_ID<br/>• AWS_SECRET_ACCESS_KEY<br/>• AWS_REGION]
5355 AWSSecrets[🛡️ AWS Secrets Manager<br/>선택적 고급 보안]
5456 end
55-
57+
5658 S3Upload --> S3
5759 CloudFrontInvalidation --> CloudFront
5860 AWSConfig -.-> GitHubSecrets
5961 AWSConfig -.-> IAM
6062 GitHubSecrets -.-> AWSSecrets
61-
63+
6264 S3 --> |Origin| CloudFront
6365 CloudFront --> |빠른 전송| EdgeLocations[🌍 Edge Locations<br/>전 세계 캐시 서버]
6466 EdgeLocations --> Users[👥 End Users<br/>웹사이트 방문자]
65-
67+
6668 style GitHub fill:#24292e,stroke:#fff,stroke-width:2px,color:#fff
6769 style GitHubActions fill:#2088ff,stroke:#fff,stroke-width:2px,color:#fff
6870 style S3 fill:#ff9900,stroke:#fff,stroke-width:2px,color:#fff
@@ -72,6 +74,7 @@ graph TB
7274```
7375
7476#### 파이프라인 시퀀스 다이어그램
77+
7578``` mermaid
7679sequenceDiagram
7780 participant Dev as 👨💻 Developer
@@ -82,46 +85,47 @@ sequenceDiagram
8285 participant CF as 🌐 CloudFront
8386 participant IAM as 🔒 IAM
8487 participant User as 👥 End User
85-
88+
8689 Dev->>Git: 1. 코드 작성 및 커밋
8790 Dev->>GH: 2. git push origin main
88-
91+
8992 Note over GH,GA: 🚀 자동 배포 시작
9093 GH->>GA: 3. Push 이벤트 트리거
91-
94+
9295 Note over GA: 📋 Workflow 실행
9396 GA->>GA: 4. Checkout 코드
9497 GA->>GA: 5. Node.js 환경 설정
9598 GA->>GA: 6. npm ci (의존성 설치)
9699 GA->>GA: 7. npm run build (빌드)
97-
100+
98101 Note over GA,IAM: 🔐 AWS 인증
99102 GA->>IAM: 8. AWS 자격 증명 확인
100103 IAM-->>GA: 9. 인증 성공
101-
104+
102105 Note over GA,S3: 📤 정적 파일 업로드
103106 GA->>S3: 10. 빌드 파일 업로드
104107 S3-->>GA: 11. 업로드 완료
105-
108+
106109 Note over GA,CF: 🔄 캐시 무효화
107110 GA->>CF: 12. 캐시 무효화 요청
108111 CF-->>GA: 13. 무효화 시작
109-
112+
110113 Note over CF: 🌍 전 세계 배포
111114 CF->>CF: 14. 엣지 로케이션 업데이트
112-
115+
113116 Note over User,CF: 🌐 사용자 접근
114117 User->>CF: 15. 웹사이트 요청
115118 CF->>S3: 16. Origin에서 파일 가져오기 (캐시 미스 시)
116119 S3-->>CF: 17. 파일 전송
117120 CF-->>User: 18. 최신 웹사이트 제공
118-
121+
119122 Note over Dev,User: ✅ 배포 완료!
120123```
121124
122125### 주요 단계별 설명
123126
124127#### 1. GitHub Actions
128+
125129워크플로우 구성: ` main ` 브랜치에 push 이벤트가 발생하면 배포가 자동으로 진행됩니다.
126130
127131- 주요 작업:
@@ -165,27 +169,27 @@ AWS Secrets Manager나 GitHub Repository Secrets를 활용해 자격 증명을
165169 예를 들어, 코드 push 시 자동으로 테스트, 빌드, 배포 과정을 실행합니다.
166170 이를 통해 배포 오류를 줄이고, 일관된 개발 파이프라인을 유지할 수 있습니다.
167171
168-
169- ** 예시 워크플로우 **
170- ```
171- name: Deploy to S3
172- on:
173- push:
174- branches: [main]
175- jobs:
176- deploy:
177- runs-on: ubuntu-latest
178- steps:
179- - uses: actions/checkout@v4
180- - name: Setup Node.js
181- uses: actions/setup-node@v4
182- with:
183- node-version: '18'
184- - run: npm ci
185- - run: npm run build
186- - name: Deploy to S3
187- run: aws s3 sync ./build s3://my-bucket
188- ```
172+ ** 예시 워크플로우 **
173+
174+ ```
175+ name: Deploy to S3
176+ on:
177+ push:
178+ branches: [main]
179+ jobs:
180+ deploy:
181+ runs-on: ubuntu-latest
182+ steps:
183+ - uses: actions/checkout@v4
184+ - name: Setup Node.js
185+ uses: actions/setup-node@v4
186+ with:
187+ node-version: '18'
188+ - run: npm ci
189+ - run: npm run build
190+ - name: Deploy to S3
191+ run: aws s3 sync ./build s3://my-bucket
192+ ```
189193
190194- #### S3와 스토리지
191195
@@ -194,6 +198,7 @@ AWS Secrets Manager나 GitHub Repository Secrets를 활용해 자격 증명을
194198 높은 내구성(99.999999999%)과 가용성을 제공해, 안전하게 정적 파일을 저장할 수 있습니다.
195199
196200 ** S3 버킷 구조 예시**
201+
197202 ```
198203 my-website-bucket/
199204 ├── index.html
@@ -207,19 +212,20 @@ AWS Secrets Manager나 GitHub Repository Secrets를 활용해 자격 증명을
207212 └── images/
208213 ├── logo.png
209214 └── hero-bg.jpg
210- ```
211-
212- **AWS CLI로 파일 업로드**
213- ```
214- # 단일 파일 업로드
215- aws s3 cp index.html s3://my-bucket/
216-
217- # 폴더 전체 동기화
218- aws s3 sync ./build s3://my-bucket --delete
219-
220- # 정적 웹사이트 호스팅 설정
221- aws s3 website s3://my-bucket --index-document index.html
222- ```
215+ ```
216+
217+ ** AWS CLI로 파일 업로드**
218+
219+ ```
220+ # 단일 파일 업로드
221+ aws s3 cp index.html s3://my-bucket/
222+
223+ # 폴더 전체 동기화
224+ aws s3 sync ./build s3://my-bucket --delete
225+
226+ # 정적 웹사이트 호스팅 설정
227+ aws s3 website s3://my-bucket --index-document index.html
228+ ```
223229
224230- #### CloudFront와 CDN
225231
@@ -228,6 +234,7 @@ AWS Secrets Manager나 GitHub Repository Secrets를 활용해 자격 증명을
228234 CDN은 글로벌 사용자에게 콘텐츠를 빠르게 제공하고, 서버 부하를 줄여줍니다.
229235
230236 ** CDN 작동 원리**
237+
231238 ```
232239 사용자(서울) → 한국 엣지 서버 → 콘텐츠 전달 (빠름 ⚡)
233240 vs
@@ -241,34 +248,38 @@ AWS Secrets Manager나 GitHub Repository Secrets를 활용해 자격 증명을
241248 이때 캐시 무효화를 통해 최신 콘텐츠로 빠르게 갱신할 수 있습니다.
242249 예) CloudFront의 Invalidation API를 사용해서 특정 경로 캐시를 제거.
243250
244- **CloudFront 캐시 무효화 명령어**
245- ```
246- # 전체 캐시 무효화
247- aws cloudfront create-invalidation \
248- --distribution-id E1234567890123 \
249- --paths "/*"
250-
251- # 특정 파일만 무효화
252- aws cloudfront create-invalidation \
253- --distribution-id E1234567890123 \
254- --paths "/index.html" "/css/styles.css"
255- ```
256- **캐시 무효화 과정**
257- 1. 새 파일 업로드 → S3
258- 2. 캐시 무효화 실행 → CloudFront
259- 3. 전 세계 엣지 서버 캐시 삭제
260- 4. 사용자 요청 시 → 새 파일 전달
251+ ** CloudFront 캐시 무효화 명령어**
252+
253+ ```
254+ # 전체 캐시 무효화
255+ aws cloudfront create-invalidation \
256+ --distribution-id E1234567890123 \
257+ --paths "/*"
258+
259+ # 특정 파일만 무효화
260+ aws cloudfront create-invalidation \
261+ --distribution-id E1234567890123 \
262+ --paths "/index.html" "/css/styles.css"
263+ ```
264+
265+ ** 캐시 무효화 과정**
266+
267+ 1 . 새 파일 업로드 → S3
268+ 2 . 캐시 무효화 실행 → CloudFront
269+ 3 . 전 세계 엣지 서버 캐시 삭제
270+ 4 . 사용자 요청 시 → 새 파일 전달
261271
262272- #### Repository secret과 환경변수
263-
273+
264274 Repository secret은 GitHub Actions 등에서 민감 정보를 안전하게 관리하는 방식입니다.
265275 예를 들어, 배포용 API 키, 데이터베이스 비밀번호 등을 저장하고, 워크플로에서 환경 변수로 불러와 사용합니다.
266276 이를 통해 보안을 유지하면서도 자동화 파이프라인을 안전하게 실행할 수 있습니다.
267277
268278 ** GitHub Repository Secrets 설정**
279+
269280 ```
270281 Settings → Secrets and variables → Actions
271-
282+
272283 필요한 Secrets:
273284 - AWS_ACCESS_KEY_ID: AKIA...
274285 - AWS_SECRET_ACCESS_KEY: wJalr...
@@ -277,68 +288,75 @@ AWS Secrets Manager나 GitHub Repository Secrets를 활용해 자격 증명을
277288 ```
278289
279290 ** 워크플로우에서 Secret 사용**
291+
280292 ```
281293 - name: Configure AWS credentials
282294 uses: aws-actions/configure-aws-credentials@v1
283295 with:
284296 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
285297 aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
286298 aws-region: ${{ secrets.AWS_REGION }}
287-
299+
288300 - name: Deploy to S3
289301 run: |
290302 aws s3 sync ./build s3://${{ secrets.S3_BUCKET_NAME }}
291- ```
303+ ```
292304
293305- #### Route53과 DNS 서비스
294-
306+
295307 Route 53은 AWS의 DNS(도메인 네임 시스템) 관리 서비스입니다.
296308 S3 또는 CloudFront에 배포된 웹사이트에 도메인(예: www.example.com)을 연결할 수 있습니다.
297309 사용자는 Route 53을 통해 사용자 지정 도메인과 연결된 트래픽을 전 세계적으로 안정적이고 빠르게 라우팅할 수 있습니다.
298310 실무에선 Route 53을 사용해 도메인 등록 → S3/CloudFront와 연결 → HTTPS 인증서 발급까지 진행하는 경우가 많습니다.
299311
300312 ** 도메인 연결 전체 흐름**
301- 1. 도메인 구매 (Route 53 또는 외부)
302- 2. Route 53 호스팅 존 생성
303- 3. DNS 레코드 설정 (A, CNAME)
304- 4. SSL 인증서 발급 (ACM)
305- 5. CloudFront에 도메인 연결
306- 6. 사용자 접근: mysite.com → Route 53 → CloudFront → S3
313+
314+ 1 . 도메인 구매 (Route 53 또는 외부)
315+ 2 . Route 53 호스팅 존 생성
316+ 3 . DNS 레코드 설정 (A, CNAME)
317+ 4 . SSL 인증서 발급 (ACM)
318+ 5 . CloudFront에 도메인 연결
319+ 6 . 사용자 접근: mysite.com → Route 53 → CloudFront → S3
307320
308321---
309322
310323### CDN과 성능최적화
311324
312325##### S3와 CloundFront
313- 
314- 
315- #### 첫 화면 로딩 (HTML 문서)
316326
317- | 비교 지점 | S3 직접 배포 | CloudFront (CDN) 배포 |
318- | ----------------- | ------------------------ | --------------------- |
319- | **document** | 13.4KB, 응답 203ms | 3.4KB, 응답 17ms |
320- | **document 응답** | S3 직접 응답 (us-east-1) | CDN 엣지 서버 응답 |
327+ ![ Image ] ( https://github.com/user-attachments/assets/c7c56456-c204-47ff-b09c-886a23e0e697 )
328+ ![ Image ] ( https://github.com/user-attachments/assets/5864931d-667f-4a09-877e-0954f3aea4a5 )
329+
330+ #### 테스트 환경
321331
322- #### JS / CSS / Font / 이미지 리소스
332+ - 오리진: Amazon S3 정적 파일 호스팅 (us-east-1)
333+ - CDN: Amazon CloudFront 배포 (엣지 로케이션 캐시 적용)
334+ - 테스트 방식: 크롬 개발자 도구 네트워크 탭, 캐시 무효화 후 새로고침 (Hard Reload)
335+ - 주요 로드 항목: HTML, JS, CSS, 이미지, 폰트 등 약 20개
323336
324- | 리소스 유형 | S3 직접 배포 | CloudFront (CDN) 배포 |
325- | -------------- | ----------------------------------- | ----------------------------------- |
326- | **CSS** | f5851670bcc5d7e2.css, 200 응답, 0ms | f5851670bcc5d7e2.css, 200 응답, 0ms |
327- | **JS** | 8개 정도의 JS 파일, 200 응답, 0ms | 8개 정도의 JS 파일, 200 응답, 0ms |
328- | **Font / svg** | font, svg 등도 0ms 응답 | font, svg 등도 0ms 응답 |
337+ #### 측정 결과 요약
329338
330- S3는 HTML(document)만 네트워크 딜레이(203ms)가 보였고, 나머지는 브라우저 메모리 캐시로 인해 0ms로 보였습니다.
331- CloudFront도 HTML(document) 요청만 실제 엣지에서 빠른 응답(17ms)이 확인되었고, 나머지는 메모리 캐시로 0ms.
339+ | 항목 | S3 직접 접근 | CloudFront CDN 사용 |
340+ | ------------------------- | ------------------------------------------------ | --------------------------------------------- |
341+ | ** 첫 바이트 수신 (TTFB)** | 평균 ** 200\~ 250ms** (최대 300ms 이상) | 평균 ** 10\~ 20ms** (1/10 이하로 단축) |
342+ | ** 전체 로딩 시간** | 최대 ** 1,800ms** (JS, CSS, 이미지까지 로드 완료) | 최대 ** 600\~ 900ms** (50% 이상 단축) |
343+ | ** JS 주요 번들 로드** | 개별 400\~ 800ms까지 소요 | 개별 400\~ 500ms 이하, Edge 캐시 활용으로 빠름 |
344+ | ** HTML 응답** | 13.4kB, 200\~ 300ms | 3.5kB, 10\~ 20ms (오리진 대신 CDN 캐시 전달) |
345+ | ** 캐시 여부** | 오리진만 응답, 캐시 전략 미적용 | CloudFront ** HIT** 응답으로 빠른 전송 가능 |
332346
333- #### 네트워크 타임라인 및 성능 차이
347+ #### 상세 분석
334348
335- | 비교 지점 | S3 직접 배포 | CloudFront (CDN) 배포 |
336- | --------------- | --------------------------------------------------- | -------------------------------------- |
337- | **최초 요청** | 200ms 이상 | 17ms로 매우 빠름 |
338- | **정적 리소스** | 메모리 캐시로 인해 0ms 응답 | 메모리 캐시로 인해 0ms 응답 |
339- | **콘텐츠 위치** | S3 (us-east-1, AWS 리전) | 전 세계 CDN 엣지 로케이션 |
340- | **사용자 경험** | 지역적으로는 빠름, 글로벌 사용자에게는 느릴 수 있음 | 전 세계 어디서나 빠른 응답 (캐시 덕분) |
349+ 첫 바이트 수신 속도: CDN의 엣지 로케이션에서 캐시된 응답이 바로 내려와, TTFB가 S3 직접 접근 대비 10배 이상 빨라졌음.
350+ 전체 로딩 속도: JS, CSS 등 큰 리소스도 CDN을 통해 분산 전송되어, 최종 렌더링까지 걸리는 총 시간이 50% 이상 단축.
351+ JS 번들: 여러 개의 번들 파일 로드 속도도 평균 400~ 500ms 수준으로 일정해졌고, CDN 미사용 시에는 일부 파일이 1,000ms까지 걸림.
352+ 사용자 경험: 첫 화면 렌더링이 더 빨라지고, 스크롤/상호작용에도 빠른 반응성을 제공하게 됨.
341353
342- #### 결론
354+ #### 시사점 및 결론
343355
344- 이번 비교에서 CloudFront를 도입하면 S3에서 HTML 파일만 직접 가져오던 때보다 첫 화면 로딩 속도가 203ms → 17ms로 줄었습니다. 정적 리소스(JS/CSS)는 캐시가 적용되어 양쪽 모두 0ms였지만, CDN을 통해 전 세계 사용자에게 동일한 빠른 응답을 제공할 수 있습니다. CDN은 사용자 체감 성능을 높이고 서버 트래픽을 줄여주는 효과를 확인할 수 있었습니다.
356+ - 사용자 경험 개선: CloudFront CDN으로 사용자 첫 화면 렌더링 속도가 눈에 띄게 향상됨.
357+ - 서버 부하 감소: 오리진 요청 대신 엣지 서버 응답으로 S3 부하가 감소함.
358+ - 장애 대응력: CDN의 글로벌 네트워크가 대규모 트래픽에도 안정적인 전송을 보장함.
359+ - 추가 개선 아이디어:
360+ - 콘텐츠 캐시 정책: 파일별 캐시 만료 시간(TTL) 최적화로 응답성 극대화
361+ - 이미지 최적화: S3 오리진 단계에서 WebP 변환 등 이미지 최적화도 검토 가능
362+ - 라우팅 최적화: CloudFront의 지리적 라우팅 기능(Geo Routing)으로 각 지역 사용자에게 더 빠른 응답 제공
0 commit comments