1. 소개
개요
Cloud Run 버전을 사용하면 트래픽을 수신할 버전과 각 버전에 전송할 트래픽 비율을 지정할 수 있습니다. 버전을 사용하면 이전 버전으로 롤백하고, 버전을 점진적으로 출시하고, 여러 버전 간에 트래픽을 분할할 수 있습니다.
이 Codelab에서는 버전을 사용하여 Cloud Run 서비스로의 트래픽을 관리하는 방법을 보여줍니다. Cloud Run 문서에서 버전에 대해 자세히 알아볼 수 있습니다.
학습할 내용
- Cloud Run 서비스의 두 개 이상의 버전 간에 트래픽을 분할하는 방법
- 새 버전을 점진적으로 출시하는 방법
- 이전 버전으로 롤백하는 방법
2. 설정 및 요구사항
기본 요건
- Cloud 콘솔에 로그인되어 있습니다.
- 이전에 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
서비스의 Artifact Registry 저장소 만들기
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
서비스 만들기
먼저 소스 코드 디렉터리를 만들고 해당 디렉터리로 cd합니다.
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 서비스 버전으로 변경사항을 점진적으로 출시하는 방법을 알아봅니다. 점진적 출시에 관한 자세한 내용은 문서를 참고하세요.
이전 섹션과 동일한 코드를 사용하지만 새 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
이제 배경색이 라벤더인 새 버전을 점진적으로 출시한다고 가정해 보겠습니다.
먼저 현재 버전인 베이지색이 트래픽을 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% 를 라벤더로 보내는 방법을 보여줍니다.
gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=1
트래픽의 50% 를 라벤더로 보내려면 동일한 명령어를 사용하되 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(https://console.cloud.google.com/run/)에서 Cloud Run으로 이동하여 이 Codelab에서 만든 함수를 삭제합니다.
전체 프로젝트를 삭제하려면 https://console.cloud.google.com/cloud-resource-manager로 이동하여 2단계에서 만든 프로젝트를 선택하고 삭제를 선택합니다. 프로젝트를 삭제하면 Cloud SDK에서 프로젝트를 변경해야 합니다. gcloud projects list를 실행하여 사용 가능한 모든 프로젝트의 목록을 볼 수 있습니다.