Xin chào Cloud Run bằng Python (Streamlit)

1. Giới thiệu

96d07289bb51daa7.png

Cloud Run là một nền tảng tính toán được quản lý, cho phép bạn chạy các vùng chứa không trạng thái có thể gọi được bằng các yêu cầu HTTP. Nền tảng này được xây dựng dựa trên dự án nguồn mở Knative, cho phép chuyển đổi các khối lượng công việc của bạn trên nhiều nền tảng. Cloud Run là nền tảng không máy chủ: nền tảng này trừu tượng hoá mọi hoạt động quản lý cơ sở hạ tầng, nhờ đó, bạn có thể tập trung vào những điều quan trọng nhất – xây dựng các ứng dụng tuyệt vời.

Streamlit

Kiến thức bạn sẽ học được

  • Cách tạo ứng dụng Streamlit "Hello World".
  • Kiểm thử ứng dụng bằng cách chạy ứng dụng Streamlit trước khi triển khai.
  • Cloud Buildpacks và cách sự hiện diện của streamlit trong requirements.txt cho phép không cần Dockerfile.
  • Cách triển khai ứng dụng Streamlit lên Cloud Run.

2. Thiết lập và yêu cầu

Thiết lập môi trường tự học

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Tên dự án là tên hiển thị cho những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật tên này.
  • Mã dự án là mã duy nhất trên tất cả các dự án của Google Cloud và là mã bất biến (không thể thay đổi sau khi đã đặt). Cloud Console tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử mã của riêng mình và xem mã đó có dùng được hay không. Bạn không thể thay đổi mã này sau bước này và mã này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các API/tài nguyên trên Cloud. Việc tham gia lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh phát sinh chi phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.

Bắt đầu Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong hướng dẫn này, bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.

Kích hoạt Cloud Shell

  1. Trên Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell

3c1dabeca90e44e5.png

Nếu đây là lần đầu tiên bạn bắt đầu Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.png

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.png

Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Máy ảo này cung cấp một thư mục chính liên tục có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện hầu hết, nếu không phải là tất cả, công việc trong lớp học lập trình này bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Bật các API

Từ Cloud Shell, hãy bật các API Artifact Registry, Cloud Build và Cloud Run:

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

Lệnh này sẽ xuất ra một thông báo thành công tương tự như thông báo sau:

Operation "operations/..." finished successfully.

Bây giờ, bạn đã sẵn sàng bắt đầu làm việc và viết ứng dụng...

4. Viết ứng dụng

Trong bước này, bạn sẽ tạo một ứng dụng Python Streamlit "Hello World" phản hồi các yêu cầu HTTP.

Thư mục đang làm việc

Sử dụng Cloud Shell để tạo một thư mục đang làm việc có tên là helloworld-streamlit và chuyển sang thư mục đó:

mkdir ~/helloworld-streamlit && cd ~/helloworld-streamlit

main.py

Tạo một tệp có tên là main.py:

touch main.py

Chỉnh sửa tệp bằng trình chỉnh sửa dòng lệnh mà bạn muốn (nano, vim hoặc emacs) hoặc bằng cách nhấp vào nút Trình chỉnh sửa Cloud Shell:

10af7b1a6240e9f4.gif

Để chỉnh sửa trực tiếp tệp bằng Trình chỉnh sửa Cloud Shell, hãy sử dụng lệnh sau:

cloudshell edit main.py

main.py

import streamlit as st

st.title("Hello World! 👋🌎")
st.markdown(
    """
    This is a demo Streamlit app.

    Enter your name in the text box below and press a button to see some fun features in Streamlit.
    """
)

name = st.text_input("Enter your name:")

# Use columns to create buttons side by side
col1, col2 = st.columns(2)

with col1:
    if st.button("Send balloons! 🎈"):
        st.balloons()
        st.write(f"Time to celebrate {name}! 🥳")
        st.write("You deployed a Streamlit app! 👏")

with col2:
    if st.button("Send snow! ❄️"):
        st.snow()
        st.write(f"Let it snow {name}! 🌨️")
        st.write("You deployed a Streamlit app! 👏")

Mã này tạo một dịch vụ web cơ bản phản hồi các yêu cầu HTTP GET bằng một thông báo thân thiện.

requirements.txt

Mở lại thiết bị đầu cuối và thêm một tệp có tên là requirements.txt để xác định các phần phụ thuộc:

touch requirements.txt

Để chỉnh sửa trực tiếp tệp bằng Trình chỉnh sửa Cloud Shell, hãy sử dụng lệnh sau:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/streamlit
streamlit==1.47.0

Ứng dụng Streamlit đã sẵn sàng để triển khai, nhưng trước tiên hãy kiểm thử ứng dụng đó...

5. Kiểm thử ứng dụng

Để kiểm thử ứng dụng, hãy sử dụng uv (trình quản lý dự án và gói cực nhanh của Python) được cài đặt sẵn trong Cloud Shell.

Để kiểm thử ứng dụng, hãy tạo một môi trường ảo:

uv venv

Cài đặt các phần phụ thuộc:

uv pip install -r requirements.txt

Bắt đầu ứng dụng bằng streamlit run (tắt --server.enableCORS để kiểm thử vì tính năng này gây trở ngại cho Cloud Shell):

uv run streamlit run main.py --server.port=8080 --server.enableCORS=false

Nhật ký sẽ cho thấy ứng dụng Streamlit đang chạy:

You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8080
  Network URL: http://10.1.0.1:8080
  External URL: http://34.37.7.94:8080

Trong cửa sổ Cloud Shell, hãy nhấp vào biểu tượng Web Preview (Xem trước trên web) rồi chọn Preview on port 8080 (Xem trước trên cổng 8080):

6c9ff9e5c692c58e.gif

Thao tác này sẽ mở một cửa sổ trình duyệt hiển thị tiêu đề Hello World! 👋🌎.

helloworld-streamlit-app.png

Hãy thử điền tên của bạn và kiểm thử 2 nút trên màn hình!

Khi bạn hoàn tất, hãy quay lại phiên Cloud Shell chính và dừng ứng dụng Streamlit bằng CTRL+C.

Ứng dụng hoạt động như mong đợi: đã đến lúc triển khai ứng dụng đó...

6. Triển khai lên Cloud Run

Cloud Run là một nền tảng theo khu vực, nghĩa là cơ sở hạ tầng chạy các dịch vụ Cloud Run nằm ở một khu vực cụ thể và do Google quản lý để có khả năng dự phòng trên tất cả các vùng trong khu vực đó. Xác định khu vực mà bạn sẽ sử dụng để triển khai, ví dụ:

REGION=europe-west4

Đảm bảo rằng bạn vẫn đang ở trong thư mục đang làm việc:

ls

Lệnh này sẽ liệt kê các tệp sau:

main.py  requirements.txt

Trước khi triển khai, hãy tạo một tệp .gcloudignore có chứa .venv/. Thao tác này sẽ ngăn quá trình triển khai Cloud Run bao gồm môi trường ảo được tạo từ uv trong quá trình kiểm thử cục bộ.

Tạo .gcloudignore bằng lệnh sau:

echo ".venv/" > .gcloudignore

Triển khai ứng dụng lên Cloud Run:

gcloud run deploy helloworld-streamlit \
  --source . \
  --region $REGION \
  --allow-unauthenticated
  • Tuỳ chọn --allow-unauthenticated giúp dịch vụ có thể truy cập công khai. Để tránh các yêu cầu chưa xác thực, hãy sử dụng --no-allow-unauthenticated.

Vào lần đầu tiên, bạn sẽ nhận được lời nhắc tạo một kho lưu trữ Artifact Registry. Nhấn vào Enter để xác thực:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

Thao tác này sẽ khởi chạy quá trình tải mã nguồn của bạn lên kho lưu trữ Artifact Registry và quá trình tạo hình ảnh vùng chứa:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

Sau đó, hãy đợi một chút cho đến khi quá trình triển khai hoàn tất. Khi thành công, dòng lệnh sẽ hiển thị URL dịch vụ:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

Bạn có thể lấy URL dịch vụ bằng lệnh sau:

SERVICE_URL=$( \
  gcloud run services describe helloworld-streamlit \
  --region $REGION \
  --format "value(status.address.url)" \
)
echo $SERVICE_URL

Lệnh này sẽ hiển thị nội dung tương tự như sau:

https://helloworld-streamlit-PROJECTHASH-REGIONID.a.run.app

Giờ đây, bạn có thể sử dụng ứng dụng bằng cách mở URL dịch vụ trong trình duyệt web:

helloworld-streamlit.gif

Xin chúc mừng! Bạn vừa triển khai một ứng dụng lên Cloud Run. Cloud Run tự động và theo chiều ngang mở rộng quy mô hình ảnh vùng chứa của bạn để xử lý các yêu cầu nhận được, sau đó giảm quy mô khi nhu cầu giảm. Bạn chỉ phải thanh toán cho CPU, bộ nhớ và mạng được sử dụng trong quá trình xử lý yêu cầu cho dịch vụ Cloud Run này.

7. Dọn dẹp

Mặc dù Cloud Run không tính phí khi dịch vụ không được sử dụng, nhưng bạn vẫn có thể bị tính phí khi lưu trữ hình ảnh vùng chứa trong Artifact Registry. Bạn có thể xoá kho lưu trữ hoặc xoá dự án trên đám mây để tránh phát sinh chi phí. Việc xoá dự án trên đám mây sẽ dừng tính phí cho tất cả các tài nguyên được sử dụng trong dự án đó.

Cách xoá kho lưu trữ hình ảnh vùng chứa:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

Cách xoá dịch vụ Cloud Run:

gcloud run services delete helloworld-streamlit \
  --region $REGION

Cách xoá dự án trên Google Cloud,

  1. Lấy mã dự án hiện tại:
PROJECT_ID=$(gcloud config get-value core/project)
  1. Đảm bảo rằng đây là dự án mà bạn muốn xoá:
echo $PROJECT_ID
  1. Xoá dự án:
gcloud projects delete $PROJECT_ID

8. Xin chúc mừng!

96d07289bb51daa7.png

Bạn đã tạo một ứng dụng web Streamlit "Hello World" và triển khai ứng dụng đó lên Cloud Run!

Nội dung đã đề cập

  • Cách tạo ứng dụng Streamlit "Hello World".
  • Kiểm thử ứng dụng bằng cách chạy ứng dụng Streamlit trước khi triển khai.
  • Cloud Buildpacks và cách sự hiện diện của streamlit trong requirements.txt cho phép không cần Dockerfile.
  • Triển khai ứng dụng Streamlit lên Cloud Run.

Tìm hiểu thêm