새로 시작하는 프로젝트의 워크로드를 설계하면서 AWS의 App Runner 보다 GCP의 Cloud Run이 더 효율적이라는 것을 알게되어 '로컬 Gitlab CI Pipeline - Image Registry - Web Service - HTTPS' 로 이어지는 무중단 배포 파이프라인을 GCP에서 구축해 보고자 이 가이드를 작성함.
지난 포스팅에서 GCP의 인증 체계와 창고(Artifact Registry)를 준비했습니다. 이번 장에서는 이미 구축된 GitLab Pipeline을 활용하여 코드를 컨테이너로 빌드하고, Cloud Run에 서비스를 올리는 실전 과정을 다룹니다.
이미 GitLab Runner와 기본적인 파이프라인 환경이 갖춰져 있다면, .gitlab-ci.yml에 GCP용 로직을 채워 넣을 차례입니다.
.gitlab-ci.yml 구성 전략GCP Artifact Registry는 일반적인 docker login 방식 외에도 _json_key라는 약속된 ID를 통해 인증할 수 있습니다. AWS 관련 로직을 제거하고 아래와 같이 구성합니다.
# Build & Push 단계 핵심 스크립트
homepage_build:
stage: build
script:
# 1. 환경 변수 설정
- export REGISTRY_URL="$GCP_REGION-docker.pkg.dev/$GCP_PROJECT_ID/$GCP_REGISTRY_NAME"
# 2. Docker 로그인 (GCP 전용 고정 ID인 _json_key 사용)
- echo "$GCP_SERVICE_KEY" | docker login -u _json_key --password-stdin https://$GCP_REGION-docker.pkg.dev
# 3. 이미지 빌드 및 푸시
- docker build -t $REGISTRY_URL/image-cyaninn-inn-webpage-prod:$HOMEPAGE_TAG ./staging/homepage
- docker push $REGISTRY_URL/image-cyaninn-inn-webpage-prod:$HOMEPAGE_TAG
[리전]-docker.pkg.dev/[프로젝트ID]/[저장소]/[이미지])를 정확히 지켜야 Push 오류를 방지할 수 있습니다.이미지가 성공적으로 Push 되었다면, 이제 웹 대시보드에서 첫 번째 서버를 기동해 봅시다.
[+ 서비스 만들기]를 클릭합니다.[선택] 버튼을 눌러 Artifact Registry에 있는 image-cyaninn-inn-webpage-prod 패키지와 원하는 태그(버전)를 지정합니다.하단의 [컨테이너, 네트워킹, 보안] 섹션을 확장하여 아래 내용을 반드시 점검해야 합니다.
EXPOSE 8080을 사용 중이므로, 설정 창의 컨테이너 포트 역시 8080으로 되어 있어야 합니다. 이 포트가 어긋나면 배포는 성공해도 실제 사이트는 뜨지 않는 '연결 거부' 상태가 됩니다.웹 대시보드에서 첫 배포를 마쳤다면, 이제 주석 처리해 두었던 deploy 스테이지를 활성화하여 자동 배포를 완성합니다.
homepage_deploy:
stage: deploy
image: google/cloud-sdk:latest
script:
# 1. 서비스 계정 인증 및 프로젝트 설정
- gcloud auth activate-service-account --key-file=$GCP_SERVICE_KEY
- gcloud config set project $GCP_PROJECT_ID
# 2. Cloud Run 배포 실행 (무중단 배포 자동 수행)
- gcloud run deploy homepage-service \
--image $GCP_REGION-docker.pkg.dev/$GCP_PROJECT_ID/$GCP_REGISTRY_NAME/image-cyaninn-inn-webpage-prod:$HOMEPAGE_TAG \
--region $GCP_REGION \
--platform managed \
--allow-unauthenticated
gcloud run deploy 명령이 떨어지면 Cloud Run은 기존 서버를 유지한 채 새로운 리비전(Revision)을 생성합니다. 새 버전이 완전히 준비(Healthy)되었다고 판단될 때만 로드밸런서가 트래픽을 새 버전으로 100% 전환하므로, 사용자는 중단 없는 서비스를 경험하게 됩니다.
이로써 AWS에서 GCP로의 웹 서비스 이전을 위한 모든 인프라 구축과 자동화 설정이 끝났습니다. 이제 개발자는 인프라 운영 부담을 덜고 오직 코드 작성에만 집중할 수 있는 서버리스(Serverless)의 혜택을 누리게 되었습니다.
추후에는 AWS Route53 도메인을 이 Cloud Run 엔드포인트에 연결하여 커스텀 도메인 환경을 구축해 볼 예정입니다. 시스템 엔지니어로서 한 단계 더 성장한 이번 실습이 여러분의 노트 정리에도 큰 도움이 되길 바랍니다!