Cloud Run에서 트래픽 분할, 점진적 출시, 롤백을 위해 버전 사용

Cloud Run에서 트래픽 분할, 점진적 출시, 롤백을 위해 버전 사용

이 Codelab 정보

subject최종 업데이트: 4월 5, 2025
account_circle작성자: Google 직원

1. 소개

개요

Cloud Run 버전을 사용하면 트래픽을 수신할 버전과 각 버전으로 전송할 트래픽의 백분율을 지정할 수 있습니다. 버전을 사용하면 이전 버전으로 롤백하고, 버전을 점진적으로 출시하고, 여러 버전 간에 트래픽을 분할할 수 있습니다.

이 Codelab에서는 버전을 사용하여 Cloud Run 서비스의 트래픽을 관리하는 방법을 보여줍니다. 버전에 관한 자세한 내용은 Cloud Run 문서를 참고하세요.

학습할 내용

  • Cloud Run 서비스의 두 개 이상의 버전 간에 트래픽을 분할하는 방법
  • 새 버전을 점진적으로 출시하는 방법
  • 이전 버전으로 롤백하는 방법

2. 설정 및 요구사항

기본 요건

  • Cloud Console에 로그인되어 있습니다.
  • 이전에 Cloud Run 서비스를 배포했습니다. 예를 들어 Cloud Run 서비스 배포를 따라 시작할 수 있습니다.

환경 변수 설정

이 Codelab 전체에서 사용할 환경 변수를 설정할 수 있습니다.

PROJECT_ID=YOUR-PROJECT-ID
REGION
=YOUR_REGION

BG_COLOR
=darkseagreen
SERVICE_NAME
=traffic-revisions-color
AR_REPO
=traffic-revisions-color-repo

서비스의 아티팩트 저장소 저장소 만들기

gcloud artifacts repositories create $AR_REPO \
   
--repository-format=docker \
   
--location=$REGION \
   
--description="codelab for finetuning using CR jobs" \
   
--project=$PROJECT_ID

3. 트래픽 분할

이 샘플에서는 색상 환경 변수를 읽고 해당 배경색을 사용하여 버전 이름으로 응답하는 Cloud Run 서비스를 만드는 방법을 보여줍니다.

이 Codelab에서는 Python을 사용하지만 어떤 런타임이든 사용할 수 있습니다.

환경 변수 설정

이 Codelab 전체에서 사용할 환경 변수를 설정할 수 있습니다.

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

서비스 만들기

먼저 소스 코드의 디렉터리를 만들고 해당 디렉터리로 이동합니다.

mkdir traffic-revisions-codelab && cd $_

그런 다음 다음 콘텐츠로 main.py 파일을 만듭니다.

import os
from flask import Flask, render_template_string

app = Flask(__name__)

TEMPLATE = """
<!doctype html>
<html lang="en">
<head>
    <title>Cloud Run Traffic Revisions</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 50vh;
            background-color: {{ bg_color }}; /* Set by environment variable */
            font-family: sans-serif;
        }
        .content {
            background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent white background */
            padding: 2em;
            border-radius: 8px;
            text-align: center;
            box-shadow: 0 4px 8px rgba(0,0,0,0.1);
        }
    </style>
</head>
<body>
    <div class="content">
        <p>background color: <strong>{{ color_name }}</strong></p>
    </div>
</body>
</html>
"""

@app.route('/')
def main():
    """Serves the main page with a background color from the ENV."""
    # Get the color from the 'BG_COLOR' environment variable.
    # Default to 'white' if the variable is not set.
    color = os.environ.get('BG_COLOR', 'white').lower()

    return render_template_string(TEMPLATE, bg_color=color, color_name=color)

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    app.run(debug=True, host='0.0.0.0', port=port)

그런 다음 다음 콘텐츠로 requirements.txt 파일을 만듭니다.

Flask>=2.0.0
gunicorn>=20.0.0

마지막으로 Dockerfile를 만듭니다.

FROM python:3.12-slim

WORKDIR
/app

COPY requirements
.txt .

RUN pip install
--no-cache-dir -r requirements.txt

COPY
. .

EXPOSE
8080

ENV PYTHONPATH
/app

CMD
["gunicorn", "--bind", "0.0.0.0:8080", "main:app"]

Cloud Build를 사용하여 Buildpack을 통해 Artifact Registry에 이미지를 만듭니다.

gcloud builds submit \
   
--tag $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME

첫 번째 버전을 darkseagreen 색상으로 Cloud Run에 배포합니다.

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars BG_COLOR=darkseagreen

서비스를 테스트하려면 웹브라우저에서 엔드포인트를 직접 열어 배경 색상이 짙은 바다색으로 표시되는지 확인하면 됩니다.

이제 황갈색 배경 색상이 있는 두 번째 버전을 배포합니다.

# update the env var
BG_COLOR=tan

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --set-env-vars BG_COLOR=tan

이제 웹사이트를 새로고침하면 황갈색 배경색이 표시됩니다.

트래픽 50-50 분할

딥 씨 그린 버전과 탄 버전 간에 트래픽을 분할하려면 기본 Cloud Run 서비스의 버전 ID를 찾아야 합니다. 다음 명령어를 실행하여 버전 ID를 확인할 수 있습니다.

gcloud run revisions list --service $SERVICE_NAME \
  --region $REGION --format 'value(REVISION)'

아래와 비슷한 결과가 표시됩니다.

traffic-revisions-color-00003-qoq
traffic-revisions-color-00002-zag

버전과 함께 다음 명령어를 실행하여 두 버전 간에 트래픽을 50/50으로 분할할 수 있습니다.

gcloud run services update-traffic $SERVICE_NAME \
  --region $REGION \
  --to-revisions YOUR_REVISION_1=50,YOUR_REVISION_2=50

트래픽 분할 테스트

브라우저에서 페이지를 새로고침하여 서비스를 테스트할 수 있습니다.

절반의 경우 진한 바다색 버전이 표시되고 나머지 절반의 경우 황갈색 버전이 표시됩니다. 출력에 버전 이름도 표시됩니다(예:

<html><body style="background-color:tan;"><div><p>Hello traffic-revisions-color-00003-qoq</p></div></body></html>

4. 점진적 출시

이 섹션에서는 새 Cloud Service 버전에 변경사항을 점진적으로 출시하는 방법을 알아봅니다. 점진적 출시에 관한 자세한 내용은 문서를 참고하세요.

이전 섹션과 동일한 코드를 사용하지만 새 Cloud Run 서비스로 배포합니다.

먼저 배경 색상을 beige로 설정하고 gradual-rollouts-colors라는 이름으로 함수를 배포합니다.

Cloud Run 함수를 Cloud Run에 직접 배포하려면 다음 명령어를 실행합니다.

# update the env var
BG_COLOR=beige

gcloud beta run deploy gradual-rollouts-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

이제 배경 색상이 라벤더인 새 버전을 점진적으로 출시하려고 한다고 가정해 보겠습니다.

먼저 현재 버전인 beige가 100% 트래픽을 수신하도록 설정합니다. 이렇게 하면 향후 수정사항에 트래픽이 수신되지 않습니다. 기본적으로 Cloud Run은 latest 플래그가 있는 버전에 100% 트래픽을 설정합니다. 이 현재 버전 beige가 모든 트래픽을 수신하도록 수동으로 지정하면 latest 플래그가 있는 버전은 더 이상 100% 트래픽을 수신하지 않습니다. 문서를 참고하세요.

# get the revision name

BEIGE_REVISION=$(gcloud run revisions list --service gradual-rollouts-colors \
  --region $REGION --format 'value(REVISION)')

# now set 100% traffic to that revision

gcloud run services update-traffic gradual-rollouts-colors \
  --to-revisions=$BEIGE_REVISION=100 \
  --region $REGION

Traffic: 100% radual-rollouts-colors-00001-yox와 유사한 출력이 표시됩니다.

이제 트래픽을 수신하지 않는 새 버전을 배포할 수 있습니다. 코드를 변경하는 대신 이 버전의 BG_COLOR 환경 변수를 업데이트할 수 있습니다.

Cloud Run 함수를 Cloud Run에 직접 배포하려면 다음 명령어를 실행합니다.

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud beta run deploy gradual-rollouts-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

이제 브라우저에서 웹사이트를 방문하면 라벤더가 가장 최근에 배포된 버전임에도 불구하고 베이지색이 표시됩니다.

트래픽 0% 를 게재하는 버전 테스트

버전이 배포되었고 트래픽을 0% 제공하고 있는 것으로 확인되었다고 가정해 보겠습니다. 상태 점검을 통과했지만 이 버전에서 라벤더 배경색을 사용하고 있는지 확인해야 합니다.

라벤더 버전을 테스트하려면 해당 버전에 태그를 적용하면 됩니다. 태그를 지정하면 트래픽을 제공하지 않고도 특정 URL에서 새 버전을 직접 테스트할 수 있습니다.

먼저 최신 버전의 이미지 URL (라벤더)을 가져옵니다.

IMAGE_URL_LAVENDER=$(gcloud run services describe gradual-rollouts-colors --region $REGION --format 'value(IMAGE)')

이제 해당 이미지에 연결된 색상으로 태그를 지정하세요.

gcloud run deploy gradual-rollouts-colors --image $IMAGE_URL_LAVENDER --no-traffic --tag $BG_COLOR --region $REGION

다음과 비슷한 출력이 표시됩니다.

The revision can be reached directly at https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

이제 해당 버전 URL을 방문하면 라벤더 색상이 표시됩니다.

점진적인 트래픽 증가

이제 라벤더 버전으로 트래픽을 전송할 수 있습니다. 아래 예는 트래픽의 1% 를 lavender로 전송하는 방법을 보여줍니다.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=1

트래픽의 50% 를 lavender로 전송하려면 동일한 명령어를 사용하지만 대신 50% 를 지정하면 됩니다.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=50

각 버전에서 수신하는 트래픽 양이 표시됩니다.

Traffic:
  50% gradual-rollouts-colors-00001-hos
  50% gradual-rollouts-colors-00004-mum
        lavender: https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

라벤더를 완전히 출시할 준비가 되면 라벤더를 100% 로 설정하여 비즈를 대체할 수 있습니다.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=100

이제 웹사이트를 방문하면 라벤더만 표시됩니다.

5. 롤백

고객이 라벤더보다 비즈를 선호한다는 초기 UX 의견이 접수되어 비즈로 롤백해야 한다고 가정해 보겠습니다.

다음 명령어를 실행하여 이전 버전 (베이지)으로 롤백할 수 있습니다.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-revisions $BEIGE_REVISION=100

이제 웹사이트를 방문하면 배경색으로 비즈가 표시됩니다.

롤백에 관한 자세한 내용은 문서를 참고하세요.

6. 수고하셨습니다.

Codelab을 완료했습니다. 축하합니다.

출시, 롤백, 트래픽 이전에 관한 문서를 검토하는 것이 좋습니다.

학습한 내용

  • Cloud Run 서비스의 두 개 이상의 버전 간에 트래픽을 분할하는 방법
  • 새 버전을 점진적으로 출시하는 방법
  • 이전 버전으로 롤백하는 방법

7. 삭제

의도치 않은 청구를 방지하려면(예: 이 Cloud Run 함수가 무료 등급의 월별 Cloud Run 호출 할당량보다 더 자주 실수로 호출되는 경우) Cloud Run 서비스를 삭제하거나 2단계에서 만든 프로젝트를 삭제하면 됩니다.

Cloud Run 서비스를 삭제하려면 Cloud Console의 Cloud Run(https://console.cloud.google.com/run/)으로 이동하여 이 Codelab에서 만든 함수를 삭제합니다.

전체 프로젝트를 삭제하려면 https://console.cloud.google.com/cloud-resource-manager로 이동하여 2단계에서 만든 프로젝트를 선택하고 삭제를 선택합니다. 프로젝트를 삭제하면 Cloud SDK에서 프로젝트를 변경해야 합니다. gcloud projects list를 실행하여 사용 가능한 모든 프로젝트 목록을 볼 수 있습니다.