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

1. บทนำ

ภาพรวม

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

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

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

  • วิธีแยกการรับส่งข้อมูลระหว่างการแก้ไขตั้งแต่ 2 รายการขึ้นไปสำหรับฟังก์ชัน 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

เครื่องเสมือนนี้โหลดเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่จำเป็นไว้แล้ว โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานส่วนใหญ่หรือทั้งหมดใน Codelab นี้ได้ด้วยเบราว์เซอร์

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นว่าคุณได้รับการตรวจสอบสิทธิ์และระบบได้ตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์ของคุณ

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

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

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

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen

สร้างฟังก์ชัน

ก่อนอื่นให้สร้างไดเรกทอรีสำหรับซอร์สโค้ดและใช้คำสั่ง cd เพื่อไปยังไดเรกทอรีนั้น

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

หากต้องการทดสอบฟังก์ชัน คุณสามารถใช้ curl กับปลายทางที่มีอยู่เพื่อดูสี darkseagreen ใน HTML หรือใช้เบราว์เซอร์เพื่อเข้าถึงปลายทางโดยตรงเพื่อดูสีพื้นหลัง

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

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

หากต้องการทำให้ฟังก์ชัน 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 กับปลายทาง คุณจะเห็นสีพื้นหลังเป็นสีแทน

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

แยกการเข้าชม 50-50

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

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 ระหว่างการแก้ไข 2 รายการได้โดยเรียกใช้คำสั่งต่อไปนี้

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 Function ใหม่

ก่อนอื่น ให้ตั้งค่าสีพื้นหลังเป็น 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

สมมติว่าเราต้องการทยอยเปิดตัวการแก้ไขใหม่ที่มีสีพื้นหลังเป็นสีลาเวนเดอร์

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

ตอนนี้ให้อัปเดตตัวแปรสภาพแวดล้อม SERVICE_URL เพื่อใช้ฟังก์ชัน gradual-rollouts-gcf

SERVICE_URL=$(gcloud run services describe gradual-rollouts-gcf --platform managed --region $REGION --format 'value(status.url)')

และตอนนี้เมื่อคุณใช้ curl กับบริการ

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 กับการแก้ไขนี้ได้โดยตรง

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% ไปยังลาเวนเดอร์

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

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

และตอนนี้เมื่อคุณเข้าชมหรือใช้ cURL กับ URL ของบริการฟังก์ชัน gradual-rollouts-gcf

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 นี้เสร็จสมบูรณ์

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

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

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

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

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

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

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

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