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.v. sử dụng.
Cloud Functions là một nền tảng điện toán không máy chủ dựa trên sự kiện. Cloud Functions cho phép bạn viết mã mà không phải lo lắng về việc cung cấp tài nguyên hoặc mở rộng quy mô để xử lý các yêu cầu thường xuyên thay đổi.
Có hai loại Cloud Functions:
- Các hàm HTTP phản hồi các yêu cầu HTTP. Bạn sẽ tạo một vài thành phần trong lớp học lập trình này.
- Các chức năng nền được kích hoạt bằng các sự kiện, chẳng hạn như thông báo được xuất bản lên Cloud Pub/Sub hoặc tệp đang được tải lên Cloud Storage. Chúng tôi không giải quyết vấn đề này trong phòng thí nghiệm này, nhưng bạn có thể đọc thêm trong tài liệu này.
Lớp học lập trình này sẽ hướng dẫn bạn cách tạo Cloud Functions bằng Python của riêng bạn.
Sản phẩm bạn sẽ tạo ra
Trong lớp học lập trình này, bạn sẽ xuất bản một Hàm đám mây mà khi được gọi qua HTTP, sẽ hiển thị thông số "Python Powered" biểu trưng:
Kiến thức bạn sẽ học được
- Cách viết Hàm đám mây HTTP.
- Cách viết một Hàm đám mây HTTP để nhận đối số.
- Cách kiểm thử một hàm HTTP Cloud.
- Cách chạy máy chủ HTTP Python cục bộ để dùng thử hàm này.
- Cách viết một Hàm đám mây HTTP trả về hình ảnh.
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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ị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật ứng dụng.
- Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án của mình (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ã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi mã này sau bước này và mã vẫn giữ nguyên trong thời gian dự án. - Đối với thông tin của bạn, có giá trị thứ ba, Project Number (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 này.
- Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạ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í 300 USD.
Khởi động 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 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 trong Đám mây.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.
Nếu đây là lần đầu tiê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 nhì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 tải tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện 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.
- 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`
- 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 chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả lệnh
Updated property [core/project].
Đảm bảo Cloud Functions và Cloud Build API (API Bản dựng đám mây) đang bật
Chạy lệnh sau từ Cloud Shell để đảm bảo các API của Cloud Functions và Cloud Build API đã được bật:
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 hình ảnh vùng chứa.
Tải mã nguồn xuống
Trên thiết bị đầu cuối 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
Xem nội dung của thư mục nguồn:
ls
Bạn cần có các tệp sau:
main.py python-powered.png test_main.py web_app.py
3. Giới thiệu về Chức năng đám mây HTTP
Hàm đám mây HTTP trong Python được viết dưới dạng các hàm Python thông thường. Hàm phải chấp nhận một đối số flask.Request
duy nhất, thường có 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 Cloud Shell Editor 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 đám mây HTTP bằng lệnh gcloud functions deploy
:
FUNCTION_NAME="hello_world" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
Đầu ra 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 tuỳ chọn gcloud functions deploy
:
--runtime
: Mã này chỉ định thời gian chạy của ngôn ngữ. Đối với Python, giá trị này hiện có thể làpython37
,python38
,python39
,python310
hoặcpython312
. Hãy xem mục 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 việc thực thi hàm.--allow-unauthenticated
: Hàm này sẽ được công khai, cho phép tất cả phương thức gọi mà không cần kiểm tra quy trình xác thực.- Để tìm hiểu thêm, hãy xem bài viết triển khai các chức năng của gcloud.
Để kiểm thử hàm này, 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 đám mây HTTP để nhận đối số
Hàm linh hoạt hơn khi chấp nhận đối số. Hãy xác định một hàm hello_name
mới 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
Đầu ra 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 thử hàm này, 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 sẽ nhận được kết quả mặc định vì chưa thiết lập đối số name
. 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 phản hồi tuỳ chỉnh:
Hello YOUR NAME! 🚀
Bước tiếp theo là thêm các bài 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 bài kiểm thử
Các Hàm đám mây HTTP trong Python được kiểm thử bằng mô-đun unittest
trong thư viện chuẩn. Không cần chạy trình mô phỏng hoặc hoạt động mô phỏng khác để kiểm thử hàm mà chỉ cần mã Python thông thường.
Dưới đây là giao diện của 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}! 🚀"
- Kiểm thử Python được viết theo cách tương tự như các tệp Python khác. Các lớp này bắt đầu bằng một tập hợp lệnh nhập, sau đó xác định các lớp và hàm.
- 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 từng trường hợp kiểm thử. - Mỗi trường hợp kiểm thử sẽ kiểm thử một trong các hàm bằng cách mô phỏng tham số
request
(tức là thay thế bằng một đối tượng giả bằng dữ liệu cụ thể cần thiết cho chương 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 đúng như chúng ta mong đợi.
Vì main.py
phụ thuộc vào flask
, hãy đảm bảo bạn đã cài đặt khung Flask trong môi trường kiểm thử:
pip install flask
Quá trình 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 bài kiểm thử này trên thiết bị:
python -m unittest
3 bài kiểm thử đơn vị cần thành công:
... ---------------------------------------------------------------------- Ran 3 tests in 0.001s OK
Tiếp theo, bạn sẽ tạo một hàm mới trả về giá trị "Python Powered" biểu trưng.
6. Viết "Python Powered" Chức năng đám mây HTTP
Hãy tạo một hàm mới thú vị hơn một chút bằng cách trả về mã "Python Powered" hình ảnh cho mọi yêu cầu:
Trang thông tin 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 một hàm python_powered
mới:
FUNCTION_NAME="python_powered" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
Đầu ra 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 thử hàm này, hãy nhấp vào URL httpsTrigger.url
hiển thị trong đầu ra của lệnh ở trên. Nếu mọi thứ hoạt động chính xác, bạn sẽ thấy thông báo "Python Powered" biểu trưng trong 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ử chức năng 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 cục bộ 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 hàm này vào cùng thư mục với hàm. Tệp tên là web_app.py
có nội dung 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.
- Thao tác này đăng ký tuyến tại URL cơ sở và đượ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 vào đó yêu cầu hiện tại.
Đảm bảo bạn đã cài đặt khung Flask trong môi trường phát triển:
pip install flask
Quá trình 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 tính, hãy chạy lệnh sau:
python web_app.py
Bây giờ, hãy sử dụng Bản xem trước web Cloud Shell để 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 "Xem trước trên web" và chọn "Xem trước trên cổng 8080":
Cloud Shell mở URL xem trước trên dịch vụ proxy trong cửa sổ trình duyệt mới. Chế độ 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ứ đang hoạt động đúng cách, bạn sẽ thấy thông báo lỗi "Python Powered" biểu trưng!
8. Xin chúc mừng!
Bạn đã triển khai Chức năng đám mây HTTP, sử dụng các hàm đặc trưng xử lý yêu cầu web bằng khung Flask.
Giá của Hàm đám mây dựa trên tần suất gọi hàm của bạn, bao gồm cả bậc miễn phí cho những hàm không chạy thường xuyên. Sau khi kiểm thử xong Cloud Functions, bạn có thể xoá chúng bằng cách sử dụ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 này khỏi bảng điều khiển Google Cloud.
Chúng tôi hy vọng bạn thích sử dụng Cloud Functions trong Python!