1. Giới thiệu
Tổng quan
Các hàm Cloud Run là một giải pháp điện toán gọn nhẹ dành cho nhà phát triển để tạo các hàm độc lập, 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ôi trường máy chủ hoặc thời gian chạy. Tìm hiểu thêm về các hàm Cloud Run trong bài đăng trên blog của chúng tôi.
Có hai phương pháp chính để kiểm soát các lệnh gọi đến các hàm Cloud Run: 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 thực hiện 3 tình huống bảo mật quyền truy cập dựa trên danh tính để gọi một hàm:
- Sử dụng mã thông báo nhận dạng gcloud để gọi một hàm cho mục đích phát triển và kiểm thử cục bộ
- Mạo danh một tài khoản dịch vụ khi phát triển và thử nghiệm cục bộ để sử dụng cùng thông tin đăng nhập như trong bản phát hành công khai
- Sử dụng thư viện ứng dụng của Google để xử lý việc xác thực với Google Cloud API, chẳng hạn như khi một dịch vụ cần gọi một hàm
Kiến thức bạn sẽ học được
- Cách định cấu hình tính năng xác thực trên một hàm Cloud Run và xác minh tính năng xác thực đã được định cấu hình đúng cách
- Gọi 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 tài khoản dịch vụ và cấp cho tài khoản đó vai trò thích hợp để gọi 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 để gọi một hàm
2. Cách thiết lập và các yêu cầu
Điều kiện tiên quyết
- Bạn đã đăng nhập vào Cloud Console
- Trước đây, bạn đã triển khai một hàm Cloud Run được kích hoạt bằng HTTP. Xem ví dụ về cách bắt đầu nhanh.
- (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ỳ môi trường 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 khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về tính năng này. 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 tải tất cả các công cụ phát triển cần thiết. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp cải thiện đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện hầu hết (nếu không phải 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 không, bạn có thể đặt giá trị này bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả của lệnh
Updated property [core/project].
3. Tạo và kiểm thử một hàm Cloud Run đã xác thực
Việc yêu cầu xác thực có nghĩa là nguyên tắc gọi hàm phải có vai trò là Trình gọi Cloud Run; nếu không, hàm sẽ trả về lỗi 403 Forbidden (Cấm). Lớp học lập trình này sẽ cho bạn biết cách cấp các vai trò Invoker (Trình gọi) thích hợp cho một nguyên tắc.
Thiết lập biến môi trường cục bộ cho các lệnh gcloud được đơn giản hoá
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.
REGION=us-central1 PROJECT_ID=$(gcloud config get-value project)
Tạo mã nguồn cho hàm
Mặc dù lớp học lập trình này sử dụng Node.js, nhưng bạn có thể sử dụng bất kỳ môi trường thời gian chạy nào được thư viện ứng dụng Google Auth hỗ trợ.
Trước tiên, hãy tạo một thư mục và cd vào thư mục đó.
mkdir auth-function-codelab && cd $_
Sau đó, hãy tạo tệp package.json.
touch package.json echo '{ "dependencies": { "@google-cloud/functions-framework": "^3.0.0" } } ' > package.json
Tiếp theo, hãy tạo tệp nguồnindex.js.
touch index.js echo 'const functions = require("@google-cloud/functions-framework"); functions.http("helloWorld", (req, res) => { res.send(`Hello ${req.query.name || req.body.name || "World"}!`); });' > index.js
Tạo hàm được xác thực
Dưới đây là các bước để tạo một hàm đã xác thực cho môi trường thời gian chạy nodejs20. Tuy nhiên, 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ợ.
FUNCTION_NAME=authenticated-function-codelab ENTRY_POINT=helloWorld
Để triển khai hàm Cloud Run ngay trên Cloud Run, hãy chạy lệnh sau:
gcloud beta run deploy $FUNCTION_NAME \ --source . \ --function helloWorld \ --region $REGION \ --no-allow-unauthenticated
sau đó, bạn có thể lưu URL hàm dưới dạng biến môi trường để sử dụng sau.
FUNCTION_URL="$(gcloud run services describe $FUNCTION_NAME --region $REGION --format 'value(status.url)')"
Nếu bạn muốn triển khai dưới dạng Cloud Functions thế hệ thứ 2, hãy dùng lệnh sau:
gcloud functions deploy nodejs-http-function \ --gen2 \ --runtime=nodejs20 \ --region=$REGION \ --source=. \ --entry-point=helloWorld \ --trigger-http \ --no-allow-unauthenticated
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.
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --gen2 --region us-central1 --format='get(serviceConfig.uri)')"
Xác minh hàm yêu cầu xác thực bằng cách cố gắng gọi dưới dạng phương thức gọi ẩn danh
Bạn sẽ gọi hàm mà không cần xác thực để xác minh rằng bạn nhận được lỗi 403 như dự kiến.
Từ dòng lệnh, hãy chạy lệnh curl
sau:
curl -i $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 tìm hiểu 3 trường hợp mà bạn có thể gọi Hàm bằng cách cung cấp thông tin xác thực.
4. Tình huống 1: Sử dụng mã thông báo nhận dạng gcloud
Là một nhà phát triển, bạn sẽ muốn có một cách để kiểm thử hàm của mình trong khi phát triển hàm trên máy. Trong phần này, bạn sẽ thực hiện kiểm tra nhanh để xác minh rằng hàm này đượ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 thông tin nhận dạng đ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`
Bạn có thể tìm thêm thông tin về cách thiết lập gcloud init và đăng nhập bằng tính năng xác thực gcloud trong tài liệu.
Tiếp theo, hãy gọi Hàm và truyền vào hàm đó mã nhận dạng.
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 gặp lỗi 403 Forbidden (Cấm), hãy đảm bảo danh tính của bạn có vai trò Trình gọi Cloud Run. 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 thực thể chính.
Mặc dù việc sử dụng mã thông báo nhận dạng 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 của hàm đã xác thực sẽ cần 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 Forbidden (Cấm).
Bạn nên tuân thủ nguyên tắc đặ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ò gọi hàm. Trong trường hợp tiếp theo, bạn sẽ tìm hiểu cách 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ò thích hợp để gọi hàm.
5. Tình huống 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ụ để gọi 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 thông tin xác thực giống như trong môi trường sản xuất.
Bằng cách này, bạn không chỉ xác minh vai trò mà còn tuân thủ nguyên tắc cấp quyền tối thiểu bằng cách không phải cấp vai trò Người gọi hàm trên đám mây cho các danh tính khác chỉ cho mục đích kiểm thử cục bộ.
Đối với 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ò để gọi 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 để đại diện cho những tài khoản dịch vụ 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 Run function Authentication codelab"
Đồng thời cấp cho tài khoản dịch vụ vai trò trình gọi Cloud Run:
gcloud run services add-iam-policy-binding $FUNCTION_NAME \ --region=us-central1 \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role='roles/run.invoker'
Gọi hàm bằng cách mạo danh tài khoản dịch vụ
Để làm 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 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ò Trình tạo mã thông báo tài khoản dịch vụ (roles/iam.serviceAccountTokenCreator) để tạo mã thông báo nhận dạng cho tài khoản dịch vụ đó.
Bạn có thể chạy các lệnh sau để cấp vai trò này cho tài khoản người dùng đang hoạt động:
ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)") 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 nhận dạng của tài khoản dịch vụ
Hãy chờ vài phút để quyền được áp dụng. Bây giờ, bạn có thể gọi Hàm bằng cách truyền mã thông báo 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)"
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. Tình huống 3: Sử dụng thư viện ứng dụng của 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 nhận dạng cho tài khoản dịch vụ, sau đó gọi Hàm theo phương thức lập trình bằng Thư viện ứng dụng Auth của Google 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 của Google trong phần giải thích về thư viện ứng dụng của tài liệu.
Việc sử dụng ADC là rất quan trọng khi bạn muốn viết và kiểm thử Hàm trên máy (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ẽ tìm hiểu cách để một dịch vụ gọi một Hàm khác 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ử Chức năng đám mây trên thiết bị | Blog của Google Cloud
Chạy lệnh gcloud để mạo danh một 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 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 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
Giờ đây, 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 mình.
Tạo và chạy một dịch vụ để gọi một hàm đã xác thực
Bạn có thể cài đặt thư viện ứng dụng Google Auth riêng cho từng môi trường thời gian chạy. Lớp học lập trình này hướng dẫn bạn cách tạo và chạy ứng dụng Node.js trên thiết bị.
Dưới đây là các bước cho Node.js:
- Tạo thư mục mới
mkdir local-dev && cd $_
- Tạo ứng dụng Node.js mới
npm init -y
- 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 hàm Cloud Run mà bạn sẽ thêm vào mã của mình ở bước sau.
echo $FUNCTION_URL
- Thêm mã sau vào index.js. Hãy nhớ thay đổi biến targetAudience thành URL hàm Cloud Run của bạn.
index.js
// Cloud Functions uses your function's url as the `targetAudience` value
const targetAudience = '<YOUR-CLOUD-RUN-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ả là "Hello World!" ("Xin chào thế giới!")
Khắc phục sự cố
Nếu bạn gặp lỗi Quyền "iam.serviceAccounts.getOpenIdToken" bị từ chối trên tài nguyên (hoặc quyền này có thể không tồn tại). Vui lòng chờ vài phút để vai trò Người tạo mã thông báo tài khoản dịch vụ được áp dụng.
Nếu bạn gặp lỗi Không thể tìm nạp mã thông báo 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ụ, 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!
Bạn nên tham khảo tài liệu về cách bảo mật các hàm Cloud Run.
Bạn cũng nên xem bài đăng này trên blog về hoạt động phát triển cục bộ bằng các hàm Cloud Run để tìm hiểu cách phát triển và kiểm thử hàm Cloud Run trong môi trường cục bộ dành cho nhà phát triển của bạn.
Nội dung đã đề cập
- Cách định cấu hình tính năng xác thực trên một hàm Cloud Run và xác minh tính năng xác thực đã được định cấu hình đúng cách
- Gọi 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 tài khoản dịch vụ và cấp cho tài khoản đó vai trò thích hợp để gọi 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ó vai trò thích hợp để gọi một hàm
8. Dọn dẹp
Để tránh bị tính phí do nhầm lẫn (ví dụ: Hàm trên đám mây này vô tình được gọi nhiều lần hơn mức phân bổ số lần gọi hàm trên Cloud Run hằng tháng trong cấp miễn phí), bạn có thể xoá Hàm trên đám mây 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á hàm Cloud Run, hãy truy cập vào Cloud Console của hàm Cloud Run tại https://console.cloud.google.com/functions/ Đảm bảo dự án bạn đã tạo ở bước 2 là dự án hiện được chọn.
Chọn hàm được xác thực của tôi mà bạn đã triển khai trước đó. Sau đó, nhấn vào Delete (Xoá).
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ẽ phải thay đổi các dự án trong Cloud SDK của mình. Bạn có thể xem danh sách tất cả dự án hiện có bằng cách chạy gcloud projects list
.