การใช้การแก้ไขใน Cloud Run สําหรับการแยกการเข้าชม การเปิดใช้งานแบบค่อยเป็นค่อยไป และการย้อนกลับ

1. บทนำ

ภาพรวม

การแก้ไขใน Cloud Run ช่วยให้คุณระบุได้ว่าการแก้ไขใดควรได้รับการเข้าชม และควรส่งการเข้าชมกี่เปอร์เซ็นต์ไปยังการแก้ไขแต่ละรายการ การแก้ไขช่วยให้คุณย้อนกลับไปเป็นการแก้ไขก่อนหน้า ค่อยๆ เปิดตัวการแก้ไข และแยกการเข้าชมระหว่างการแก้ไขหลายรายการได้

Codelab นี้จะแสดงวิธีใช้รีวิชันเพื่อจัดการการรับส่งข้อมูลไปยังบริการ Cloud Run ดูข้อมูลเพิ่มเติมเกี่ยวกับการแก้ไขได้ในเอกสารประกอบ Cloud Run

สิ่งที่คุณจะได้เรียนรู้

  • วิธีแยกการรับส่งข้อมูลระหว่างรีวิชันตั้งแต่ 2 รายการขึ้นไปสำหรับบริการ Cloud Run
  • วิธีเปิดตัวการแก้ไขใหม่ทีละน้อย
  • วิธีย้อนกลับไปใช้การแก้ไขก่อนหน้า

2. การตั้งค่าและข้อกำหนด

ข้อกำหนดเบื้องต้น

  • คุณเข้าสู่ระบบ Cloud Console แล้ว
  • คุณเคยทำให้บริการ Cloud Run ใช้งานได้แล้ว เช่น คุณสามารถทำตามขั้นตอนการทำให้บริการ Cloud Run ใช้งานได้เพื่อเริ่มต้นใช้งาน

ตั้งค่าตัวแปรสภาพแวดล้อม

คุณตั้งค่าตัวแปรสภาพแวดล้อมที่จะใช้ตลอดทั้งโค้ดแล็บนี้ได้

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 แต่คุณก็ใช้รันไทม์ใดก็ได้

ตั้งค่าตัวแปรสภาพแวดล้อม

คุณตั้งค่าตัวแปรสภาพแวดล้อมที่จะใช้ตลอดทั้งโค้ดแล็บนี้ได้

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"]

สร้างอิมเมจใน Artifact Registry โดยใช้ Buildpack โดยใช้ Cloud Build ดังนี้

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

และทำให้รีวิชันแรกใช้งานได้กับ Cloud Run ด้วยสี DarkSeaGreen

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

หากต้องการทดสอบบริการ คุณสามารถเปิดปลายทางในเว็บเบราว์เซอร์โดยตรงเพื่อดูสีพื้นหลังเป็นสีเขียวทะเลเข้ม

ตอนนี้ให้ติดตั้งใช้งานการแก้ไขครั้งที่ 2 โดยใช้สีพื้นหลังเป็นสีแทน

# 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 ที่เกี่ยวข้อง คุณดูรหัสการแก้ไขได้โดยเรียกใช้คำสั่งนี้

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

คุณควรเห็นผลลัพธ์ที่คล้ายกับผลลัพธ์ด้านล่าง

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

คุณแยกการเข้าชม 50/50 ระหว่างการแก้ไข 2 รายการได้โดยเรียกใช้คำสั่งต่อไปนี้กับการแก้ไขของคุณ

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 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 จะตั้งค่าการเข้าชม 100% เป็นรีวิชันที่มีแฟล็ก latest การระบุด้วยตนเองว่าการแก้ไขปัจจุบันสีเบจควรได้รับการเข้าชมทั้งหมดจะทำให้การแก้ไขที่มี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 นี้เสร็จสมบูรณ์

เราขอแนะนำให้อ่านเอกสารเกี่ยวกับการเปิดตัว การย้อนกลับ และการย้ายข้อมูลการเข้าชม

สิ่งที่เราได้พูดถึง

  • วิธีแยกการรับส่งข้อมูลระหว่างรีวิชันตั้งแต่ 2 รายการขึ้นไปสำหรับบริการ Cloud Run
  • วิธีเปิดตัวการแก้ไขใหม่ทีละน้อย
  • วิธีย้อนกลับไปใช้การแก้ไขก่อนหน้า

7. ล้างข้อมูล

หากต้องการหลีกเลี่ยงการเรียกเก็บเงินโดยไม่ตั้งใจ (เช่น หากฟังก์ชัน Cloud Run นี้ได้รับการเรียกใช้โดยไม่ตั้งใจมากกว่าการจัดสรรการเรียกใช้ Cloud Run รายเดือนในระดับฟรี) คุณสามารถลบบริการ Cloud Run หรือลบโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 ก็ได้

หากต้องการลบบริการ Cloud Run ให้ไปที่ Cloud Run ใน Cloud Console ที่ https://console.cloud.google.com/run/ แล้วลบฟังก์ชันที่คุณสร้างในโค้ดแล็บนี้

หากเลือกที่จะลบทั้งโปรเจ็กต์ ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager เลือกโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 แล้วเลือก "ลบ" หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณดูรายการโปรเจ็กต์ทั้งหมดที่พร้อมใช้งานได้โดยเรียกใช้ gcloud projects list