1. 소개
개요
Cloud Run 함수를 사용하면 트래픽을 수신할 버전을 지정하고 특정 버전에 수신되는 트래픽 백분율을 지정할 수 있습니다. 버전을 사용하면 이전 버전으로 롤백하고, 버전을 점진적으로 출시하고, 여러 버전 간에 트래픽을 분할할 수 있습니다.
이 Codelab에서는 버전을 사용하여 Cloud Run 함수의 트래픽을 관리하는 방법을 보여줍니다. 버전에 관한 자세한 내용은 Cloud Run 문서를 참고하세요.
학습할 내용
- Cloud Run 함수의 두 개 이상의 버전 간에 트래픽을 분할하는 방법
- 새 버전을 점진적으로 출시하는 방법
- 이전 버전으로 롤백하는 방법
2. 설정 및 요구사항
기본 요건
- Cloud Console에 로그인되어 있습니다.
- 이전에 Cloud Run 함수를 배포했습니다. 예를 들어 Cloud Run 함수 배포를 따라 시작할 수 있습니다.
Cloud Shell 활성화
- Cloud Console에서 Cloud Shell 활성화를 클릭합니다.
Cloud Shell을 처음 시작하는 경우 Cloud Shell에 대한 설명이 포함된 중간 화면이 표시됩니다. 중간 화면이 표시되면 계속을 클릭합니다.
Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.
이 가상 머신에는 필요한 모든 개발 도구가 로드되어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저만으로도 수행할 수 있습니다.
Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 설정된 것을 확인할 수 있습니다.
- Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list
명령어 결과
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project
명령어 결과
[core] project = <PROJECT_ID>
또는 다음 명령어로 설정할 수 있습니다.
gcloud config set project <PROJECT_ID>
명령어 결과
Updated property [core/project].
3. 트래픽 분할
이 샘플에서는 색상 환경 변수를 읽고 해당 배경색을 사용하여 버전 이름으로 응답하는 함수를 만드는 방법을 보여줍니다.
이 Codelab에서는 node.js를 사용하지만 어떤 런타임이든 사용할 수 있습니다.
환경 변수 설정
이 Codelab 전체에서 사용할 환경 변수를 설정할 수 있습니다.
REGION=<YOUR_REGION> PROJECT_ID=<YOUR-PROJECT-ID> BG_COLOR=darkseagreen
함수 만들기
먼저 소스 코드의 디렉터리를 만들고 해당 디렉터리로 이동합니다.
mkdir revisions-gcf-codelab && cd $_
그런 다음 다음 콘텐츠로 package.json
파일을 만듭니다.
{ "dependencies": { "@google-cloud/functions-framework": "^3.0.0" } }
그런 다음 다음 콘텐츠로 index.js
소스 파일을 만듭니다.
const functions = require('@google-cloud/functions-framework'); const BG_COLOR = process.env.BG_COLOR; const K_REVISION = process.env.K_REVISION; functions.http('helloWorld', (req, res) => { res.writeHead(200, { 'Content-Type': 'text/html' }); res.end('<html><body style="background-color:' + BG_COLOR + ';"' + '><div><p>' + 'Hello from ' + K_REVISION + ' using color ' + BG_COLOR + '</p></div></body>' + '</html>'); });
Cloud Run 함수를 Cloud Run에 직접 배포하려면 다음 명령어를 실행합니다.
gcloud beta run deploy traffic-splitting-gcf \ --source . \ --function helloWorld \ --region $REGION \ --no-allow-unauthenticated \ --set-env-vars BG_COLOR=$BG_COLOR
Cloud Functions 2세대로 배포하려면 다음 명령어를 사용하세요.
gcloud functions deploy traffic-splitting-gcf \ --gen2 \ --runtime=nodejs20 \ --region=$REGION \ --source=. \ --entry-point=helloWorld \ --trigger-http \ --no-allow-unauthenticated \ --set-env-vars BG_COLOR=$BG_COLOR
함수를 테스트하려면 기존 엔드포인트를 컬하여 html에서 darkseagreen 색상을 확인하거나 브라우저를 사용하여 엔드포인트를 직접 호출하여 배경 색상을 확인하면 됩니다.
SERVICE_URL=$(gcloud run services describe traffic-splitting-gcf --platform managed --region $REGION --format 'value(status.url)') curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
이제 황갈색 배경 색상이 있는 두 번째 버전을 배포합니다.
Cloud Run 함수를 Cloud Run에 직접 배포하려면 다음 명령어를 실행합니다.
# update the env var BG_COLOR=tan gcloud beta run deploy traffic-splitting-gcf \ --source . \ --function helloWorld \ --region $REGION \ --no-allow-unauthenticated \ --update-env-vars BG_COLOR=$BG_COLOR
Cloud Functions 2세대로 배포하려면 다음 명령어를 사용하세요.
# update the env var BG_COLOR=tan gcloud functions deploy traffic-splitting-gcf \ --gen2 \ --runtime nodejs20 \ --entry-point helloHttp \ --source . \ --region $REGION \ --trigger-http \ --no-allow-unauthenticated \ --update-env-vars BG_COLOR=$BG_COLOR
이제 엔드포인트를 컬하면 황갈색 배경색이 표시됩니다.
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
트래픽 50-50 분할
딥 씨 그린 버전과 탄 버전 간에 트래픽을 분할하려면 기본 Cloud Run 서비스의 버전 ID를 찾아야 합니다. 다음 명령어를 실행하여 버전 ID를 확인할 수 있습니다.
gcloud run revisions list --service traffic-splitting-gcf \ --region $REGION --format 'value(REVISION)'
아래와 비슷한 결과가 표시됩니다.
traffic-splitting-gcf-00003-qoq traffic-splitting-gcf-00002-zag
다음 명령어를 실행하여 두 버전 간에 트래픽을 50/50으로 분할할 수 있습니다.
gcloud run services update-traffic traffic-splitting-gcf \ --region $REGION \ --to-revisions <REVISION1>=50,<REVISION2>=50
트래픽 분할 테스트
공개 URL을 방문하여 함수를 테스트할 수 있습니다 (curl을 사용하거나 브라우저에서 직접).
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" $SERVICE_URL
절반의 경우 진한 바다색 버전이 표시되고 나머지 절반의 경우 황갈색 버전이 표시됩니다. 출력에 버전 이름도 표시됩니다(예:
<html><body style="background-color:tan;"><div><p>Hello traffic-splitting-gcf-00006-qoq</p></div></body></html>
4. 점진적 출시
이 섹션에서는 새 Cloud Functions 버전에 변경사항을 점진적으로 출시하는 방법을 알아봅니다. 점진적 출시에 관한 자세한 내용은 문서를 참고하세요.
이전 섹션과 동일한 코드를 사용하지만 새 Cloud 함수로 배포합니다.
먼저 배경 색상을 beige
로 설정하고 gradual-rollouts-gcf
라는 이름으로 함수를 배포합니다.
Cloud Run 함수를 Cloud Run에 직접 배포하려면 다음 명령어를 실행합니다.
# update the env var BG_COLOR=beige gcloud beta run deploy gradual-rollouts-gcf \ --source . \ --function helloWorld \ --region $REGION \ --no-allow-unauthenticated \ --update-env-vars BG_COLOR=$BG_COLOR
Cloud Functions 2세대로 배포하려면 다음 명령어를 사용하세요.
# update the env var BG_COLOR=beige # deploy the function gcloud functions deploy gradual-rollouts-gcf \ --gen2 \ --runtime nodejs20 \ --entry-point helloHttp \ --source . \ --region $REGION \ --trigger-http \ --no-allow-unauthenticated \ --update-env-vars BG_COLOR=$BG_COLOR
이제 배경 색상이 라벤더인 새 버전을 점진적으로 출시하려고 한다고 가정해 보겠습니다.
먼저 현재 버전인 beige가 100% 의 트래픽을 수신하도록 설정합니다. 이렇게 하면 향후 Cloud Functions 배포에서 트래픽을 수신하지 않습니다. 기본적으로 Cloud Functions는 latest
플래그를 사용하여 버전으로 100% 트래픽을 설정합니다. 이 현재 버전 beige가 모든 트래픽을 수신해야 한다고 수동으로 지정하면 latest
플래그가 있는 버전은 더 이상 100% 트래픽을 수신하지 않습니다. 문서를 참고하세요.
# get the revision name BEIGE_REVISION=$(gcloud run revisions list --service gradual-rollouts-gcf \ --region $REGION --format 'value(REVISION)') # now set 100% traffic to that revision gcloud run services update-traffic gradual-rollouts-gcf --to-revisions=$BEIGE_REVISION=100 --region $REGION
Traffic: 100% gradual-rollouts-gcf2-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-gcf \ --source . \ --function helloWorld \ --region $REGION \ --no-allow-unauthenticated \ --update-env-vars BG_COLOR=$BG_COLOR
Cloud Functions 2세대로 배포하려면 다음 명령어를 사용하세요.
# update color BG_COLOR=lavender # deploy the function that will not receive any traffic gcloud functions deploy gradual-rollouts-gcf \ --gen2 \ --runtime nodejs20 \ --entry-point helloHttp \ --source . \ --region $REGION \ --trigger-http \ --no-allow-unauthenticated \ --update-env-vars BG_COLOR=$BG_COLOR \ --tag $BG_COLOR
이제 gradual-rollouts-gcf 함수를 사용하도록 SERVICE_URL 환경 변수를 업데이트합니다.
SERVICE_URL=$(gcloud run services describe gradual-rollouts-gcf --platform managed --region $REGION --format 'value(status.url)')
이제 서비스를 컬합니다.
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
라벤더가 가장 최근에 배포된 버전이지만 베이지색이 표시됩니다.
<html><body style="background-color:beige;"><div><p>Hello from gradual-rollouts-gcf-24jan16-staging-2-00001-kop using color beige</p></div></body></html>
트래픽 0% 를 제공하는 버전 테스트
버전이 배포되었고 트래픽을 0% 제공하고 있는 것으로 확인되었다고 가정해 보겠습니다. 상태 점검을 통과했지만 이 버전에서 라벤더 배경색을 사용하고 있는지 확인해야 합니다.
라벤더 버전을 테스트하려면 해당 버전에 태그를 적용하면 됩니다. 태그를 지정하면 트래픽을 제공하지 않고도 특정 URL에서 새 버전을 직접 테스트할 수 있습니다.
먼저 해당 버전의 이미지 URL을 가져옵니다.
IMAGE_URL=$(gcloud run services describe gradual-rollouts-gcf --region $REGION --format 'value(IMAGE)')
이제 해당 이미지에 연결된 색상으로 태그를 지정하세요.
gcloud run deploy gradual-rollouts-gcf --image $IMAGE_URL --no-traffic --tag $BG_COLOR --region $REGION --no-allow-unauthenticated
다음과 비슷한 출력이 표시됩니다.
The revision can be reached directly at https://lavender---gradual-rollouts-gcf-k6msmyp47q-lz.a.run.app
이제 이 버전을 직접 컬할 수 있습니다.
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET <DIRECT_REVISION_URL>
결과에서 라벤더 색상이 표시됩니다.
<html><body style="background-color:lavender;"><div><p>Hello from gradual-rollouts-gcf-24jan16-00003-xik using color lavender</p></div></body></html>
점진적인 트래픽 증가
이제 라벤더 버전으로 트래픽을 전송할 수 있습니다. 아래 예는 트래픽의 1% 를 lavender로 전송하는 방법을 보여줍니다.
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=1
트래픽의 50% 를 lavender로 전송하려면 동일한 명령어를 사용하지만 대신 50% 를 지정하면 됩니다.
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=50
각 버전에서 발생하는 트래픽 양이 표시됩니다.
Traffic: 50% gradual-rollouts-gcf-00001-hos 50% gradual-rollouts-gcf-00004-mum lavender: https://lavender---gradual-rollouts-gcf-k6msmyp47q-uc.a.run.app
라벤더를 완전히 출시할 준비가 되면 라벤더를 100% 로 설정하여 비즈를 대체할 수 있습니다.
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=100
이제 gradual-rollouts-gcf 함수 서비스 URL을 방문하거나 curl하면
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
라벤더만 표시됩니다.
<html><body style="background-color:lavender;"><div><p>Hello gradual-rollouts-gcf-00004-mum</p></div></body></html>
5. 롤백
고객이 라벤더보다 비즈를 선호한다는 초기 UX 의견이 접수되어 비즈로 롤백해야 한다고 가정해 보겠습니다.
이 명령어를 실행하여 이전 버전 (베이지)으로 롤백할 수 있습니다.
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-revisions $BEIGE_REVISION=100
이제 curl을 실행하거나 함수 URL 엔드포인트를 방문하면
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
반환된 색상은 베이지색입니다.
<html><body style="background-color:beige;"><div><p>Hello gradual-rollouts-gcf-00001-hos</p></div></body></html>
롤백에 관한 자세한 내용은 문서를 참고하세요.
6. 축하합니다.
Codelab을 완료했습니다. 축하합니다.
출시, 롤백, 트래픽 이전에 관한 문서를 검토하는 것이 좋습니다.
학습한 내용
- Cloud Run 함수의 두 개 이상의 버전 간에 트래픽을 분할하는 방법
- 새 버전을 점진적으로 출시하는 방법
- 이전 버전으로 롤백하는 방법
7. 삭제
의도치 않은 청구를 방지하려면(예: 이 Cloud Run 함수가 무료 등급의 월간 Cloud Function 호출 할당량보다 더 많은 횟수로 실수로 호출된 경우) Cloud Run 함수를 삭제하거나 2단계에서 만든 프로젝트를 삭제하면 됩니다.
Cloud Run에 배포된 Cloud Run 함수를 삭제하려면 Cloud 콘솔의 Cloud Run(https://console.cloud.google.com/functions/)으로 이동하여 이 Codelab에서 만든 함수를 삭제합니다.
2세대 함수로 배포된 Cloud Run 함수를 삭제하려면 Cloud 콘솔의 Cloud Functions(https://console.cloud.google.com/functions/)로 이동하여 이 Codelab에서 만든 함수를 삭제합니다.
전체 프로젝트를 삭제하려면 https://console.cloud.google.com/cloud-resource-manager로 이동하여 2단계에서 만든 프로젝트를 선택하고 삭제를 선택합니다. 프로젝트를 삭제하면 Cloud SDK에서 프로젝트를 변경해야 합니다. gcloud projects list
를 실행하여 사용 가능한 모든 프로젝트 목록을 볼 수 있습니다.