1. Giới thiệu
Tổng quan
Chức năng đám mây 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.
Có 2 phương pháp chính để kiểm soát 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 vệ 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 qua 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 danh tính gcloud của bạn để gọi một Hàm nhằm phát triển cục bộ và mục đích thử nghiệm
- 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 đối với Google Cloud API, ví dụ: 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 quy trình xác thực trên Chức năng đám mây và xác minh rằng quy trình 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
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
- Trước đây, bạn đã triển khai một HTTP được kích hoạt Hàm đám mây thế hệ thứ 2
- (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 của Google Xác thực hỗ trợ.
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].
3. Tạo và kiểm thử một Hàm đám mây đã được xác thực
Lớp học lập trình này làm theo hướng dẫn tương tự cho phần Bắt đầu nhanh bảng điều khiển dành cho Hàm đám mây, ngoại trừ 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 gọi Hàm phải có vai trò Cloud Functions Invoker (và Cloud Run Invoker cho thế hệ 2); nếu không, Hàm sẽ trả về lỗi 403 Cấm. Lớp học lập trình này sẽ hướng dẫn cách cấp vai trò thích hợp của Trình gọi cho một nguyên tắc.
Tạo hàm được xác thực
Dưới đây là các bước để sử dụng Cloud Console:
- Truy cập trang Tổng quan về Cloud Functions rồi nhấp vào Create Function
- Trong tuỳ chọn Environment (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 để 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
Mất khoảng 1 phút để triển khai Hàm.
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ác lệnh gcloud
được dùng trong lớp học lập trình này.
Bạn sẽ muốn chỉ định vùng cho Hàm của mình. 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 có yêu cầu xác thực bằng cách gọi dưới dạng người gọi ẩn danh
Bạn sẽ gọi hàm này mà không cần xác thực để xác minh rằng bạn gặp phải lỗi 403 dự kiến.
Trên mộ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>
Giờ đây, bạn đã sẵn sàng tìm hiểu 3 tình huống mà bạn có thể gọi Hàm bằng cách cung cấp phương thức xác thực.
4. Trường hợp 1: Sử dụng mã thông báo nhận dạng gcloud của bạn
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`
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 thành một biến môi trường.
ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")
Bạn có thể xem thêm thông tin về cách thiết lập gcloud init và đăng nhập 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 Bị cấm, hãy đảm bảo rằng danh tính của bạn có vai trò Trình Invoker trên đám mây hoặc vai trò Cloud Run Invoker cho các hàm thế hệ thứ 2. Bạn có thể dùng bảng điều khiển IAM để xác minh các vai trò được cấp cho hiệu trưởng.
Mặc dù việc sử dụng mã nhận dạng riêng là một cách nhanh chóng để kiểm thử chức năng trong quá trình phát triển, nhưng phương thức gọi của hàm được xác thực 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 Generic (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ò để gọi 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 một 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ể thử nghiệm chức năng của mình giống như thông tin đăng nhập trong phiên bản chính thức.
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 về đặc quyền tối thiểu bằng cách không phải cấp vai trò Trình gọi hàm đám mây cho các danh tính khác chỉ dành cho mục đích kiểm thử cục bộ.
Nhằm 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ò để 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 Function Authentication codelab"
Và cấp vai trò người gọi trong Tài khoản dịch vụ Cloud Function
gcloud functions add-iam-policy-binding my-authenticated-function \ --region=us-central1 --gen2 \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role='roles/cloudfunctions.invoker'
Gọi 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 nhận dạng của tài khoản đó.
Thêm các vai trò bắt buộc để mạo danh
Đối với trường hợp 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 giá trị 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 nhận dạng của tài khoản dịch vụ
Bây giờ, bạn có thể gọi 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)"
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 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ử cục bộ các Hàm đám mây của bạn | 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 những thông tin xác thực đó để xác thực với Google Cloud API. Cờ –mạo danh-dịch-vụ-tài khoản 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 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 bằ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ụ để gọi 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 ứng dụng Node.js trên thiết bị.
Dưới đây là các bước cho Node.js:
- Tạo ứng dụng Node.js mới
npm init
- Cài đặt thư viện ứng dụng Xác thực của Google
npm install google-auth-library
- Tạo một tệp
index.js
- Truy xuất URL của Hàm đám mây mà bạn sẽ thêm vào mã ở bước sau.
echo $FUNCTION_URL
- Thêm mã sau vào chỉ mục.js. Hãy nhớ thay đổi biến Đối tượng mục tiêu thành URL Hàm đám mây của bạn.
chỉ mục.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 gặp lỗi "iam.serviceAccounts.getOpenIdToken" bị từ chối trên tài nguyên (hoặc 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 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 chứa thông tin đăng nhập 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!
Bạn nên xem tài liệu về cách bảo mật Hàm đám mây.
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 Cloud Functions để tìm hiểu cách phát triển và kiểm thử Chức năng đám mây trong môi trường nhà phát triển cục bộ.
Nội dung đã đề cập
- Cách định cấu hình quy trình xác thực trên Chức năng đám mây và xác minh rằng quy trình 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 các khoản phí vô tình (ví dụ: Hàm đám mây này vô tình bị gọi nhiều lần hơn mức phân bổ lệnh gọi Hàm đám mây hằng tháng của bạn ở bậc miễn phí), bạn có thể xoá Hàm đám mây hoặc xoá dự án 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 Function Cloud Console 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 bạn đang 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ể truy cập vào https://console.cloud.google.com/cloud-resource-manager, chọn dự án mà 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
.