# 1. 버전별 디렉토리 생성
VERSION=${meta.version}
mkdir -p versions
# 2. 빌드
pnpm build
# 3. S3에 버전 디렉토리 업로드
aws s3 sync build/ s3://your-bucket/versions/$VERSION
# 4. 버전 정보 파일 생성 및 업로드 (롤백 용이성)
echo $VERSION > current-version.txt
aws s3 cp current-version.txt s3://your-bucket/
%% S3 버전 배포
graph LR
%% __START
Build --> Publish
Swap --> |upload s3| /
Swap -.-> |get selected version| /versions/*
Publish --> |upload s3| /versions/*
Publish --> |upload s3| current-version.txt
subgraph "Deploy"
Build
Publish
Swap
/
/versions/*
current-version.txt
end
%% __END
prod 의 경우에는 버전 디렉토리에만 배포합니다. swap 을 통해서만 실질적인 서비스 루트 경로에 빌드 파일들이 배포됩니다.
단, prod 가 아닌 버전에서는 swap 과정 없이 버전, 루트 디렉토리에 모두 배포될 수 있습니다. (상황에 따라 다른 환경도 버저닝 기능을 추가하여 버전별 관리를 할 수 있습니다)
# 1. 롤백 타겟 버전 선택
PREVIOUS_VERSION=${meta.version}
DISTRIBUTION_ID=${meta.cdn_id}
# 2. 타겟 버전의 파일을 빌드 디렉토리로 업로드 & 현재 버전 수정
aws s3 cp versions/$PREVIOUS_VERSION/ s3://your-bucket/ --recursive
echo $PREVIOUS_VERSION > current-version.txt
aws s3 cp current-version.txt s3://your-bucket/
# 3. CloudFront 캐시 무효화
aws cloudfront create-invalidation --distribution-id ${DISTRIBUTION_ID} --path='/*'
%% S3 버전 롤백
graph LR
%% __START
Swap --> |select version| /versions/{selectedVersion}
/versions/{selectedVersion} -.-> |upload| /
/versions/{selectedVersion} -.-> |upload| current-version.txt
subgraph "Rollback"
Swap
/
/versions/{selectedVersion}
current-version.txt
end
%% __END
[버전 관리]
버저닝 기능은 단순 롤백뿐만 아니라, 실제 live 환경 이전에 버전별 확인 용도로도 활용될 수 있습니다.
버저닝 경로와 실제 서비스 경로는 분리되어있기에, 쉽게 외부 접근을 막을 수 있습니다.
[구 버전 요청]
루트와 버전 경로 방식에서 이슈는 다음과 같습니다.
신규 배포시 루트 경로에서 기존에 있던 파일들을 제거하고 CDN 캐시 무효화까지 진행하면, 구버전의 파일 요청에 대해서 에러가 발생합니다.