Thông tin về lớp học lập trình này
1. Giới thiệu
Tổng quan
Hàm Cloud Run là dịch vụ Hàm dưới dạng dịch vụ của Google Cloud, được cung cấp bởi Cloud Run và Eventarc, giúp bạn kiểm soát hiệu suất và khả năng mở rộng một cách nâng cao hơn, cũng như kiểm soát nhiều hơn về thời gian chạy hàm và trình kích hoạt từ hơn 90 nguồn sự kiện.
Lớp học lập trình này sẽ hướng dẫn bạn tạo các hàm Cloud Run phản hồi các lệnh gọi HTTP và được kích hoạt bằng thông báo Pub/Sub và Nhật ký kiểm tra Cloud.
Lớp học lập trình này cũng sử dụng tính năng cập nhật hình ảnh cơ sở tự động cho các hoạt động triển khai hàm bằng cách chỉ định hình ảnh cơ sở bằng cờ --base-image
. Tính năng tự động cập nhật hình ảnh cơ sở cho Cloud Run cho phép Google tự động tạo các bản vá bảo mật cho hệ điều hành và các thành phần thời gian chạy ngôn ngữ của hình ảnh cơ sở. Bạn không cần phải tạo lại hoặc triển khai lại dịch vụ để cập nhật hình ảnh cơ sở. Để biết thêm thông tin, hãy xem bài viết tính năng tự động cập nhật hình ảnh cơ sở
Nếu không muốn sử dụng tính năng tự động cập nhật hình ảnh cơ sở, bạn có thể xoá cờ --base-image
khỏi các ví dụ trong lớp học lập trình này.
Kiến thức bạn sẽ học được
- Tổng quan về các hàm Cloud Run và cách sử dụng tính năng tự động cập nhật hình ảnh cơ sở.
- Cách viết một hàm phản hồi các lệnh gọi HTTP.
- Cách viết một hàm phản hồi thông báo Pub/Sub.
- Cách viết một hàm phản hồi các sự kiện trên Cloud Storage.
- Cách phân chia lưu lượng truy cập giữa hai bản sửa đổi.
- Cách loại bỏ tình trạng khởi động nguội với số lượng thực thể tối thiểu.
2. Cách thiết lập và các yêu cầu
Tạo thư mục gốc
Tạo một thư mục gốc cho tất cả các ví dụ.
mkdir crf-codelab cd crf-codelab
Thiết lập biến môi trường
Thiết lập các biến môi trường sẽ được sử dụng trong toàn bộ lớp học lập trình này/
gcloud config set project <YOUR-PROJECT-ID> REGION=<YOUR_REGION> PROJECT_ID=$(gcloud config get-value project)
Bật API
Bật tất cả các dịch vụ cần thiết:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com \ logging.googleapis.com \ pubsub.googleapis.com
3. Hàm HTTP
Đối với hàm đầu tiên, hãy tạo một hàm Node.js đã xác thực để phản hồi các yêu cầu HTTP. Hãy sử dụng thời gian chờ 10 phút để minh hoạ cách một hàm có thể có thêm thời gian phản hồi các yêu cầu HTTP.
Tạo
Tạo thư mục cho ứng dụng và chuyển đến thư mục đó:
mkdir hello-http cd hello-http
Tạo tệp index.js
phản hồi các yêu cầu HTTP:
const functions = require('@google-cloud/functions-framework'); functions.http('helloWorld', (req, res) => { res.status(200).send('HTTP with Node.js in Cloud Run functions!'); });
Tạo tệp package.json
để chỉ định các phần phụ thuộc:
{ "name": "nodejs-run-functions-codelab", "version": "0.0.1", "main": "index.js", "dependencies": { "@google-cloud/functions-framework": "^2.0.0" } }
Triển khai
Triển khai hàm:
gcloud run deploy nodejs-run-function \ --source . \ --function helloWorld \ --base-image nodejs22 \ --region $REGION \ --timeout 600 \ --no-allow-unauthenticated
Lệnh này sử dụng gói xây dựng để chuyển đổi mã nguồn hàm thành hình ảnh vùng chứa sẵn sàng phát hành công khai.
Xin lưu ý những điều sau:
- cờ
--source
được dùng để yêu cầu Cloud Run tạo hàm thành một dịch vụ dựa trên vùng chứa có thể chạy - cờ
--function
(mới) được dùng để đặt điểm truy cập của dịch vụ mới thành chữ ký hàm mà bạn muốn gọi - cờ
--base-image
(mới) chỉ định môi trường hình ảnh cơ sở cho hàm của bạn, chẳng hạn nhưnodejs22
,python312
,go123
,java21
,dotnet8
,ruby33
hoặcphp83
. Để biết thêm thông tin chi tiết về hình ảnh cơ sở và các gói có trong mỗi hình ảnh, hãy xem phần Hình ảnh cơ sở của môi trường thời gian chạy. - (không bắt buộc) cờ
--timeout
cho phép hàm có thời gian chờ lâu hơn để phản hồi các yêu cầu HTTP. Trong ví dụ này, 600 giây được dùng để minh hoạ thời gian phản hồi là 10 phút. - (không bắt buộc)
--no-allow-unauthenticated
để ngăn hàm của bạn được gọi công khai
Kiểm thử
Kiểm thử hàm bằng các lệnh sau:
# get the Service URL SERVICE_URL="$(gcloud run services describe nodejs-run-function --region $REGION --format 'value(status.url)')" # invoke the service curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
Bạn sẽ thấy thông báo HTTP with Node.js in Cloud Run functions!
dưới dạng phản hồi.
4. Hàm Pub/Sub
Đối với hàm thứ hai, hãy tạo một hàm Python được kích hoạt bằng một thông báo Pub/Sub được phát hành cho một chủ đề cụ thể.
Thiết lập mã thông báo xác thực Pub/Sub
Nếu bạn đã bật tài khoản dịch vụ Pub/Sub vào hoặc trước ngày 8 tháng 4 năm 2021, hãy cấp vai trò iam.serviceAccountTokenCreator
cho tài khoản dịch vụ Pub/Sub:
PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)') gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role roles/iam.serviceAccountTokenCreator
Tạo
Tạo một chủ đề Pub/Sub để sử dụng cho mẫu:
TOPIC=cloud-run-functions-pubsub-topic gcloud pubsub topics create $TOPIC
Tạo thư mục cho ứng dụng và chuyển đến thư mục đó:
mkdir ../hello-pubsub cd ../hello-pubsub
Tạo tệp main.py
ghi nhật ký thông báo chứa mã nhận dạng CloudEvent:
import functions_framework @functions_framework.cloud_event def hello_pubsub(cloud_event): print('Pub/Sub with Python in Cloud Run functions! Id: ' + cloud_event['id'])
Tạo tệp requirements.txt
có nội dung sau để chỉ định các phần phụ thuộc:
functions-framework==3.*
Triển khai
Triển khai hàm:
gcloud run deploy python-pubsub-function \ --source . \ --function hello_pubsub \ --base-image python313 \ --region $REGION \ --no-allow-unauthenticated
Truy xuất số dự án sẽ được dùng cho danh tính tài khoản dịch vụ.
PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')
Tạo điều kiện kích hoạt
gcloud eventarc triggers create python-pubsub-function-trigger \ --location=$REGION \ --destination-run-service=python-pubsub-function \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/$PROJECT_ID/topics/$TOPIC \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
Kiểm thử
Kiểm thử hàm bằng cách gửi tin nhắn đến chủ đề:
gcloud pubsub topics publish $TOPIC --message="Hello World"
Bạn sẽ thấy CloudEvent đã nhận được trong nhật ký:
gcloud run services logs read python-pubsub-function --region $REGION --limit=10
5. Hàm Cloud Storage
Đối với hàm tiếp theo, hãy tạo một hàm Node.js phản hồi các sự kiện từ một bộ chứa trên Cloud Storage.
Thiết lập
Để sử dụng các hàm Cloud Storage, hãy cấp vai trò IAM pubsub.publisher
cho tài khoản dịch vụ Cloud Storage:
SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER) gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/pubsub.publisher
Tạo
Tạo thư mục cho ứng dụng và chuyển đến thư mục đó:
mkdir ../hello-storage cd ../hello-storage
Tạo một tệp index.js
chỉ phản hồi các sự kiện trên Cloud Storage:
const functions = require('@google-cloud/functions-framework'); functions.cloudEvent('helloStorage', (cloudevent) => { console.log('Cloud Storage event with Node.js in Cloud Run functions!'); console.log(cloudevent); });
Tạo tệp package.json
để chỉ định các phần phụ thuộc:
{ "name": "nodejs-crf-cloud-storage", "version": "0.0.1", "main": "index.js", "dependencies": { "@google-cloud/functions-framework": "^2.0.0" } }
Triển khai
Trước tiên, hãy tạo một bộ chứa trên Cloud Storage (hoặc sử dụng một bộ chứa hiện có):
export BUCKET_NAME="gcf-storage-$PROJECT_ID" export BUCKET="gs://gcf-storage-$PROJECT_ID" gsutil mb -l $REGION $BUCKET
Triển khai hàm:
gcloud run deploy nodejs-crf-cloud-storage \ --source . \ --base-image nodejs22 \ --function helloStorage \ --region $REGION \ --no-allow-unauthenticated
Sau khi triển khai hàm, bạn có thể thấy hàm đó trong phần Cloud Run của Cloud Console.
Bây giờ, hãy tạo điều kiện kích hoạt Eventarc.
BUCKET_REGION=$REGION gcloud eventarc triggers create nodejs-crf-cloud-storage-trigger \ --location=$BUCKET_REGION \ --destination-run-service=nodejs-crf-cloud-storage \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
Kiểm thử
Kiểm thử hàm bằng cách tải một tệp lên bộ chứa:
echo "Hello World" > random.txt gsutil cp random.txt $BUCKET/random.txt
Bạn sẽ thấy CloudEvent đã nhận được trong nhật ký:
gcloud run services logs read nodejs-crf-cloud-storage --region $REGION --limit=10
6. Phân tách lưu lượng truy cập
Hàm Cloud Run hỗ trợ nhiều bản sửa đổi của hàm, phân chia lưu lượng truy cập giữa các bản sửa đổi và khôi phục hàm về phiên bản trước.
Ở bước này, bạn sẽ triển khai 2 bản sửa đổi của một hàm, sau đó phân chia lưu lượng truy cập giữa các bản sửa đổi đó theo tỷ lệ 50-50.
Tạo
Tạo thư mục cho ứng dụng và chuyển đến thư mục đó:
mkdir ../traffic-splitting cd ../traffic-splitting
Tạo tệp main.py
bằng một hàm Python đọc biến môi trường màu và phản hồi lại bằng Hello World
có màu nền đó:
import os color = os.environ.get('COLOR') def hello_world(request): return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'
Tạo tệp requirements.txt
có nội dung sau để chỉ định các phần phụ thuộc:
functions-framework==3.*
Triển khai
Triển khai bản sửa đổi đầu tiên của hàm có nền màu cam:
COLOR=orange gcloud run deploy hello-world-colors \ --source . \ --base-image python313 \ --function hello_world \ --region $REGION \ --allow-unauthenticated \ --update-env-vars COLOR=$COLOR
Tại thời điểm này, nếu kiểm thử hàm bằng cách xem trình kích hoạt HTTP (kết quả URI của lệnh triển khai ở trên) trong trình duyệt, bạn sẽ thấy Hello World
có nền màu cam:
Triển khai bản sửa đổi thứ hai có nền màu vàng:
COLOR=yellow gcloud run deploy hello-world-colors \ --source . \ --base-image python313 \ --function hello_world \ --region $REGION \ --allow-unauthenticated \ --update-env-vars COLOR=$COLOR
Vì đây là bản sửa đổi mới nhất, nên nếu kiểm thử hàm này, bạn sẽ thấy Hello World
có nền màu vàng:
Phân chia lưu lượng truy cập theo tỷ lệ 50/50
Để phân chia lưu lượng truy cập giữa các bản sửa đổi màu cam và màu vàng, bạn cần tìm mã bản sửa đổi của các dịch vụ Cloud Run. Đây là lệnh để xem mã bản sửa đổi:
gcloud run revisions list --service hello-world-colors \ --region $REGION --format 'value(REVISION)'
Kết quả sẽ tương tự như kết quả sau:
hello-world-colors-00001-man hello-world-colors-00002-wok
Bây giờ, hãy phân chia lưu lượng truy cập giữa hai bản sửa đổi này như sau (cập nhật X-XXX
theo tên bản sửa đổi):
gcloud run services update-traffic hello-world-colors \ --region $REGION \ --to-revisions hello-world-colors-0000X-XXX=50,hello-world-colors-0000X-XXX=50
Kiểm thử
Kiểm thử hàm bằng cách truy cập vào URL công khai của hàm đó. Trong một nửa thời gian, bạn sẽ thấy bản sửa đổi màu cam và trong nửa thời gian còn lại, bạn sẽ thấy bản sửa đổi màu vàng:
Hãy xem phần hoạt động khôi phục, triển khai từng bước và di chuyển lưu lượng truy cập để biết thêm thông tin.
7. Số thực thể tối thiểu
Trong các hàm Cloud Run, bạn có thể chỉ định số lượng thực thể hàm tối thiểu để giữ ấm và sẵn sàng phân phát yêu cầu. Điều này rất hữu ích trong việc giới hạn số lần khởi động nguội.
Ở bước này, bạn sẽ triển khai một hàm có tốc độ khởi chạy chậm. Bạn sẽ quan sát thấy vấn đề khởi động nguội. Sau đó, bạn sẽ triển khai hàm với giá trị thực thể tối thiểu được đặt thành 1 để loại bỏ tình trạng khởi động nguội.
Tạo
Tạo thư mục cho ứng dụng và chuyển đến thư mục đó:
mkdir ../min-instances cd ../min-instances
Tạo tệp main.go
. Dịch vụ Go này có một hàm init
sẽ ngủ trong 10 giây để mô phỏng quá trình khởi chạy lâu. Lớp này cũng có một hàm HelloWorld
phản hồi các lệnh gọi HTTP:
package p import ( "fmt" "net/http" "time" ) func init() { time.Sleep(10 * time.Second) } func HelloWorld(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Slow HTTP Go in Cloud Run functions!") }
Triển khai
Triển khai bản sửa đổi đầu tiên của hàm với giá trị thực thể tối thiểu mặc định là 0:
gcloud run deploy go-slow-function \ --source . \ --base-image go123 \ --function HelloWorld \ --region $REGION \ --no-allow-unauthenticated
Kiểm thử hàm bằng lệnh sau:
# get the Service URL SERVICE_URL="$(gcloud run services describe go-slow-function --region $REGION --format 'value(status.url)')" # invoke the service curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
Bạn sẽ thấy độ trễ 10 giây (khởi động nguội) trên lệnh gọi đầu tiên, sau đó thấy thông báo. Các lệnh gọi tiếp theo sẽ trả về ngay lập tức.
Đặt số lượng thực thể tối thiểu
Để loại bỏ tình trạng khởi động nguội trên yêu cầu đầu tiên, hãy triển khai lại hàm với cờ --min-instances
được đặt thành 1 như sau:
gcloud run deploy go-slow-function \ --source . \ --base-image go123 \ --function HelloWorld \ --region $REGION \ --no-allow-unauthenticated \ --min-instances 1
Kiểm thử
Kiểm thử lại hàm:
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
Bạn sẽ không thấy độ trễ 10 giây nữa trong yêu cầu đầu tiên. Vấn đề khởi động nguội cho lệnh gọi đầu tiên (sau một thời gian dài không có) đã biến mất, nhờ các thực thể tối thiểu!
Hãy xem phần sử dụng các thực thể tối thiểu để biết thêm thông tin.
8. Xin chúc mừng!
Chúc mừng bạn đã hoàn thành lớp học lập trình!
Nội dung đã đề cập
- Thông tin tổng quan về các hàm Cloud Run và cách sử dụng tính năng tự động cập nhật hình ảnh cơ sở.
- Cách viết một hàm phản hồi các lệnh gọi HTTP.
- Cách viết một hàm phản hồi thông báo Pub/Sub.
- Cách viết một hàm phản hồi các sự kiện trên Cloud Storage.
- Cách phân chia lưu lượng truy cập giữa hai bản sửa đổi.
- Cách loại bỏ tình trạng khởi động nguội với số lượng thực thể tối thiểu.