Bắt đầu sử dụng các hàm Cloud Run do sự kiện điều khiển

1. Giới thiệu

Tổng quan

Hàm Cloud Run là một cách mới để triển khai tải bằng cách sử dụng chữ ký hàm và các mô hình tạo sự kiện GCF quen thuộc. Thay vì sử dụng quy trình xây dựng và cấu hình triển khai theo ý kiến của chúng tôi, các hàm Cloud Run cho phép bạn kiểm soát trực tiếp Dịch vụ cơ bản được tạo trên Cloud Run.

Với các hàm Cloud Run, chúng tôi cung cấp UX đơn giản của tính năng triển khai nguồn Cloud Run, giúp nhà phát triển kiểm soát hoàn toàn các tải công việc của họ bằng cách sử dụng cấu hình Cloud Run.

Trong phần này, bạn sẽ tìm hiểu cách triển khai một hàm dựa trên sự kiện trong Node. Bạn sẽ triển khai một hàm được kích hoạt bất cứ khi nào một đối tượng được hoàn tất trong một bộ chứa Google Cloud Storage.

Lớp học lập trình này sử dụng các mẫu nodejs trong các ví dụ bên dưới. Tuy nhiên, bạn có thể sử dụng mã mẫu Cloud Functions thế hệ thứ 2 bằng ngôn ngữ mà bạn chọn:

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

  • Cách triển khai một hàm Cloud Run dựa trên sự kiện được kích hoạt bất cứ khi nào một đối tượng được tải lên bộ chứa GCS
  • Cách tạo tài khoản dịch vụ có vai trò phù hợp để nhận sự kiện từ Cloud Storage và gọi hàm Cloud Run

2. Thiết lập các biến môi trường và bật API

Cập nhật gcloud CLI

Codelab này yêu cầu bạn cài đặt phiên bản gần đây của gcloud CLI. Bạn có thể cập nhật CLI bằng cách chạy

gcloud components update

Bật API

Để có thể bắt đầu sử dụng lớp học lập trình này, bạn cần bật một số API. Lớp học lập trình này yêu cầu bạn sử dụng các API sau. Bạn có thể bật các API đó bằng cách chạy lệnh sau:

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

Thiết lập các biến môi trường

Bạn có thể thiết lập các biến môi trường sẽ được dùng trong suốt lớp học lập trình này.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. Tạo một Nhóm lưu trữ và một Tài khoản dịch vụ

Tạo bộ chứa lưu trữ

Bạn có thể tạo một vùng chứa Cloud Storage bằng cách chạy lệnh sau:

gsutil mb -l us-central1 gs://$BUCKET_NAME

Tạo một tài khoản dịch vụ

Trong ví dụ này, bạn sẽ tạo một tài khoản dịch vụ có các quyền EventArc bắt buộc và vai trò người gọi Cloud Run để nhận một sự kiện từ Cloud Storage và gọi hàm Cloud Run.

Trước tiên, hãy tạo tài khoản dịch vụ.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

SERVICE_ACCOUNT="cloud-run-functions"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

Tiếp theo, hãy cấp vai trò Eventarc Event Receiver (roles/eventarc.eventReceiver) cho dự án đối với tài khoản dịch vụ được liên kết với trình kích hoạt Eventarc để trình kích hoạt có thể nhận các sự kiện từ nhà cung cấp sự kiện.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

Sau đó, cấp cho tài khoản dịch vụ vai trò người gọi Cloud Run để tài khoản đó có thể gọi hàm.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

4. Tạo và triển khai hàm

Trước tiên, hãy tạo một thư mục cho mã nguồn và chuyển đến thư mục đó.

mkdir ../$SERVICE_NAME && cd $_

Sau đó, hãy tạo một tệp package.json có nội dung sau:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

Tiếp theo, hãy tạo tệp index.js có nội dung sau:

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

Giờ đây, bạn có thể triển khai hàm Cloud Run bằng cách chạy lệnh sau:

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

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
  • (không bắt buộc) –no-allow-unauthenticated để ngăn hàm của bạn có thể được gọi công khai

Bạn có thể xem crf-event-codelab dịch vụ mới bằng cách chạy lệnh sau:

gcloud beta run services describe $SERVICE_NAME

5. Tạo sự kiện

Chúng ta có thể tạo một trình kích hoạt Eventarc để gửi thông báo đến hàm của mình mỗi khi một đối tượng được hoàn tất trong Google Cloud Storage:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

Xin lưu ý những điều sau:

  • gcs-function-trigger là tên của điều kiện kích hoạt
  • crf-event-codelab là tên của dịch vụ Cloud Run nơi hàm của chúng ta được triển khai
  • đối với cờ –event-filters, đừng sử dụng tiền tố gs:// trong tên nhóm của bạn.

Bạn có thể xem hướng dẫn chi tiết về cách thiết lập dịch vụ Kích hoạt từ Cloud Storage bằng Eventarc trong tài liệu về Cloud Run tại đây: https://cloud.google.com/run/docs/tutorials/eventarc

6. Kiểm thử hàm

Khi quá trình triển khai hoàn tất, bạn sẽ thấy URL của dịch vụ. Để gọi hàm này, bạn cần gửi một yêu cầu đã xác thực bằng mã thông báo nhận dạng của bạn hoặc mã thông báo nhận dạng của một nguyên tắc có vai trò Cloud Run Invoker, như minh hoạ dưới đây:

# get the Service URL
SERVICE_URL="$(gcloud run services describe $SERVICE_NAME --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Sau khi triển khai hàm và tạo một điều kiện kích hoạt, giờ đây, chúng ta đã sẵn sàng gọi hàm.

Tạo một tệp rồi tải tệp đó lên bộ chứa Cloud Storage. Bạn có thể thực hiện việc này thông qua giao diện web Cloud Console hoặc bằng công cụ gsutil CLI, ví dụ:

echo "hello world" > test.txt
gsutil cp test.txt gs://$BUCKET_NAME

Khi tệp được tải lên thành công, một sự kiện sẽ được tạo và hàm của bạn sẽ in một số thông tin cơ bản về đối tượng, ví dụ: tên tệp. Bạn có thể tìm thấy đầu ra này trong các mục nhật ký của hàm trong Cloud Console. Ngoài ra, bạn có thể truy vấn đầu ra này bằng gcloud CLI:

gcloud logging read "resource.labels.service_name=$SERVICE_NAME AND textPayload: File" --format=json 

và bạn sẽ thấy kết quả sau

"textPayload": "File: test.txt"

7. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình này!

Bạn nên xem tài liệu về các hàm Cloud Run

Nội dung đã đề cập

  • Cách triển khai một hàm Cloud Run dựa trên sự kiện được kích hoạt bất cứ khi nào một đối tượng được tải lên bộ chứa GCS
  • Cách tạo tài khoản dịch vụ có vai trò phù hợp để nhận sự kiện từ Cloud Storage và gọi hàm Cloud Run

8. Dọn dẹp

Để tránh bị tính phí ngoài ý muốn (ví dụ: nếu dịch vụ Cloud Run này được gọi nhiều lần hơn hạn mức gọi Cloud Run hằng tháng của bạn trong bậc miễn phí), bạn có thể xoá dịch vụ Cloud Run hoặc xoá dự án mà bạn đã tạo ở Bước 2.

Để xoá các dịch vụ Cloud Run, hãy truy cập vào Cloud Console của Cloud Run tại https://console.cloud.google.com/run/ rồi xoá dịch vụ crf-event-codelab mà bạn đã tạo trong lớp học lập trình này.

Nếu chọn xoá toàn bộ dự án, bạn có thể truy cập vào https://console.cloud.google.com/cloud-resource-manager, chọn dự án bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án có sẵn bằng cách chạy gcloud projects list.