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

1. 소개

개요

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

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

학습할 내용

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

2. 설정 및 요구사항

기본 요건

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

Cloud Shell 활성화

  1. Cloud Console에서 Cloud Shell 활성화d1264ca30785e435.png를 클릭합니다.

cb81e7c8e34bc8d.png

Cloud Shell을 처음 시작하는 경우 Cloud Shell에 대한 설명이 포함된 중간 화면이 표시됩니다. 중간 화면이 표시되면 계속을 클릭합니다.

d95252b003979716.png

Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.

7833d5e1c5d18f54.png

이 가상 머신에는 필요한 모든 개발 도구가 로드되어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저만으로도 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 설정된 것을 확인할 수 있습니다.

  1. 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`
  1. 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를 실행하여 사용 가능한 모든 프로젝트 목록을 볼 수 있습니다.