พัฒนาสู่ผลิตภัณฑ์ใน 3 ขั้นตอนง่ายๆ ด้วย Cloud Run

1. บทนำ

ทำไมการจัดการแอปพลิเคชันจึงยาก

เหตุผลสำคัญประการหนึ่งคือ นักพัฒนาแอปมักต้องเป็นผู้ดูแลระบบแบบพาร์ทไทม์ โปรดพิจารณารายการข้อกังวล (บางส่วน) นี้เพื่อพัฒนา ปรับใช้ และจัดการเว็บแอปพลิเคชันระดับการใช้งานจริงที่ทันสมัย

4d018476b4a73b47.png

ฉันไม่รู้ว่าคุณเป็นยังไง แต่สิ่งเหล่านี้เป็นสิ่งที่ฉันไม่อยากกังวลเลย สิ่งที่ฉันอยากจะคิดจริงๆ คือตรรกะของแอปพลิเคชัน

6dfd143d20e5548b.png

กล่าวโดยสรุปคือ Cloud Run มีไว้เพื่อให้คุณมุ่งเน้นที่แอปของคุณ และปล่อยให้การดูแลระบบและการบำรุงรักษาทั้งหมดเป็นหน้าที่ของผู้อื่น ซึ่งก็คือ Google ที่ได้ลงทุนเวลาหลายล้านชั่วโมงในการปรับปรุงและพัฒนาทักษะในโดเมนนี้ให้สมบูรณ์แบบ

นอกจากความท้าทายด้านการดูแลระบบที่กล่าวมาข้างต้นแล้ว คุณยังต้องรับมือกับสิ่งต่อไปนี้ด้วย

  • การขึ้นต่อกัน - สภาพแวดล้อมที่แอปของคุณทํางานควรตรงกับสภาพแวดล้อมที่ใช้ทดสอบแอปอย่างแม่นยําทุกประการ หากเป็นไปได้ ซึ่งอาจครอบคลุมหลายมิติ รวมถึงระบบปฏิบัติการ ไลบรารีสนับสนุน ตัวแปลภาษาหรือคอมไพเลอร์ การกำหนดค่าฮาร์ดแวร์ และปัจจัยอื่นๆ อีกมากมาย
  • การเผยแพร่ - การเปลี่ยนจากแอปที่ใช้งานในเครื่องไปเป็นแอปที่แชร์อย่างกว้างขวางบนอินเทอร์เน็ตมักต้องมีการเปลี่ยนแปลงสภาพแวดล้อมรันไทม์ ความซับซ้อนที่เพิ่มขึ้นอย่างมาก และเส้นโค้งการเรียนรู้ที่สูงชัน

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

สิ่งที่คุณต้องทำ...

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

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

  • วิธีสร้างแอปเว็บเซิร์ฟเวอร์แบบง่ายใน Python
  • วิธีแพ็กเกจแอปเป็นคอนเทนเนอร์ Docker ที่ทำงานได้ทุกที่
  • วิธีทำให้แอปใช้งานได้ในระบบคลาวด์เพื่อให้ทุกคนได้ลองใช้ผลงานใหม่ของคุณ
  • วิธีทำให้ขั้นตอนข้างต้นง่ายขึ้นไปอีกโดยใช้ Buildpack
  • วิธีใช้เครื่องมือบรรทัดคำสั่งของ Google Cloud และ UI ทางเว็บของ Cloud Console

สิ่งที่คุณต้องมี...

  • เว็บเบราว์เซอร์
  • บัญชี Google

แล็บนี้มีไว้สำหรับนักพัฒนาแอปทุกระดับ รวมถึงผู้เริ่มต้น แม้ว่าคุณจะใช้ Python แต่คุณไม่จำเป็นต้องคุ้นเคยกับการเขียนโปรแกรม Python เพื่อทำความเข้าใจสิ่งที่เกิดขึ้น เนื่องจากเราจะอธิบายโค้ดทั้งหมดที่คุณใช้

2. เตรียมตัว

5110b5081a1e1c49.png

ส่วนนี้ครอบคลุมทุกสิ่งที่คุณต้องทำเพื่อเริ่มต้นใช้งานแล็บนี้

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี)

96a9c957bc475304.pngb9a10ebdf5b5a448.pnga1e3c01a38fa61c2.png

โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้

  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud

การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่ม Cloud Shell

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

704a7b7491bd157.png

เปิดใช้งาน Cloud Shell

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell 4292cbf4971c9786.png

bce75f34b2c53987.png

หากไม่เคยเริ่มใช้ Cloud Shell มาก่อน คุณจะเห็นหน้าจอระดับกลาง (ครึ่งหน้าล่าง) ที่อธิบายว่า Cloud Shell คืออะไร ในกรณีนี้ ให้คลิกต่อไป (และคุณจะไม่เห็นหน้าจอนี้อีก) หน้าจอแบบครั้งเดียวจะมีลักษณะดังนี้

70f315d7b402b476.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน

fbe3a0674c982259.png

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

เมื่อเชื่อมต่อกับ 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].

ตั้งค่าตัวแปรสภาพแวดล้อมบางอย่างในเทอร์มินัลที่จะช่วยให้ขั้นตอนต่อๆ ไปง่ายขึ้น

export PROJ=$GOOGLE_CLOUD_PROJECT 
export APP=hello 
export PORT=8080
export REGION="us-central1"
export TAG="gcr.io/$PROJ/$APP"

เปิดใช้ API

ในขั้นตอนต่อๆ ไป คุณจะเห็นว่าบริการเหล่านี้จำเป็นต้องใช้ที่ใด (และเพราะเหตุใด) แต่ตอนนี้ ให้เรียกใช้คำสั่งนี้เพื่อให้โปรเจ็กต์เข้าถึงบริการ Cloud Build, Container Registry และ Cloud Run ได้

gcloud services enable cloudbuild.googleapis.com         \
                       containerregistry.googleapis.com  \
                       run.googleapis.com          

ซึ่งควรจะแสดงข้อความว่าดำเนินการสำเร็จคล้ายกับข้อความต่อไปนี้

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. สร้างเว็บแอปอย่างง่าย

eef530b56b8e93a3.png

เริ่มต้นโดยคลิกปุ่ม Open Editor ที่ด้านบนของแผง Cloud Shell ซึ่งจะมีลักษณะดังนี้

9b81c8a37a6bcdd8.png

จากนั้นคุณจะอยู่ในสภาพแวดล้อม IDE ที่คล้ายกับ Visual Studio Code ซึ่งคุณสามารถสร้างโปรเจ็กต์ แก้ไขซอร์สโค้ด เรียกใช้โปรแกรม ฯลฯ หากหน้าจอแคบเกินไป คุณสามารถขยายหรือย่อเส้นแบ่งระหว่างคอนโซลกับหน้าต่างแก้ไข/เทอร์มินัลได้โดยการลากแถบแนวนอนระหว่าง 2 ภูมิภาคนี้ ซึ่งไฮไลต์ไว้ที่นี่

8dea35450851af53.png

คุณสามารถสลับไปมาระหว่างตัวแก้ไขกับเทอร์มินัลได้โดยคลิกปุ่ม Open Editor และ Open Terminal ตามลำดับ ตอนนี้ลองสลับไปมาระหว่าง 2 สภาพแวดล้อมนี้

จากนั้นสร้างโฟลเดอร์เพื่อจัดเก็บงานสำหรับแล็บนี้โดยเลือก File->New Folder ป้อน hello แล้วคลิก OK ไฟล์ทั้งหมดที่คุณสร้างในแล็บนี้และงานทั้งหมดที่คุณทำใน Cloud Shell จะอยู่ในโฟลเดอร์นี้

ตอนนี้ให้สร้างไฟล์ requirements.txt ซึ่งจะบอก Python ว่าแอปของคุณขึ้นอยู่กับไลบรารีใด สำหรับเว็บแอปแบบง่ายนี้ คุณจะใช้โมดูล Python ยอดนิยมสำหรับสร้างเว็บเซิร์ฟเวอร์ที่ชื่อ Flask และเฟรมเวิร์กเว็บเซิร์ฟเวอร์ที่ชื่อ gunicorn ในหน้าต่าง Cloud Editor ให้คลิกเมนู File->New File เพื่อสร้างไฟล์ใหม่ เมื่อระบบแจ้งให้ตั้งชื่อไฟล์ใหม่ ให้ป้อน requirements.txt แล้วกดปุ่ม OK ตรวจสอบว่าไฟล์ใหม่อยู่ในโฟลเดอร์โปรเจ็กต์ hello

ป้อนบรรทัดต่อไปนี้ในไฟล์ใหม่เพื่อระบุว่าแอปของคุณขึ้นอยู่กับแพ็กเกจ Flask ของ Python และเว็บเซิร์ฟเวอร์ gunicorn

Flask
gunicorn

คุณไม่จำเป็นต้องบันทึกไฟล์นี้อย่างชัดเจนเนื่องจาก Cloud Editor จะบันทึกการเปลี่ยนแปลงให้คุณโดยอัตโนมัติ

เวอร์ชัน 1: สวัสดีชาวโลก

สร้างไฟล์ใหม่ขึ้นมาอีกไฟล์หนึ่งชื่อ main.py โดยใช้เทคนิคเดียวกัน ซึ่งจะเป็นไฟล์ต้นฉบับ Python หลัก (และไฟล์เดียว) ของแอป และอย่าลืมตรวจสอบว่าไฟล์ใหม่นั้นอยู่ในhelloโฟลเดอร์โปรเจ็กต์

แทรกโค้ดต่อไปนี้ลงในไฟล์นี้

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

กลับไปที่เทอร์มินัลแล้วเปลี่ยนเป็นโฟลเดอร์โปรเจ็กต์ด้วยคำสั่งนี้

cd hello

เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งทรัพยากร Dependency ของโปรเจ็กต์

pip3 install -r requirements.txt

ตอนนี้ให้เปิดแอปโดยเรียกใช้คำสั่งนี้ในเทอร์มินัล

python3 main.py

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

คลิกปุ่ม web preview แล้วคลิกรายการเมนู Preview on Port 8080 ดังนี้

fe45e0192080efd6.png

ซึ่งจะเป็นการเปิดแท็บเว็บเบราว์เซอร์ไปยังแอปที่กําลังทํางานอยู่ ซึ่งควรมีลักษณะดังนี้

b1f06501509aefb9.png

เวอร์ชัน 2: แสดงเส้นทาง URL

กลับไปที่ Cloud Editor (ผ่านปุ่ม Open Editor) แล้วเพิ่มการรองรับการแสดงคำต่อท้าย URL ที่ไม่บังคับโดยการอัปเดตไฟล์ main.py ดังนี้

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])     # ← NEW
def say_hello(name="world"):               # ← MODIFIED
    html = f"<h1>Hello {name}!</h1>"       # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

สลับกลับไปที่เทอร์มินัล (ผ่านปุ่ม Open Terminal) แล้วป้อน control-C (กดปุ่มควบคุมค้างไว้ขณะกด "C") เพื่อหยุดแอปที่กำลังทำงาน แล้วรีสตาร์ทโดยป้อนคำสั่งต่อไปนี้

python3 main.py

อีกครั้ง ให้คลิกปุ่ม web preview แล้วคลิกรายการเมนู Preview on Port 8080 เพื่อเปิดแท็บเว็บเบราว์เซอร์ไปยังแอปที่กำลังทำงานอยู่ คุณควรเห็นข้อความ "Hello world!" อีกครั้ง แต่ตอนนี้ให้แทนที่ข้อความ URL ที่อยู่หลังเครื่องหมายทับด้วยสตริงที่คุณเลือก (เช่น /your-name) และตรวจสอบว่าคุณเห็นข้อความคล้ายกับข้อความต่อไปนี้

93b87996f88fa370.png

เวอร์ชัน 3: สีแบบสุ่ม

ตอนนี้ให้เพิ่มการรองรับสีพื้นหลังแบบสุ่มโดยกลับไปที่ Cloud Editor (ผ่านปุ่ม Open Editor) แล้วอัปเดตไฟล์ main.py ดังนี้

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# This function decides whether foreground text should be
# displayed in black or white, to maximize fg/bg contrast.
def set_text_color(rgb):                      # ← NEW
    sum = round(                              # ← NEW
        (int(rgb[0]) * 0.299)                 # ← NEW
        + (int(rgb[1]) * 0.587)               # ← NEW
        + (int(rgb[2]) * 0.114)               # ← NEW
    )                                         # ← NEW
    return "black" if sum > 186 else "white"  # ← NEW


# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
# To verify each new invocation of these requests, the HTML document
# includes CSS styling to produce a randomly colored background.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])
def say_hello(name="world"):
    bg = random.sample(range(1, 255), 3)                       # ← NEW
    hex = (int(bg[0]) * 256) + (int(bg[1]) * 16) + int(bg[2])  # ← NEW
    fg_color = set_text_color(bg)                              # ← NEW
    bg_color = f"#{hex:06x}"                                   # ← NEW
    style = f"color:{fg_color}; background-color:{bg_color}"   # ← NEW
    html = f'<h1 style="{style}">Hello {name}!</h1>'           # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

สลับกลับไปที่เทอร์มินัล (ผ่านปุ่ม Open Terminal) แล้วป้อน control-C (กดปุ่มควบคุมค้างไว้ขณะกด "C") เพื่อหยุดแอปที่กำลังทำงาน แล้วรีสตาร์ทโดยป้อนคำสั่งต่อไปนี้

python3 main.py

อีกครั้ง ให้คลิกปุ่ม web preview แล้วคลิกรายการเมนู Preview on Port 8080 เพื่อเปิดแท็บเว็บเบราว์เซอร์ไปยังแอปที่กำลังทำงานอยู่ คุณควรเห็นข้อความที่สร้างขึ้นพร้อมด้วยคำต่อท้ายที่ระบุหรือสตริง "Hello world!" ค่าเริ่มต้น ซึ่งแสดงอยู่ด้านหน้าพื้นหลังที่มีสีแบบสุ่ม ดังนี้

baf8d028f15ea7f4.png

โหลดหน้าเว็บซ้ำ 2-3 ครั้งเพื่อดูว่าสีพื้นหลังแบบสุ่มจะเปลี่ยนทุกครั้งที่คุณเข้าชมแอป

เพียงเท่านี้ก็เสร็จสิ้นแล้ว ขอแสดงความยินดีด้วย ในขั้นตอนถัดไป คุณจะได้เรียนรู้วิธีแพ็กเกจแอปเป็นคอนเทนเนอร์ และเหตุผลที่การทำเช่นนี้มีประโยชน์

4. สร้างคอนเทนเนอร์ให้แอป

17cc234ec3325a8a.png

คอนเทนเนอร์คืออะไร

โดยทั่วไปแล้ว คอนเทนเนอร์และโดยเฉพาะอย่างยิ่ง Docker ช่วยให้เราสร้างกล่องแบบแยกส่วนเพื่อเรียกใช้แอปพลิเคชันพร้อมกับการอ้างอิงทั้งหมดที่รวมไว้ด้วยกันได้ เราเรียกผลลัพธ์นี้ว่าอิมเมจคอนเทนเนอร์ ในส่วนนี้ คุณจะสร้างอิมเมจคอนเทนเนอร์ซึ่งจะใช้เพื่อห่อหุ้มแอปพลิเคชันและทรัพยากร Dependency ทั้งหมด

เมื่อพูดถึงการขึ้นต่อกัน ในขั้นตอนก่อนหน้านี้ เมื่อคุณเรียกใช้แอปในสภาพแวดล้อมของนักพัฒนาแอป คุณต้องเรียกใช้ pip3 install -r requirements.txt และตรวจสอบว่าไฟล์ requirements.txt มีไลบรารีที่ขึ้นต่อกันทั้งหมดและเวอร์ชันที่เกี่ยวข้อง เมื่อใช้คอนเทนเนอร์ คุณจะติดตั้งข้อกำหนดเหล่านั้นเมื่อสร้างอิมเมจคอนเทนเนอร์ ดังนั้นผู้ใช้คอนเทนเนอร์จึงไม่ต้องกังวลเรื่องการติดตั้ง

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

คอนเทนเนอร์ช่วยให้แอปพลิเคชันของคุณมีลักษณะดังนี้

  • ทำซ้ำได้ - คอนเทนเนอร์มีทุกอย่างครบถ้วนในตัว
  • พกพาได้ - คอนเทนเนอร์เป็นบล็อกการสร้างข้ามอุตสาหกรรม ซึ่งช่วยให้แอปพลิเคชันสามารถพกพาได้ในผู้ให้บริการระบบคลาวด์และสภาพแวดล้อมต่างๆ

กล่าวโดยย่อคือ คอนเทนเนอร์ช่วยให้คุณ "เขียนครั้งเดียวและเรียกใช้ได้ทุกที่" ข้อยกเว้นหนึ่งของกฎดังกล่าวคือคอนเทนเนอร์ที่สร้างขึ้นจะจำกัดให้ทำงานบนประเภทโปรเซสเซอร์ที่คุณสร้างคอนเทนเนอร์นั้น แต่ก็มีวิธีสร้างเวอร์ชันคอนเทนเนอร์สำหรับการกำหนดค่าฮาร์ดแวร์อื่นๆ ด้วยเช่นกัน

พอแล้ว มาสร้างคอนเทนเนอร์กันเลย คุณจะต้องใช้เทคโนโลยีเฉพาะในการสร้างคอนเทนเนอร์ที่เรียกว่า Docker

สร้างไฟล์ใหม่ชื่อ Dockerfile ใน Cloud Editor ไฟล์นี้เป็นพิมพ์เขียวสำหรับการสร้างรูปภาพ โดยจะบอก Docker เกี่ยวกับสภาพแวดล้อมการทำงานและซอร์สโค้ด วิธีติดตั้งทรัพยากร Dependency สร้างแอป และเรียกใช้โค้ด

# Use an official lightweight Python image.
FROM python:3.9-slim

# Copy local code to the container image.
WORKDIR /app
COPY main.py .
COPY requirements.txt .

# Install dependencies into this container so there's no need to 
# install anything at container run time.
RUN pip install -r requirements.txt

# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 8080

# Run the web service on container startup. Here you use the gunicorn
# server, with one worker process and 8 threads. For environments 
# with multiple CPU cores, increase the number of workers to match 
# the number of cores available.
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 main:app

ใน Cloud Terminal ให้สร้างอิมเมจคอนเทนเนอร์โดยใช้ Cloud Build โดยการเรียกใช้คำสั่งต่อไปนี้

gcloud builds submit --tag $TAG

เมื่อพุชไปยังรีจิสทรีแล้ว คุณจะเห็นSUCCESSข้อความที่มีชื่ออิมเมจ ซึ่งควรมีลักษณะดังนี้ gcr.io/<project-id>/hello ตอนนี้ระบบจัดเก็บอิมเมจไว้ใน Google Container Registry แล้ว และคุณสามารถนำกลับมาใช้ใหม่ได้ทุกเมื่อและทุกที่ที่ต้องการ

คุณแสดงรายการอิมเมจคอนเทนเนอร์ทั้งหมดที่เชื่อมโยงกับโปรเจ็กต์ปัจจุบันได้โดยใช้คำสั่งต่อไปนี้

gcloud container images list

ตอนนี้ให้เรียกใช้และทดสอบแอปพลิเคชันในเครื่องจาก Cloud Shell โดยใช้คำสั่ง docker นี้

docker run -p $PORT:$PORT -e PORT=$PORT $TAG

-p $PORT:$PORT ตัวเลือกจะบอกให้ Docker แมปพอร์ตภายนอก $PORT (ตั้งค่าเป็น 8080 ด้านบน) ในสภาพแวดล้อมของโฮสต์ไปยังหมายเลขพอร์ตเดียวกันภายในคอนเทนเนอร์ที่กำลังทำงาน ซึ่งจะช่วยให้การทำงานง่ายขึ้นเนื่องจากโค้ดเซิร์ฟเวอร์ที่คุณเขียนและหมายเลขพอร์ตภายนอกที่คุณเชื่อมต่อเมื่อทดสอบแอปจะเป็นหมายเลขเดียวกัน (8080) แต่คุณก็สามารถใช้ตัวเลือก -p เพื่อแมปพอร์ตภายนอกที่กำหนดเองบนโฮสต์กับพอร์ตภายในที่ต้องการภายในคอนเทนเนอร์ได้อย่างง่ายดายเช่นกัน

ตัวเลือก -e PORT=$PORT จะบอกให้ Docker ทำให้ตัวแปรสภาพแวดล้อม $PORT (ตั้งค่าเป็น 8080 ด้านบน) พร้อมใช้งานสำหรับแอปที่ทำงานภายในคอนเทนเนอร์

ตอนนี้คุณพร้อมที่จะทดสอบแอปแล้วโดยชี้เว็บเบราว์เซอร์ไปยังโค้ด Python ที่ทำงานภายในคอนเทนเนอร์ ในหน้าต่าง Cloud Shell ให้คลิกไอคอน "ตัวอย่างเว็บ" แล้วเลือก "แสดงตัวอย่างบนพอร์ต 8080" เหมือนกับที่ทำในขั้นตอนก่อนหน้า

ผลลัพธ์ที่ได้ควรจะคุ้นเคย คุณควรเห็นข้อความที่สร้างขึ้นอยู่ด้านหน้าพื้นหลังที่มีสีแบบสุ่ม เช่นเดียวกับตอนที่คุณเรียกใช้แอปโดยตรงในเทอร์มินัล Cloud Shell โหลดหน้าเว็บซ้ำ 2-3 ครั้งเพื่อดูว่าสีพื้นหลังแบบสุ่มจะเปลี่ยนทุกครั้งที่คุณเข้าชมแอป

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

5. ไปยังระบบคลาวด์...

1b0665d94750ded6.gif

เมื่อสร้างคอนเทนเนอร์แอปแล้ว คุณคงอยากแชร์ความยอดเยี่ยมนี้กับคนทั่วโลก ดังนั้นถึงเวลาที่จะทำให้แอปใช้งานได้ในระบบคลาวด์แล้ว แต่คุณอยากทำอะไรมากกว่าแค่แชร์ คุณต้องการตรวจสอบว่า

  • ทำงานได้อย่างน่าเชื่อถือ - คุณจะได้รับการทำงานแบบทนต่อข้อผิดพลาดโดยอัตโนมัติในกรณีที่คอมพิวเตอร์ที่เรียกใช้แอปขัดข้อง
  • ปรับขนาดโดยอัตโนมัติ - แอปจะรองรับปริมาณการเข้าชมจำนวนมาก และลดร่องรอยโดยอัตโนมัติเมื่อไม่ได้ใช้งาน
  • ลดต้นทุนโดยไม่เรียกเก็บเงินสำหรับทรัพยากรที่คุณไม่ได้ใช้ โดยจะเรียกเก็บเงินเฉพาะทรัพยากรที่ใช้ในขณะที่ตอบสนองต่อการเข้าชมเท่านั้น
  • เข้าถึงได้ผ่านชื่อโดเมนที่กำหนดเอง - คุณมีสิทธิ์เข้าถึงโซลูชันแบบคลิกเดียวเพื่อกำหนดชื่อโดเมนที่กำหนดเองให้กับบริการ
  • มีเวลาตอบสนองที่ยอดเยี่ยม - Cold Start ตอบสนองได้ดีพอสมควร แต่คุณสามารถปรับแต่งได้โดยการระบุการกำหนดค่าอินสแตนซ์ขั้นต่ำ
  • รองรับการเข้ารหัสจากต้นทางถึงปลายทางโดยใช้การรักษาความปลอดภัยบนเว็บ SSL/TLS มาตรฐาน - เมื่อคุณติดตั้งใช้งานบริการ คุณจะได้รับการเข้ารหัสเว็บมาตรฐานและใบรับรองที่จำเป็นที่เกี่ยวข้องโดยอัตโนมัติและไม่มีค่าใช้จ่าย

การติดตั้งใช้งานแอปใน Google Cloud Run จะช่วยให้คุณได้รับสิทธิประโยชน์ทั้งหมดข้างต้นและอื่นๆ อีกมากมาย

ติดตั้งใช้งานแอปใน Cloud Run

ก่อนอื่น มาแก้ไขแอปเพื่อให้คุณแยกความแตกต่างระหว่างการแก้ไขใหม่กับการแก้ไขเก่าได้ โดยแก้ไขไฟล์ main.py เพื่อให้ข้อความเริ่มต้นเปลี่ยนจาก "Hello world!" เป็น "Hello from Cloud Run!" กล่าวคือ เปลี่ยนบรรทัดนี้ใน main.py จาก

def say_hello(name="world"):

เป็น

def say_hello(name="from Cloud Run"):

Cloud Run เป็นบริการระดับภูมิภาค ซึ่งหมายความว่าโครงสร้างพื้นฐานที่เรียกใช้บริการ Cloud Run จะอยู่ในภูมิภาคที่เฉพาะเจาะจงและได้รับการจัดการโดย Google เพื่อให้พร้อมใช้งานซ้ำซ้อนในทุกโซนภายในภูมิภาคนั้น ในส่วน "เริ่มต้นใช้งาน" ด้านบน คุณได้กำหนดภูมิภาคเริ่มต้นผ่านตัวแปรสภาพแวดล้อม REGION

สร้างอิมเมจคอนเทนเนอร์ใหม่และทำให้แอปพลิเคชันที่สร้างโดยใช้คอนเทนเนอร์ใช้งานได้ใน Cloud Run ด้วยคำสั่งต่อไปนี้

gcloud builds submit --tag $TAG
gcloud run deploy "$APP"   \
  --image "$TAG"           \
  --platform "managed"     \
  --region "$REGION"       \
  --allow-unauthenticated
  • นอกจากนี้ คุณยังกำหนดภูมิภาคเริ่มต้นด้วย gcloud config set run/region $REGION ได้ด้วย
  • ตัวเลือก --allow-unauthenticated จะทำให้บริการพร้อมให้บริการแก่สาธารณะ โปรดใช้ --no-allow-unauthenticated แทนเพื่อหลีกเลี่ยงคำขอที่ไม่ผ่านการตรวจสอบสิทธิ์

รูปภาพที่ระบุที่นี่คือรูปภาพ Docker ที่คุณสร้างในขั้นตอนสุดท้าย บริการ Cloud Run จะค้นหาและทำให้ใช้งานได้สำหรับคุณได้เนื่องจากบริการ Cloud Build จัดเก็บอิมเมจผลลัพธ์ไว้ใน Google Container Registry

โปรดรอสักครู่จนกว่าการติดตั้งใช้งานจะเสร็จสมบูรณ์ เมื่อสำเร็จ บรรทัดคำสั่งจะแสดง URL ของบริการดังนี้

Deploying container to Cloud Run service [hello] in project [PROJECT_ID...
✓ Deploying new service... Done.                                   
  ✓ Creating Revision... Revision deployment finished. Waiting for health check...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [hello] revision [hello-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-....a.run.app

นอกจากนี้ คุณยังดึง URL ของบริการด้วยคำสั่งนี้ได้ด้วย

gcloud run services describe hello  \
  --platform managed                \
  --region $REGION                  \
  --format "value(status.url)"

ซึ่งควรแสดงผลดังนี้

https://hello-....a.run.app

ลิงก์นี้เป็น URL เฉพาะที่มีความปลอดภัย TLS สำหรับบริการ Cloud Run ลิงก์นี้จะคงอยู่ถาวร (ตราบใดที่คุณไม่ได้ปิดใช้บริการ) และใช้ได้ทุกที่บนอินเทอร์เน็ต โดยจะไม่ใช้กลไกพร็อกซีของ Cloud Shell ที่กล่าวถึงก่อนหน้านี้ ซึ่งขึ้นอยู่กับเครื่องเสมือนชั่วคราว

คลิก Service URL ที่ไฮไลต์เพื่อเปิดแท็บเว็บเบราว์เซอร์ไปยังแอปที่กำลังทำงานอยู่ ผลลัพธ์ควรแสดงข้อความ "สวัสดีจาก Cloud Run!" ที่ด้านหน้าของพื้นหลังที่มีสีแบบสุ่ม

ยินดีด้วย ตอนนี้แอปของคุณทำงานในระบบคลาวด์ของ Google แล้ว แอปของคุณจะพร้อมให้บริการแก่สาธารณะโดยไม่ต้องคิดอะไรมาก มีการเข้ารหัส TLS (HTTPS) และการปรับขนาดอัตโนมัติเพื่อรองรับการเข้าชมในระดับที่น่าทึ่ง

แต่ฉันคิดว่ากระบวนการนี้อาจง่ายขึ้นได้อีก...

6. สร้างคอนเทนเนอร์โดยอัตโนมัติ

ทั้งหมดนี้ดูน่าสนใจมาก แต่จะเกิดอะไรขึ้นหากฉันไม่ต้องการแม้แต่จะคิดถึง Dockerfile และคอนเทนเนอร์ จะเกิดอะไรขึ้นหากฉันต้องการมุ่งเน้นที่การเขียนโค้ดของแอปพลิเคชันและปล่อยให้คนอื่นกังวลเรื่องการทำคอนเทนเนอร์เหมือนกับนักพัฒนาแอปส่วนใหญ่ คุณโชคดีเพราะ Cloud Run รองรับมาตรฐานโอเพนซอร์สที่เรียกว่า Buildpacks ซึ่งมีไว้เพื่อเหตุผลนี้โดยเฉพาะ นั่นคือการทำให้กระบวนการสร้างคอนเทนเนอร์จากชุดไฟล์ต้นฉบับเป็นไปโดยอัตโนมัติ

โปรดทราบว่าในบางกรณี นักพัฒนาแอปอาจต้องการใช้ Dockerfile ที่ชัดเจน เช่น หากต้องการปรับแต่งวิธีสร้างคอนเทนเนอร์ในระดับสูง แต่สำหรับกรณีทั่วไป เช่น การออกกำลังกายนี้ Buildpack จะทำงานได้ดีและไม่จำเป็นต้องสร้าง Dockerfile ด้วยตนเอง มาแก้ไขโค้ดเพื่อใช้ Buildpack กัน

ก่อนอื่น มาแก้ไขแอปเพื่อให้คุณแยกความแตกต่างระหว่างการแก้ไขใหม่กับการแก้ไขเก่าได้ โดยแก้ไขไฟล์ main.py เพื่อให้ข้อความเริ่มต้นเปลี่ยนจาก "สวัสดีจาก Cloud Run!" เป็น "สวัสดีจาก Cloud Run ที่มี Buildpacks!" กล่าวคือ เปลี่ยนบรรทัดนี้ใน main.py จาก

def say_hello(name="from Cloud Run"):

เป็น

def say_hello(name="from Cloud Run with Buildpacks"):

ตอนนี้มาใช้ประโยชน์จาก Buildpack กันโดยสร้างไฟล์ใหม่ชื่อ Procfile สร้างไฟล์ใน Cloud Editor แล้วแทรกข้อความ 1 บรรทัดนี้

web: python3 main.py

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

gcloud beta run deploy "$APP"  \
    --source .                 \
    --platform "managed"       \
    --region "$REGION"         \
    --allow-unauthenticated

ซึ่งคล้ายกับคำสั่งที่คุณเรียกใช้เพื่อติดตั้งใช้งานแอปในขั้นตอนสุดท้าย แต่ครั้งนี้คุณได้แทนที่ตัวเลือก --image ด้วยตัวเลือก --source . ซึ่งจะบอกคำสั่ง gcloud ว่าคุณต้องการให้ใช้ Buildpack เพื่อสร้างอิมเมจคอนเทนเนอร์ตามไฟล์ต้นฉบับที่พบในไดเรกทอรีปัจจุบัน (dot ใน --source . เป็นคำย่อสำหรับไดเรกทอรีปัจจุบัน) เนื่องจากบริการจะดูแลอิมเมจคอนเทนเนอร์โดยนัย คุณจึงไม่จำเป็นต้องระบุอิมเมจในคำสั่ง gcloud นี้

อีกครั้ง ให้ยืนยันว่าการติดตั้งใช้งานนี้ทำงานได้โดยคลิก Service URL ที่ไฮไลต์เพื่อเปิดแท็บเว็บเบราว์เซอร์ไปยังแอปที่กำลังทำงาน และตรวจสอบว่าบริการแสดงข้อความ "Hello from Cloud Run with Buildpacks!" ที่ด้านหน้าของพื้นหลังสีแบบสุ่ม

โปรดทราบว่าการใช้ Buildpack เพื่อสร้าง Dockerfile จะช่วยลดขั้นตอนง่ายๆ 3 ขั้นตอนให้เหลือเพียง 2 ขั้นตอนได้

  1. สร้างแอปในสภาพแวดล้อมในการพัฒนาซอฟต์แวร์
  2. โดยคุณจะสามารถติดตั้งใช้งานโค้ดเดียวกันทุกประการไปยังระบบคลาวด์ได้ด้วยคำสั่งเดียว

7. ฉันต้องใช้บรรทัดคำสั่งไหม

ไม่เอาด้วยหรอก เช่นเดียวกับบริการ Google Cloud เกือบทุกบริการ คุณสามารถโต้ตอบกับ Cloud Run ได้ 3 วิธี ดังนี้

  • เครื่องมือบรรทัดคำสั่ง gcloud ที่คุณเพิ่งเห็น
  • อินเทอร์เฟซผู้ใช้เว็บที่สมบูรณ์ผ่าน Cloud Console ซึ่งรองรับรูปแบบการโต้ตอบแบบชี้และคลิกที่ใช้งานง่าย
  • โดยใช้โปรแกรมด้วยไลบรารีของไคลเอ็นต์ Google ที่พร้อมใช้งานสำหรับภาษายอดนิยมหลายภาษา ได้แก่ Java, C#, Python, Go, Javascript, Ruby, C/C++ และอื่นๆ

มาทำให้แอป Cloud Run อีกอินสแตนซ์ใช้งานได้โดยใช้ UI ของคอนโซลกัน ไปที่หน้า Landing Page ของบริการ Cloud Run ผ่านเมนูด้านซ้ายบน

e2b4983b38c81796.png

จากนั้นคุณจะเห็นสรุปของบริการ Cloud Run ดังนี้

b335e7bf0a3af845.png

คลิกลิงก์ "สร้างบริการ" เพื่อเริ่มกระบวนการติดตั้งใช้งาน

51f61a8ddc7a4c0b.png

ป้อน "hello-again" เป็นชื่อบริการ เลือกแพลตฟอร์มการติดตั้งใช้งานและภูมิภาคเริ่มต้น แล้วคลิก "ถัดไป"

8a17baa45336c4c9.png

ป้อน URL นี้สำหรับอิมเมจคอนเทนเนอร์: gcr.io/cloudrun/hello ซึ่งเป็นคอนเทนเนอร์ Made by Google เพื่อวัตถุประสงค์ในการทดสอบ แล้วคลิกเมนูแบบเลื่อนลง "การตั้งค่าขั้นสูง" เพื่อดูการตั้งค่าการกำหนดค่าบางส่วนที่มีให้คุณใช้งาน ตัวอย่างการปรับแต่งบางอย่างที่คุณทำได้มีดังนี้

  • หมายเลขพอร์ตและจุดแรกเข้าของคอนเทนเนอร์ (ซึ่งจะลบล้างจุดแรกเข้าที่ระบุเมื่อสร้างคอนเทนเนอร์)
  • ฮาร์ดแวร์: หน่วยความจำและจำนวน CPU
  • การปรับขนาด: อินสแตนซ์ขั้นต่ำและสูงสุด
  • ตัวแปรสภาพแวดล้อม
  • อื่นๆ: การตั้งค่าการหมดเวลาของคำขอ จำนวนคำขอสูงสุดต่อคอนเทนเนอร์ HTTP/2

คลิกปุ่ม "ถัดไป" เพื่อไปยังกล่องโต้ตอบถัดไป กล่องโต้ตอบถัดไปจะช่วยให้คุณระบุวิธีทริกเกอร์บริการได้ สำหรับ "Ingress" ให้เลือก "อนุญาตการรับส่งข้อมูลทั้งหมด" และสำหรับ "การตรวจสอบสิทธิ์" ให้เลือก "อนุญาตการรับส่งข้อมูลที่ไม่ผ่านการตรวจสอบสิทธิ์"

e78281d1cff3418.png

การตั้งค่าเหล่านี้เป็นแบบเปิดมากที่สุด เนื่องจากอนุญาตให้ทุกคนเข้าถึงแอป Cloud Run ของคุณได้จากทุกที่บนอินเทอร์เน็ตสาธารณะโดยไม่ต้องระบุข้อมูลเข้าสู่ระบบสำหรับการตรวจสอบสิทธิ์ คุณอาจต้องการการตั้งค่าที่จำกัดมากขึ้นสำหรับแอป แต่เราจะทำให้การฝึกนี้ง่ายเข้าไว้

ตอนนี้ให้คลิกปุ่ม Create เพื่อสร้างบริการ Cloud Run หลังจากผ่านไป 2-3 วินาที คุณควรเห็นบริการใหม่ปรากฏในรายการสรุปของบริการ Cloud Run บรรทัดสรุปจะแสดงการติดตั้งใช้งานล่าสุด (วันที่/เวลาและผู้ที่ติดตั้งใช้งาน) พร้อมกับการตั้งค่าการกำหนดค่าที่สำคัญบางอย่าง คลิกลิงก์ชื่อบริการเพื่อเจาะลึกรายละเอียดเกี่ยวกับบริการใหม่

หากต้องการยืนยันบริการ ให้คลิก URL ที่แสดงอยู่ใกล้ด้านบนของหน้าสรุปตามที่ไฮไลต์ไว้ในตัวอย่างด้านล่าง

6c35cf0636dddc51.png

คุณควรเห็นข้อความคล้ายกับข้อความต่อไปนี้

3ba6ab4fe0da1f84.png

เมื่อทำให้บริการ Cloud Run ใหม่ใช้งานได้แล้ว ให้เลือกแท็บ REVISIONS เพื่อดูวิธีจัดการการทำให้ใช้งานได้หลายรายการ

2351ee7ec4a356f0.png

หากต้องการติดตั้งใช้งานรีวิชันใหม่จากคอนโซลโดยตรง ให้คลิกปุ่ม EDIT & DEPLOY NEW REVISION ตามที่ไฮไลต์ไว้ในภาพหน้าจอตัวอย่างด้านล่าง

a599fa88d00d6776.png

คลิกปุ่มนั้นตอนนี้เพื่อสร้างฉบับแก้ไขใหม่ คลิกปุ่ม SELECT ใกล้กับ URL ของคอนเทนเนอร์ ดังที่แสดงด้านล่าง

5fd1b1f8e1f11d40.png

ในกล่องโต้ตอบที่ปรากฏขึ้น ให้ค้นหาเว็บแอปแบบง่ายที่คุณติดตั้งใช้งานจาก Cloud Build โดยใช้ Buildpack ก่อนหน้านี้ แล้วคลิกเลือก ตรวจสอบว่าคุณเลือกอิมเมจคอนเทนเนอร์ในส่วน

gcr.io/<project>/cloud-run-source-deploy

โฟลเดอร์ เช่น

8a756c6157face3a.png

เมื่อเลือกแล้ว ให้เลื่อนลงไปที่ด้านล่างแล้วคลิกปุ่ม DEPLOY ตอนนี้คุณได้ทําให้แอปเวอร์ชันใหม่ใช้งานได้แล้ว หากต้องการยืนยัน ให้ไปที่ URL ของบริการอีกครั้งและตรวจสอบว่าตอนนี้คุณเห็นเว็บแอป "Hello from Cloud Run with Buildpacks!" ที่มีสีสันแล้ว

ดังที่เห็น แท็บการแก้ไขจะแสดงข้อมูลสรุปของการแก้ไขทุกรายการที่คุณทำให้ใช้งานได้ และตอนนี้คุณควรเห็นการแก้ไข 2 รายการสำหรับบริการนี้ คุณเลือกการแก้ไขที่ต้องการได้โดยคลิกปุ่มตัวเลือกทางด้านซ้ายของชื่อการแก้ไข ซึ่งจะแสดงสรุปรายละเอียดการแก้ไขทางด้านขวาของหน้าจอ เมื่อเลือกปุ่มเหล่านั้น คุณจะเห็นว่าการแก้ไข 2 รายการมาจากอิมเมจคอนเทนเนอร์ 2 รายการที่แตกต่างกัน

ปุ่ม MANAGE TRAFFIC ช่วยให้คุณแก้ไขการกระจายคำขอขาเข้าที่ส่งไปยังการแก้ไขที่ระบุได้ ความสามารถในการปรับแต่งปริมาณการเข้าชมที่ส่งไปยังการแก้ไขที่เฉพาะเจาะจงช่วยให้เกิด Use Case ที่มีคุณค่าหลายอย่าง ดังนี้

  • การทดสอบ Canary สำหรับแอปเวอร์ชันใหม่โดยใช้การรับส่งข้อมูลขาเข้าเพียงเล็กน้อย
  • เปลี่ยนการรับส่งข้อมูลจากรุ่นที่มีปัญหาเป็นการแก้ไขก่อนหน้า
  • การทดสอบ A/B

ค้นหาปุ่ม MANAGE TRAFFIC ได้ที่นี่

519d3c22ae028287.png

กำหนดค่าการแยกการเข้าชม 50/50 ระหว่าง 2 รีวิชันโดยระบุการแยกการเข้าชม 50/50 ดังนี้

8c37d4f115d9ded4.png

ตอนนี้ให้คลิกปุ่มบันทึกและยืนยันการแยก 50/50 โดยไปที่ URL ของบริการซ้ำๆ และตรวจสอบว่าโดยเฉลี่ยแล้ว คำขอครึ่งหนึ่งจะได้รับการตอบสนองโดยการแก้ไขปัจจุบัน ("สวัสดีจาก Cloud Run ที่มี Buildpack!") และอีกครึ่งหนึ่งจะได้รับการตอบสนองโดยการแก้ไขก่อนหน้า ("ทำงานอยู่!")

แท็บอื่นๆ ในหน้า "รายละเอียดบริการ" ช่วยให้คุณตรวจสอบประสิทธิภาพ การเข้าชม และบันทึกได้ ซึ่งจะให้ข้อมูลเชิงลึกที่มีประโยชน์เกี่ยวกับความยากและประสิทธิภาพของบริการ นอกจากนี้ คุณยังปรับแต่งสิทธิ์เข้าถึงบริการได้ผ่านแท็บ "สิทธิ์" โปรดใช้เวลาสักครู่เพื่อสำรวจแท็บในหน้านี้เพื่อดูความสามารถที่มีให้ใช้งานที่นี่

อินเทอร์เฟซแบบเป็นโปรแกรม

ดังที่ได้กล่าวไว้ก่อนหน้านี้ คุณยังมีตัวเลือกในการสร้าง ทำให้ใช้งานได้ และจัดการบริการ Cloud Run โดยใช้โปรแกรมด้วย สำหรับงานที่ต้องทำด้วยตนเอง ตัวเลือกนี้จะมีความซับซ้อนกว่าบรรทัดคำสั่งหรือเว็บคอนโซล แต่ก็เป็นวิธีที่ควรใช้ในการทำให้บริการ Cloud Run เป็นแบบอัตโนมัติ คุณมีตัวเลือกในการใช้ไลบรารีของไคลเอ็นต์ Google ในภาษาโปรแกรมยอดนิยมหลายภาษา

8. ทดสอบแอป

198ada162d1f0bf1.png

ในขั้นตอนสุดท้ายนี้ คุณจะต้องทำการทดสอบโหลดเทียมเพื่อทดสอบความทนทานของแอปและดูว่าแอปปรับขนาดตามดีมานด์ที่เข้ามาอย่างไร คุณจะใช้เครื่องมือที่ชื่อ hey ซึ่งติดตั้งไว้ล่วงหน้าใน Cloud Shell และช่วยให้เราสามารถเรียกใช้การทดสอบโหลดและนำเสนอผลลัพธ์ได้

ทำการทดสอบ

ในเทอร์มินัลของ Cloud Shell ให้เรียกใช้คำสั่งนี้เพื่อเรียกใช้การทดสอบโหลด

hey -q 1000 -c 200 -z 30s https://hello-...run.app

อาร์กิวเมนต์คำสั่งจะได้รับการตีความดังนี้

  • -q 1000 - พยายามเพิ่มภาระงานที่ประมาณ 1,000 คำขอต่อวินาที
  • -c 200 - จัดสรรผู้ปฏิบัติงานแบบคู่ขนาน 200 คน
  • -z 30s - เรียกใช้การทดสอบโหลดเป็นเวลา 30 วินาที
  • อย่าลืมใช้ URL ของบริการเป็นอาร์กิวเมนต์สุดท้ายในบรรทัดคำสั่งนี้

ผลการทดสอบควรมีลักษณะดังนี้

 Summary:
 Total:        30.2767 secs
 Slowest:      3.3633 secs
 Fastest:      0.1071 secs
 Average:      0.1828 secs
 Requests/sec: 1087.2387
 Total data:   3028456 bytes
 Size/request: 92 bytes

Response time histogram:
 0.107 [1]     |
 0.433 [31346] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 0.758 [1472]  |■■
 1.084 [82]    |
 1.410 [4]     |
...

Latency distribution:
...
 50% in 0.1528 secs
 75% in 0.1949 secs
 90% in 0.2442 secs
 95% in 0.4052 secs
 99% in 0.7062 secs

Details (average, fastest, slowest):
...
 req write:    0.0000 secs, 0.0000 secs, 0.0232 secs
 resp wait:    0.1824 secs, 0.1070 secs, 3.2953 secs
 resp read:    0.0000 secs, 0.0000 secs, 0.0010 secs
Status code distribution:
 [200] 32918 responses

ข้อมูลสรุปนี้บอกให้เราทราบถึงรายการที่น่าสนใจหลายรายการ ดังนี้

  • ระบบส่งคำขอ 32,918 รายการที่ประมาณ 1,000 รายการต่อวินาทีเป็นเวลา 30 วินาที
  • ไม่มีข้อผิดพลาด (มีเฉพาะการตอบกลับ HTTP 200)
  • เวลาในการตอบสนองเฉลี่ยคือ 180 มิลลิวินาที
  • เวลาในการตอบสนองต่ำสุดคือ 107 มิลลิวินาที และกรณีที่แย่ที่สุดคือ 3.3 วินาที
  • เวลาในการตอบสนองของเปอร์เซ็นไทล์ที่ 90 คือ 244 มิลลิวินาที

หากตรวจสอบแท็บ METRICS ในคอนโซล Cloud Run คุณจะเห็นเรื่องราวประสิทธิภาพฝั่งเซิร์ฟเวอร์ได้

e635c6831c468dd3.png

9. การล้างข้อมูล

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

คุณจะลบโปรเจ็กต์ GCP เพื่อหลีกเลี่ยงการเรียกเก็บเงิน ซึ่งจะหยุดการเรียกเก็บเงินสำหรับทรัพยากรทั้งหมดที่ใช้ภายในโปรเจ็กต์นั้น หรือจะลบอิมเมจคอนเทนเนอร์โดยใช้คำสั่งนี้ก็ได้

gcloud container images delete $TAG

หากต้องการลบบริการ Cloud Run ให้ใช้คำสั่งต่อไปนี้

gcloud run services delete hello --platform managed --region $REGION --quiet
gcloud run services delete hello-again --platform managed --region $REGION --quiet

10. คุณทำได้แล้ว!

9a31f4fdbbf1ddcb.png

ขอแสดงความยินดี คุณสร้างและทําให้แอป Cloud Run ที่ใช้งานจริงใช้งานได้สําเร็จแล้ว ในระหว่างนี้ คุณได้เรียนรู้เกี่ยวกับคอนเทนเนอร์และวิธีสร้างคอนเทนเนอร์ของคุณเอง และคุณได้เห็นแล้วว่าการทำให้แอปใช้งานได้ด้วย Cloud Run นั้นง่ายเพียงใด โดยใช้ทั้งเครื่องมือบรรทัดคำสั่ง gcloud และ Cloud Console ตอนนี้คุณก็รู้วิธีแชร์ผลงานสุดเจ๋งกับคนทั่วโลกแล้ว

ฉันอยากจะทิ้งท้ายด้วยคำถามสำคัญข้อหนึ่ง

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

คำตอบคือ 0 :)

Codelab ที่ควรลอง

ฟีเจอร์เจ๋งๆ อื่นๆ ที่คุณสำรวจได้...

เอกสารอ้างอิง...

11. คำกระตุ้นให้ดำเนินการ (Call-To-Action)

โลโก้ Google Cloud

หากคุณสนุกกับ Codelab นี้และมีแนวโน้มที่จะใช้เวลามากขึ้นในการลงมือปฏิบัติจริงกับ Google Cloud คุณควรเข้าร่วม Google Cloud Innovators วันนี้

โลโก้ป้ายสมาชิกทั่วไปของ Innovators

Google Cloud Innovators ไม่มีค่าใช้จ่ายและมีสิทธิประโยชน์ดังนี้

  • การสนทนาสด เซสชันถามและตอบ และเซสชันแผนกลยุทธ์เพื่อเรียนรู้ข้อมูลล่าสุดจาก Googler โดยตรง
  • ข่าวสารล่าสุดเกี่ยวกับ Google Cloud ในกล่องจดหมายของคุณ
  • ป้ายดิจิทัลและพื้นหลังการประชุมทางวิดีโอ
  • เครดิต 500 เครดิตสำหรับแล็บและการเรียนรู้ใน Skills Boost

คลิกที่นี่เพื่อลงทะเบียน