S3 배포

# 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 과정 없이 버전, 루트 디렉토리에 모두 배포될 수 있습니다. (상황에 따라 다른 환경도 버저닝 기능을 추가하여 버전별 관리를 할 수 있습니다)

S3 롤백

# 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 캐시 무효화까지 진행하면, 구버전의 파일 요청에 대해서 에러가 발생합니다.