1. Giới thiệu

Python là một ngôn ngữ lập trình nguồn mở phổ biến được các nhà khoa học dữ liệu, nhà phát triển ứng dụng web, quản trị viên hệ thống và nhiều người khác sử dụng.
Cloud Functions là một nền tảng điện toán không máy chủ hoạt động theo sự kiện. Cloud Functions cho phép bạn viết mã mà không cần lo lắng về việc cung cấp tài nguyên hoặc điều chỉnh quy mô để đáp ứng các yêu cầu thay đổi.
Có hai loại Cloud Functions:
- Hàm HTTP phản hồi các yêu cầu HTTP. Bạn sẽ xây dựng một vài thành phần trong lớp học lập trình này.
- Các hàm nền được kích hoạt bởi các sự kiện, chẳng hạn như một thông báo được xuất bản lên Cloud Pub/Sub hoặc một tệp được tải lên Cloud Storage. Chúng tôi không đề cập đến vấn đề này trong lớp học lập trình này, nhưng bạn có thể đọc thêm trong tài liệu.

Lớp học lập trình này sẽ hướng dẫn bạn cách tạo Cloud Functions của riêng mình bằng Python.
Sản phẩm bạn sẽ tạo ra
Trong lớp học lập trình này, bạn sẽ phát hành một Cloud Functions. Khi được gọi qua HTTP, hàm này sẽ hiển thị biểu trưng "Python Powered":

Kiến thức bạn sẽ học được
- Cách viết một hàm HTTP Cloud Function.
- Cách viết một hàm HTTP Cloud Function nhận đối số.
- Cách kiểm thử một hàm HTTP Cloud Function.
- Cách chạy máy chủ HTTP Python cục bộ để thử hàm.
- Cách viết một hàm HTTP Cloud Function trả về hình ảnh.
2. Thiết lập và yêu cầu
Thiết lập môi trường tự học
- Đă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.



- 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ự không được các API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
- Mã dự án là duy nhất trong tất cả các dự án trên Google Cloud và không thể thay đổi (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 chuỗi đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã được 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ử tên người dùng của riêng mình và xem tên đó có sẵn hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ được giữ nguyên trong suốt thời gian diễn ra dự án. - Để bạn biết, 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ả ba giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API của Cloud. Việc chạy qua 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 phí 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ù có thể vận hành Google Cloud từ xa bằng máy tính xách tay, nhưng trong lớp học lập trình 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
- Trên Cloud Console, hãy nhấp vào Activate Cloud Shell (Kích hoạt Cloud Shell)
.

Nếu đây là lần đầu tiên bạn khởi động 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.

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

Máy ảo này được trang bị tất cả công cụ cho nhà phát triển cần thiết. Công cụ này cung cấp thư mục gốc 5 GB cố định và chạy trong Google Cloud, giúp cải thiện đáng kể hiệu suất mạng và quy trình xác thực. Bạn có thể thực hiện phần lớn (nếu không muốn nó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 mình đã được xác thực và dự án được đặt thành mã dự án của bạn.
- 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ả của lệnh
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- 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ả của lệnh
[core] project = <PROJECT_ID>
Nếu chưa, bạn có thể đặt bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả của lệnh
Updated property [core/project].
Đảm bảo bạn đã bật Cloud Functions và Cloud Build API
Chạy lệnh sau trong Cloud Shell để đảm bảo bạn đã bật Cloud Functions và Cloud Build API:
gcloud services enable \ cloudfunctions.googleapis.com \ cloudbuild.googleapis.com
Lưu ý: Cloud Build sẽ được gọi bằng lệnh gcloud functions deploy và sẽ tự động tạo mã của bạn thành một hình ảnh vùng chứa.
Tải mã nguồn xuống
Trong cửa sổ dòng lệnh của Cloud Shell, hãy chạy các lệnh sau:
REPO_NAME="codelabs" REPO_URL="https://github.com/GoogleCloudPlatform/$REPO_NAME" SOURCE_DIR="cloud-functions-python-http" git clone --no-checkout --filter=blob:none --depth=1 $REPO_URL cd $REPO_NAME git sparse-checkout set $SOURCE_DIR git checkout cd $SOURCE_DIR
Kiểm tra nội dung của thư mục nguồn:
ls
Bạn sẽ có các tệp sau:
main.py python-powered.png test_main.py web_app.py
3. Giới thiệu về hàm HTTP Cloud Functions
Hàm HTTP Cloud Functions bằng Python được viết dưới dạng hàm Python thông thường. Hàm này phải chấp nhận một đối số flask.Request duy nhất, thường được đặt tên là request.
main.py
import flask
def hello_world(request: flask.Request) -> flask.Response:
"""HTTP Cloud Function.
Returns:
- "Hello World! 👋"
"""
response = "Hello World! 👋"
return flask.Response(response, mimetype="text/plain")
# ...
Bạn có thể mở tệp bằng trình chỉnh sửa dòng lệnh mà bạn muốn (nano, vim hoặc emacs). Bạn cũng có thể mở tệp này trong Trình chỉnh sửa Cloud Shell sau khi đặt thư mục nguồn làm không gian làm việc:
cloudshell open-workspace .
Hãy triển khai hàm này dưới dạng một hàm HTTP Cloud Function bằng lệnh gcloud functions deploy:
FUNCTION_NAME="hello_world" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
Kết quả của lệnh:
... Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 ... entryPoint: FUNCTION_NAME httpsTrigger: url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME ...
Lưu ý về các lựa chọn gcloud functions deploy:
--runtime: Thuộc tính này chỉ định thời gian chạy ngôn ngữ. Đối với Python, giá trị này hiện có thể làpython37,python38,python39,python310hoặcpython312. Xem Môi trường thời gian chạy.--trigger-http: Hàm sẽ được chỉ định một điểm cuối. Các yêu cầu HTTP (POST, PUT, GET, DELETE và OPTIONS) đến điểm cuối sẽ kích hoạt quá trình thực thi hàm.--allow-unauthenticated: Hàm này sẽ ở chế độ công khai, cho phép tất cả phương thức gọi mà không cần kiểm tra việc xác thực.- Để tìm hiểu thêm, hãy xem phần gcloud functions deploy.
Để kiểm tra hàm, bạn có thể nhấp vào URL httpsTrigger.url hiển thị trong kết quả của lệnh ở trên. Bạn cũng có thể truy xuất URL theo phương thức lập trình và gọi hàm bằng các lệnh sau:
URL=$(gcloud functions describe $FUNCTION_NAME --format "value(httpsTrigger.url)") curl -w "\n" $URL
Bạn sẽ nhận được kết quả sau:
Hello World! 👋
4. Viết một hàm HTTP Cloud Function có nhận đối số
Hàm sẽ linh hoạt hơn khi chấp nhận các đối số. Hãy xác định một hàm mới hello_name hỗ trợ tham số name:
main.py
# ...
def hello_name(request: flask.Request) -> flask.Response:
"""HTTP Cloud Function.
Returns:
- "Hello {NAME}! 🚀" if "name=NAME" is defined in the GET request
- "Hello World! 🚀" otherwise
"""
name = request.args.get("name", "World")
response = f"Hello {name}! 🚀"
return flask.Response(response, mimetype="text/plain")
# ...
Hãy triển khai hàm mới này:
FUNCTION_NAME="hello_name" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
Kết quả của lệnh:
... Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 ... entryPoint: FUNCTION_NAME httpsTrigger: url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME ...
Để kiểm tra hàm, bạn có thể nhấp vào URL httpsTrigger.url hiển thị trong kết quả của lệnh ở trên. Bạn cũng có thể truy xuất URL theo phương thức lập trình và gọi hàm bằng các lệnh sau:
URL=$(gcloud functions describe $FUNCTION_NAME --format "value(httpsTrigger.url)") curl -w "\n" $URL
Bạn sẽ nhận được kết quả mặc định:
Hello World! 🚀
Bạn nhận được kết quả mặc định vì đối số name chưa được đặt. Thêm một tham số vào URL:
curl -w "\n" $URL?name=YOUR%20NAME
Lần này, bạn sẽ nhận được câu trả lời tuỳ chỉnh:
Hello YOUR NAME! 🚀
Bước tiếp theo là thêm kiểm thử đơn vị để đảm bảo các hàm của bạn tiếp tục hoạt động như dự kiến khi mã nguồn được cập nhật.
5. Viết mã kiểm thử
Hàm HTTP Cloud Functions bằng Python được kiểm thử bằng mô-đun unittest trong thư viện chuẩn. Bạn không cần chạy trình mô phỏng hoặc mô phỏng khác để kiểm thử hàm của mình, chỉ cần mã Python thông thường.
Dưới đây là ví dụ về một chương trình kiểm thử cho các hàm hello_world và hello_name:
test_main.py
import unittest
import unittest.mock
import main
class TestHello(unittest.TestCase):
def test_hello_world(self):
request = unittest.mock.Mock()
response = main.hello_world(request)
assert response.status_code == 200
assert response.get_data(as_text=True) == "Hello World! 👋"
def test_hello_name_no_name(self):
request = unittest.mock.Mock(args={})
response = main.hello_name(request)
assert response.status_code == 200
assert response.get_data(as_text=True) == "Hello World! 🚀"
def test_hello_name_with_name(self):
name = "FirstName LastName"
request = unittest.mock.Mock(args={"name": name})
response = main.hello_name(request)
assert response.status_code == 200
assert response.get_data(as_text=True) == f"Hello {name}! 🚀"
- Các chương trình kiểm thử Python được viết theo cách tương tự như các tệp Python khác. Các tệp này bắt đầu bằng một tập hợp các lệnh nhập, sau đó xác định các lớp và hàm.
- Nội dung khai báo kiểm thử có dạng
class TestHello(TestCase). Đây phải là một lớp kế thừa từunittest.TestCase. - Lớp kiểm thử có các phương thức, mỗi phương thức phải bắt đầu bằng
test_, đại diện cho các trường hợp kiểm thử riêng lẻ. - Mỗi trường hợp kiểm thử sẽ kiểm thử một trong các hàm của chúng ta bằng cách mô phỏng tham số
request(tức là thay thế tham số đó bằng một đối tượng giả có dữ liệu cụ thể cần thiết cho quá trình kiểm thử). - Sau khi gọi từng hàm, quy trình kiểm thử sẽ kiểm tra phản hồi HTTP để đảm bảo phản hồi đó đúng như mong đợi.
Vì main.py phụ thuộc vào flask, hãy đảm bảo rằng khung Flask được cài đặt trong môi trường thử nghiệm của bạn:
pip install flask
Việc cài đặt Flask sẽ cho ra kết quả tương tự như sau:
Collecting flask ... Successfully installed ... flask-3.0.2 ...
Chạy các kiểm thử này trên máy:
python -m unittest
Ba kiểm thử đơn vị sẽ vượt qua:
... ---------------------------------------------------------------------- Ran 3 tests in 0.001s OK
Tiếp theo, bạn sẽ tạo một hàm mới trả về biểu trưng "Python Powered".
6. Viết hàm HTTP Cloud Function "dùng Python"
Hãy tạo một hàm mới thú vị hơn một chút bằng cách trả về hình ảnh "Python Powered" cho mọi yêu cầu:

Danh sách sau đây cho thấy mã để thực hiện việc này:
main.py
# ...
def python_powered(request: flask.Request) -> flask.Response:
"""HTTP Cloud Function.
Returns:
- The official "Python Powered" logo
"""
return flask.send_file("python-powered.png")
Triển khai hàm python_powered mới:
FUNCTION_NAME="python_powered" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
Kết quả của lệnh:
... Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 ... entryPoint: FUNCTION_NAME httpsTrigger: url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME ...
Để kiểm tra hàm, hãy nhấp vào URL httpsTrigger.url xuất hiện trong kết quả của lệnh ở trên. Nếu mọi thứ hoạt động bình thường, bạn sẽ thấy biểu trưng "Python Powered" (Sử dụng Python) trong một thẻ trình duyệt mới!
Tiếp theo, bạn sẽ tạo một ứng dụng để có thể chạy và thử hàm của mình trên máy trước khi triển khai.
7. Chạy hàm cục bộ
Bạn có thể chạy hàm HTTP trên máy bằng cách tạo một ứng dụng web và gọi hàm trong một tuyến. Bạn có thể thêm tệp này vào cùng thư mục với hàm. Tệp có tên web_app.py có nội dung như sau:
web_app.py
import flask
import main
app = flask.Flask(__name__)
@app.get("/")
def index():
return main.python_powered(flask.request)
if __name__ == "__main__":
# Local development only
# Run "python web_app.py" and open http://localhost:8080
app.run(host="localhost", port=8080, debug=True)
- Tệp này tạo một ứng dụng Flask.
- Hàm này đăng ký một tuyến đường tại URL cơ sở được xử lý bằng một hàm có tên là
index(). - Sau đó, hàm
index()sẽ gọi hàmpython_powered, truyền yêu cầu hiện tại vào hàm này.
Đảm bảo rằng khung Flask đã được cài đặt trong môi trường phát triển của bạn:
pip install flask
Việc cài đặt Flask sẽ cho ra kết quả tương tự như sau:
Collecting flask ... Successfully installed ... flask-3.0.2 ...
Để chạy ứng dụng này trên máy, hãy chạy lệnh sau:
python web_app.py
Bây giờ, hãy sử dụng Cloud Shell Web Preview để kiểm thử ứng dụng web trong trình duyệt của bạn. Trong Cloud Shell, hãy nhấp vào nút "Web Preview" (Xem trước trên web) rồi chọn "Preview on port 8080" (Xem trước trên cổng 8080):

Cloud Shell mở URL xem trước trên dịch vụ proxy của mình trong một cửa sổ trình duyệt mới. Bản xem trước trên web chỉ cho phép tài khoản người dùng của bạn truy cập qua HTTPS. Nếu mọi thứ hoạt động đúng cách, bạn sẽ thấy biểu trưng "Python Powered"!

8. Xin chúc mừng!

Bạn đã triển khai Cloud Functions HTTP, sử dụng các hàm đặc trưng để xử lý các yêu cầu web bằng khung Flask.
Giá của Cloud Functions dựa trên tần suất hàm được gọi, bao gồm cả bậc miễn phí cho các hàm không chạy thường xuyên. Sau khi kiểm thử xong Cloud Functions, bạn có thể xoá các hàm đó bằng gcloud:
gcloud functions delete hello_world --quiet gcloud functions delete hello_name --quiet gcloud functions delete python_powered --quiet
Bạn cũng có thể xoá các hàm khỏi Google Cloud Console.
Chúng tôi hy vọng bạn thích sử dụng Cloud Functions bằng Python!