
이번 주차 과제의 목표는 가끔씩 회사에서도 해왔던 업무인, AWS와 관련된 서비스를 통해 프론트엔드 개발로써 프로젝트 배포를 자동화하는 과정과 CloudFront와 연동하여 CDN 캐싱전략까지 자동화하 것 이었습니다.
Chapter 4-1. 인프라 관점의 성능 최적화
프로젝트의 코드가 수정되어 main 브랜치에 병합될 경우 git actions가 동작합니다.
.yml에서 *.md 파일은 예외처리하여, 단순 README.md 수정은 git actions 가 트리거 되지 않도록했습니다.
on:
push:
branches:
- main
paths-ignore:
- '*.md'
workflow_dispatch:
Git actions으로 가상 머신의 ubuntu-latest 환경에서 빌드된 정적 파일들을 S3 Sync로 배포가 됩니다.
npm ci 로 package-lock.json으로 의존성을 설치하고, npm run build로 프로젝트를 빌드합니다.
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
정적 빌드된 파일을 aws s3 sync 로 저장된 AWS_ACCESS_KEY와 같은 github secrets에 저장된 환경변수를 이용하여 배포합니다.
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Deploy to S3
run: |
aws s3 sync out/ s3://${{ secrets.S3_BUCKET_NAME }} --delete
S3 배포 이후, CloudFront 엣지 로케이션에 캐싱된 이전 파일들을 무효화합니다.
aws cloudfront create-invalidation을 이용해 이전에 저장된 캐싱 정보를 무효화합니다.
- name: Invalidate CloudFront cache
run: |
aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} --paths "/*"
사용자는 S3 혹은 CloudFront 도메인으로 접근이 가능합니다.
Repository secret과 환경변수
${{ secrets.SECRET_NAME }} 형식으로 사용할 수 있습니다.GitHub Actions과 CI/CD 도구
GitHub Actions은 GitHub에서 제공하는 자동화 도구로, 코드 변경이 감지되었을 때 테스트, 빌드, 배포 등의 작업을 자동으로 실행할 수 있도록 워크플로우를 구성할 수 있습니다.CI/CD는 개발자의 코드 변경 사항을 빠르고 안정적으로 배포하기 위한 일련의 자동화된 프로세스를 의미합니다..github/workflows/ 디렉토리에 정의된 YAML 파일을 기반으로 작동하며, 다양한 운영체제와 런타임 환경을 선택할 수 있습니다.S3와 스토리지
/s3/%{hash} 으로 데이터를 캐싱해두고 사용중에 있습니다.CloudFront와 CDN
캐시 무효화(Cache Invalidation)
aws cloudfront create-invalidation 명령어 또는 API를 통해 실행할 수 있습니다.("/*")나 선택적 경로(/index.html, /css/*)로 지정할 수 있습니다.Route 53
Chrome 개발자 도구
CDN 적용 전후 성능 비교
| 항목 | S3 직접 요청 | CDN 경유 요청 | 개선율 (%) |
|---|---|---|---|
| HTML 용량 | 12.5 KB | 3.2 KB | 74.4% |
| HTML 로딩 속도 | 28 ms | 9 ms | 67.9% |
| 전체 페이지 로드 시간 | 161 ms | 86 ms | 46.6% |
webpagetest.org, Desktop Chrome 환경 테스트
CDN 적용 전후 성능 비교
| 측정 지표 | S3 (초/KB) | CDN (초/KB) | 개선율 (%) |
|---|---|---|---|
| Time to First Byte | 3.259 | 0.478 | 85.3 |
| Start Render | 3.600 | 1.200 | 66.7 |
| First Contentful Paint | 3.621 | 1.183 | 67.3 |
| Speed Index | 3.714 | 1.250 | 66.4 |
| Largest Contentful Paint | 3.821 | 1.183 | 69.0 |
| Page Weight (KB) | 483 | 194 | 59.8 |