1. Giới thiệu
Tổng quan
Cloud Functions là một giải pháp tính toán gọn nhẹ dành cho nhà phát triển để tạo các hàm độc lập, có mục đích duy nhất có thể được kích hoạt bằng HTTPS hoặc phản hồi CloudEvents mà không cần quản lý máy chủ hoặc môi trường thời gian chạy.
Có 2 phương pháp chính để kiểm soát các lệnh gọi đến Cloud Functions: bảo mật quyền truy cập dựa trên danh tính và bảo mật quyền truy cập bằng các biện pháp kiểm soát quyền truy cập dựa trên mạng. Lớp học lập trình này tập trung vào phương pháp đầu tiên và hướng dẫn bạn 3 trường hợp để bảo mật quyền truy cập dựa trên danh tính nhằm kích hoạt một Hàm:
- Sử dụng mã thông báo danh tính gcloud để kích hoạt một Hàm cho mục đích phát triển và kiểm thử cục bộ
- Mạo danh tài khoản dịch vụ khi phát triển và kiểm thử cục bộ để sử dụng cùng một thông tin xác thực như trong môi trường phát hành chính thức
- Sử dụng thư viện ứng dụng Google để xử lý quy trình xác thực đối với các Cloud APIs của Google, chẳng hạn như khi một dịch vụ cần kích hoạt một Hàm
Kiến thức bạn sẽ học được
- Cách định cấu hình quy trình xác thực trên một Cloud Function và xác minh rằng quy trình xác thực đã được định cấu hình đúng cách
- Kích hoạt một hàm đã xác thực từ môi trường phát triển cục bộ bằng cách cung cấp mã thông báo cho danh tính gcloud của bạn
- Cách tạo một tài khoản dịch vụ và cấp cho tài khoản đó vai trò thích hợp để kích hoạt một hàm
- Cách mạo danh một dịch vụ từ môi trường phát triển cục bộ có các vai trò thích hợp để kích hoạt một hàm
2. Thiết lập và yêu cầu
Điều kiện tiên quyết
- Bạn đã đăng nhập vào Cloud Console
- Bạn đã triển khai một Cloud Function thế hệ thứ 2 được kích hoạt bằng HTTP
- (không bắt buộc) Đối với trường hợp thứ 3, lớp học lập trình này sử dụng Node.js và npm làm ví dụ, nhưng bạn có thể sử dụng bất kỳ thời gian chạy nào được thư viện ứng dụng Google Auth hỗ trợ.
Kích hoạt Cloud Shell
- Trên Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.

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.

Quá trình cung cấ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. Máy ảo này cung cấp một thư mục chính 5 GB liên tục và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và quy trình 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 một 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.
- 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ả đầu ra 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ả đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt bằng lệnh này:
gcloud config set project <PROJECT_ID>
Kết quả đầu ra của lệnh
Updated property [core/project].
3. Tạo và kiểm thử một Cloud Function đã xác thực
Lớp học lập trình này tuân theo cùng một hướng dẫn cho phần Bắt đầu nhanh với Cloud Functions trong Console, với một ngoại lệ đáng chú ý: Hàm của bạn sẽ yêu cầu xác thực.
Yêu cầu xác thực có nghĩa là nguyên tắc kích hoạt Hàm phải có vai trò Cloud Functions Invoker (và Cloud Run Invoker cho thế hệ thứ 2); nếu không, Hàm sẽ trả về lỗi 403 Bị cấm. Lớp học lập trình này sẽ hướng dẫn cách cấp vai trò Invoker thích hợp cho một nguyên tắc.
Tạo hàm đã xác thực
Dưới đây là các bước sử dụng Cloud Console:
- Chuyển đến trang Tổng quan về Cloud Functions rồi nhấp vào Tạo hàm
- Trong tuỳ chọn Môi trường, hãy chọn Thế hệ thứ 2
- Đặt tên cho Hàm là my-authenticated-function
- Trong trường Xác thực, hãy để giá trị mặc định là Yêu cầu xác thực

- Nhấp vào Tiếp theo
- Đối với lớp học lập trình này, bạn có thể chọn bất kỳ ngôn ngữ nào
- Sau đó, nhấn vào Triển khai
Quá trình triển khai Hàm mất khoảng 1 phút.
Thiết lập các biến môi trường cục bộ để đơn giản hoá các lệnh gcloud
Trước tiên, bạn sẽ tạo một vài biến môi trường để cải thiện khả năng đọc của các lệnh gcloud được sử dụng trong lớp học lập trình này.
Bạn nên chỉ định khu vực cho Hàm. Ví dụ này sử dụng us-central1.
REGION="us-central1"
sau đó, bạn có thể lưu URL Hàm dưới dạng biến môi trường để sử dụng sau này.
PROJECT_ID=$(gcloud config get-value project) FUNCTION_URL="$(gcloud functions describe my-authenticated-function --gen2 --region us-central1 --format='get(serviceConfig.uri)')"
Xác minh rằng hàm yêu cầu xác thực bằng cách cố gắng kích hoạt dưới dạng người gọi ẩn danh
Bạn sẽ kích hoạt hàm mà không cần xác thực để xác minh rằng bạn nhận được lỗi 403 dự kiến.
Từ dòng lệnh, hãy chạy lệnh curl sau:
curl $FUNCTION_URL
Bạn sẽ thấy kết quả sau:
<html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>403 Forbidden</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Forbidden</h1> <h2>Your client does not have permission to get URL <code>/</code> from this server.</h2> <h2></h2> </body></html>
Bây giờ, bạn đã sẵn sàng xem qua 3 trường hợp mà bạn có thể kích hoạt Hàm bằng cách cung cấp thông tin xác thực.
4. Trường hợp 1: Sử dụng mã thông báo danh tính gcloud
Là nhà phát triển, bạn sẽ muốn có cách kiểm thử hàm trong khi đang phát triển hàm đó cục bộ. Trong phần này, bạn sẽ thực hiện một bài kiểm thử nhanh để xác minh rằng hàm đã được xác thực đúng cách bằng danh tính của riêng bạn.
Xác minh rằng bạn đã được xác thực bằng gcloud bằng cách chạy lệnh sau:
gcloud auth list
Bạn sẽ thấy một dấu hoa thị bên cạnh danh tính đang hoạt động của mình, ví dụ:
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
Sau khi xác minh rằng bạn đang sử dụng đúng danh tính, bạn sẽ lưu email tài khoản vào một biến môi trường.
ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")
Bạn có thể tìm thêm thông tin về cách thiết lập gcloud init và gcloud auth login trong tài liệu.
Tiếp theo, hãy kích hoạt Hàm và truyền mã thông báo danh tính của bạn.
curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token)"
Bây giờ, bạn sẽ thấy kết quả:
Hello World!
Khắc phục sự cố
Nếu bạn nhận được lỗi 403 Bị cấm, hãy đảm bảo rằng danh tính của bạn có vai trò Cloud Functions Invoker hoặc vai trò Cloud Run Invoker cho các hàm thế hệ thứ 2. Bạn có thể sử dụng bảng điều khiển IAM để xác minh các vai trò được cấp cho một nguyên tắc.
Mặc dù việc sử dụng mã thông báo danh tính của riêng bạn là một cách nhanh chóng để kiểm thử hàm trong quá trình phát triển, nhưng phương thức gọi hàm đã xác thực của bạn sẽ cần có các vai trò thích hợp; nếu không, phương thức gọi sẽ nhận được lỗi 403 Bị cấm.
Bạn nên tuân theo nguyên tắc về đặc quyền tối thiểu bằng cách giới hạn số lượng danh tính và tài khoản dịch vụ có vai trò kích hoạt hàm.
tạo một tài khoản dịch vụ mới và cấp cho tài khoản đó các vai trò cần thiết.
5. Trường hợp 2: Mạo danh tài khoản dịch vụ
Trong trường hợp này, bạn sẽ mạo danh (tức là giả định quyền của) một tài khoản dịch vụ để kích hoạt một hàm khi phát triển và kiểm thử cục bộ. Bằng cách mạo danh một tài khoản dịch vụ, bạn có thể kiểm thử hàm của mình bằng cùng một thông tin xác thực như trong môi trường phát hành chính thức.
Bằng cách này, bạn không chỉ xác minh các vai trò mà còn tuân theo nguyên tắc về đặc quyền tối thiểu bằng cách không phải cấp vai trò Cloud Function Invoker cho các danh tính khác chỉ cho mục đích kiểm thử cục bộ.
Để phục vụ mục đích của lớp học lập trình này, bạn sẽ tạo một tài khoản dịch vụ mới chỉ có các vai trò để kích hoạt hàm mà bạn đã tạo trong lớp học lập trình này.
Tạo tài khoản dịch vụ mới
Trước tiên, bạn sẽ tạo một vài biến môi trường bổ sung để biểu thị các tài khoản dịch vụ được sử dụng trong các lệnh gcloud.
SERVICE_ACCOUNT_NAME="invoke-functions-codelab" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
Tiếp theo, bạn sẽ tạo tài khoản dịch vụ.
gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \ --display-name="Cloud Function Authentication codelab"
Và cấp vai trò trình kích hoạt Cloud Function cho tài khoản dịch vụ
gcloud functions add-iam-policy-binding my-authenticated-function \ --region=us-central1 --gen2 \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role='roles/cloudfunctions.invoker'
Kích hoạt hàm bằng cách mạo danh tài khoản dịch vụ
Để thực hiện việc này, bạn sẽ mạo danh tài khoản dịch vụ mới tạo bằng cách lấy mã thông báo mã nhận dạng của tài khoản đó.
Thêm các vai trò bắt buộc để mạo danh
Để mạo danh một tài khoản dịch vụ, tài khoản người dùng của bạn cần có vai trò Người tạo mã thông báo tài khoản dịch vụ (roles/iam.serviceAccountTokenCreator) để tạo mã thông báo mã nhận dạng cho tài khoản dịch vụ.
gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT_ADDRESS \ --member user:$ACCOUNT_EMAIL \ --role='roles/iam.serviceAccountTokenCreator'
Sử dụng mã thông báo mã nhận dạng của tài khoản dịch vụ
Bây giờ, bạn có thể kích hoạt Hàm bằng cách truyền mã thông báo mã nhận dạng của tài khoản dịch vụ.
curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token --impersonate-service-account $SERVICE_ACCOUNT_ADDRESS)"
Và bạn sẽ thấy như sau:
WARNING: This command is using service account impersonation. All API calls will be executed as [invoke-functions-codelab@<project-id>.iam.gserviceaccount.com]. Hello World!
6. Trường hợp 3: Sử dụng thư viện ứng dụng Google
Đối với phần cuối cùng của lớp học lập trình này, bạn sẽ chạy một dịch vụ nhỏ cục bộ để tạo mã thông báo mã nhận dạng cho một tài khoản dịch vụ, sau đó gọi Hàm theo phương thức lập trình bằng cách sử dụng thư viện ứng dụng Google Auth và Thông tin xác thực mặc định của ứng dụng (ADC). Bạn có thể đọc thêm về thư viện ứng dụng Google trong phần thư viện ứng dụng được giải thích của tài liệu.
Việc sử dụng ADC đặc biệt quan trọng khi bạn muốn viết và kiểm thử Hàm cục bộ (ví dụ: trên máy tính xách tay, trong Cloud Shell, v.v.) trong khi tương tác với các tài nguyên khác của Google Cloud (ví dụ: Cloud Storage, Vision API, v.v.) Trong ví dụ này, bạn sẽ thấy cách để một dịch vụ kích hoạt một Hàm khác yêu cầu xác thực. Để biết thêm thông tin về ADC và quá trình phát triển cục bộ, hãy xem bài đăng trên blog Cách phát triển và kiểm thử Cloud Functions cục bộ | Blog Google Cloud
Chạy lệnh gcloud để mạo danh tài khoản dịch vụ
ADC tự động tìm thông tin xác thực dựa trên môi trường ứng dụng và sử dụng thông tin xác thực đó để xác thực đối với các API của Google Cloud. Cờ –impersonate-service-account cho phép bạn mạo danh một tài khoản dịch vụ bằng cách sử dụng danh tính của tài khoản đó để xác thực đối với các API của Google Cloud.
Để mạo danh một tài khoản dịch vụ, bạn có thể chạy lệnh sau:
gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS
Bây giờ, bạn đang chạy các lệnh gcloud dưới dạng tài khoản dịch vụ đó, thay vì danh tính của bạn.
Tạo và chạy một dịch vụ để kích hoạt một hàm đã xác thực
Mỗi thời gian chạy đều có thư viện ứng dụng Google Auth riêng mà bạn có thể cài đặt. Lớp học lập trình này hướng dẫn bạn cách tạo và chạy một ứng dụng Node.js cục bộ.
Dưới đây là các bước dành cho Node.js:
- Tạo ứng dụng Node.js mới
npm init
- Cài đặt thư viện ứng dụng Google Auth
npm install google-auth-library
- Tạo tệp
index.js - Truy xuất URL của Cloud Function mà bạn sẽ thêm vào mã của mình trong bước sau.
echo $FUNCTION_URL
- Thêm mã sau vào index.js. Đảm bảo thay đổi biến targetAudience thành URL Cloud Function của bạn.
index.js
// Cloud Functions uses your function's url as the `targetAudience` value
const targetAudience = '<YOUR-CLOUD-FUNCTION-URL>';
// For Cloud Functions, endpoint(`url`) and `targetAudience` should be equal
const url = targetAudience;
const { GoogleAuth } = require('google-auth-library');
const auth = new GoogleAuth();
async function request() {
console.info(`request ${url} with target audience ${targetAudience}`);
// this call retrieves the ID token for the impersonated service account
const client = await auth.getIdTokenClient(targetAudience);
const res = await client.request({ url });
console.info(res.data);
}
request().catch(err => {
console.error(err.message);
process.exitCode = 1;
});
- Chạy ứng dụng
node index.js
Và bạn sẽ thấy kết quả "Hello World!"
Khắc phục sự cố
Nếu bạn thấy lỗi Quyền "iam.serviceAccounts.getOpenIdToken" bị từ chối trên tài nguyên (hoặc tài nguyên đó có thể không tồn tại)., vui lòng đợi vài phút để vai trò Người tạo mã thông báo tài khoản dịch vụ được truyền.
Nếu bạn nhận được lỗi Không thể tìm nạp mã thông báo mã nhận dạng trong môi trường này, hãy sử dụng GCE hoặc đặt biến môi trường GOOGLE_APPLICATION_CREDENTIALS thành tệp JSON thông tin xác thực tài khoản dịch vụ, thì có thể bạn đã quên chạy lệnh
gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS
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 lại tài liệu về cách bảo mật Cloud Functions.
Bạn cũng nên xem bài đăng trên blog này về quá trình phát triển cục bộ bằng Cloud Functions để tìm hiểu cách phát triển và kiểm thử Cloud Function trong môi trường nhà phát triển cục bộ.
Nội dung chúng ta đã đề cập
- Cách định cấu hình quy trình xác thực trên một Cloud Function và xác minh rằng quy trình xác thực đã được định cấu hình đúng cách
- Kích hoạt một hàm đã xác thực từ môi trường phát triển cục bộ bằng cách cung cấp mã thông báo cho danh tính gcloud của bạn
- Cách tạo một tài khoản dịch vụ và cấp cho tài khoản đó vai trò thích hợp để kích hoạt một hàm
- Cách mạo danh một dịch vụ từ môi trường phát triển cục bộ có các vai trò thích hợp để kích hoạt một hàm
8. Dọn dẹp
Để tránh bị tính phí ngoài ý muốn (ví dụ: Cloud Function này vô tình được kích hoạt nhiều lần hơn hạn mức kích hoạt Cloud Function hằng tháng trong gói miễn phí), bạn có thể xoá Cloud Function hoặc xoá dự án mà bạn đã tạo ở Bước 2.
Để ngừng mạo danh tài khoản dịch vụ, bạn có thể đăng nhập lại bằng danh tính của mình:
gcloud auth application-default login
Để xoá Cloud Function, hãy chuyển đến Cloud Console của Cloud Function tại https://console.cloud.google.com/functions/. Đảm bảo rằng dự án bạn đã tạo ở bước 2 là dự án hiện được chọn.
Chọn my-authenticated-function mà bạn đã triển khai trước đó. Sau đó, nhấn vào Xoá.
Nếu chọn xoá toàn bộ dự án, bạn có thể chuyển đến 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 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.