Triển khai an toàn cho Cloud Run

1. Tổng quan

Bạn sẽ sửa đổi các bước mặc định để triển khai dịch vụ trên Cloud Run nhằm cải thiện tính bảo mật, sau đó xem cách truy cập vào ứng dụng đã triển khai một cách an toàn. Ứng dụng này là "dịch vụ đăng ký đối tác" của ứng dụng Cymbal Eats. Các công ty hợp tác với Cymbal Eats sử dụng ứng dụng này để xử lý đơn đặt món ăn.

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

Bằng cách thực hiện một vài thay đổi nhỏ đối với các bước tối thiểu mặc định để triển khai ứng dụng lên Cloud Run, bạn có thể tăng đáng kể tính bảo mật của ứng dụng. Bạn sẽ lấy một ứng dụng hiện có và hướng dẫn triển khai, sau đó thay đổi các bước triển khai để cải thiện tính bảo mật của ứng dụng đã triển khai.

Sau đó, bạn sẽ thấy cách uỷ quyền truy cập vào ứng dụng và đưa ra các yêu cầu được uỷ quyền.

Đây không phải là thông tin đầy đủ về bảo mật triển khai ứng dụng, mà là những thay đổi mà bạn có thể thực hiện đối với tất cả các lần triển khai ứng dụng trong tương lai để cải thiện tính bảo mật của ứng dụng mà không tốn nhiều công sức.

2. Cách thiết lập và các yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án là duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng tên của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ được giữ nguyên trong suốt thời gian diễn ra dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên để không bị tính phí sau khi hoàn tất hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Kích hoạt Cloud Shell

  1. Trên Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (dưới màn hình đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Dưới đây là giao diện một lần đó:

9c92662c6a846a5c.png

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.png

Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứ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 chỉ bằng một trình duyệt hoặc Chromebook.

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.

  1. 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`
  1. 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].

Thiết lập môi trường

Bạn sẽ chạy các lệnh trong dòng lệnh Cloud Shell cho lớp học lập trình này. Thông thường, bạn có thể sao chép và dán các lệnh như hiện có, mặc dù trong một số trường hợp, bạn cần thay đổi giá trị phần giữ chỗ để sửa lại.

  1. Đặt biến môi trường thành Mã dự án để sử dụng trong các lệnh sau:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export SERVICE_NAME=partner-registration-service
  1. Bật API dịch vụ Cloud Run để chạy ứng dụng, API Firestore để cung cấp bộ nhớ dữ liệu NoSQL, API Cloud Build để lệnh triển khai sử dụng và Cấu phần lưu trữ cấu phần phần mềm để lưu trữ vùng chứa ứng dụng khi tạo:
gcloud services enable \
  run.googleapis.com \
  firestore.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  1. Khởi động cơ sở dữ liệu Firestore ở chế độ Gốc. Lệnh đó sử dụng API App Engine, vì vậy, bạn phải bật API này trước.

Lệnh này phải chỉ định một khu vực cho App Engine (mà chúng ta sẽ không sử dụng nhưng phải tạo vì lý do trước đây) và một khu vực cho cơ sở dữ liệu. Chúng ta sẽ sử dụng us-central cho App Engine và nam5 cho cơ sở dữ liệu. nam5 là vị trí đa vùng của Hoa Kỳ. Vị trí nhiều khu vực giúp tối đa hoá khả năng hoạt động và độ bền của cơ sở dữ liệu.

gcloud services enable appengine.googleapis.com

gcloud app create --region=us-central
gcloud firestore databases create --region=nam5
  1. Nhân bản kho lưu trữ ứng dụng mẫu và chuyển đến thư mục
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service

3. Xem lại tệp README

Mở trình chỉnh sửa và xem các tệp tạo nên ứng dụng. Xem README.md mô tả các bước cần thiết để triển khai ứng dụng này. Một số bước trong số này có thể liên quan đến các quyết định bảo mật ngầm ẩn hoặc rõ ràng cần cân nhắc. Bạn sẽ thay đổi một số lựa chọn này để cải thiện tính bảo mật của ứng dụng đã triển khai, như mô tả tại đây:

Bước 3 – Chạy npm install

Điều quan trọng là bạn phải biết nguồn gốc và tính toàn vẹn của mọi phần mềm bên thứ ba được sử dụng trong ứng dụng. Việc quản lý bảo mật chuỗi cung ứng phần mềm có liên quan đến việc xây dựng mọi phần mềm, chứ không chỉ các ứng dụng được triển khai trên Cloud Run. Lớp học này tập trung vào việc triển khai, vì vậy không đề cập đến khía cạnh này, nhưng bạn có thể muốn nghiên cứu riêng chủ đề này.

Bước 4 và 5 – Chỉnh sửa và chạy deploy.sh

Các bước này sẽ triển khai ứng dụng lên Cloud Run và để hầu hết các tuỳ chọn ở chế độ mặc định. Bạn sẽ sửa đổi bước này để tăng cường bảo mật cho quá trình triển khai theo hai cách chính:

  1. Không cho phép truy cập chưa xác thực. Bạn có thể cho phép điều đó để thử nghiệm trong quá trình khám phá, nhưng đây là dịch vụ web dành cho các đối tác thương mại và phải luôn xác thực người dùng.
  2. Chỉ định rằng ứng dụng phải sử dụng một tài khoản dịch vụ chuyên dụng được điều chỉnh chỉ với các đặc quyền cần thiết, thay vì một tài khoản mặc định có thể có quyền truy cập vào API và tài nguyên nhiều hơn mức cần thiết. Đây được gọi là nguyên tắc về đặc quyền tối thiểu và là một khái niệm cơ bản về bảo mật ứng dụng.

Bước 6 đến 11 – Tạo các yêu cầu web mẫu để xác minh hành vi chính xác

Vì việc triển khai ứng dụng hiện yêu cầu xác thực, nên các yêu cầu này hiện phải bao gồm bằng chứng về danh tính của người yêu cầu. Thay vì thay đổi các tệp này, bạn sẽ trực tiếp đưa ra yêu cầu từ dòng lệnh.

4. Triển khai dịch vụ một cách an toàn

Có hai thay đổi cần thiết được xác định trong tập lệnh deploy.sh: không cho phép truy cập chưa xác thực và sử dụng tài khoản dịch vụ chuyên dụng có đặc quyền tối thiểu.

Trước tiên, bạn sẽ tạo một tài khoản dịch vụ mới, sau đó chỉnh sửa tập lệnh deploy.sh để tham chiếu đến tài khoản dịch vụ đó và không cho phép truy cập chưa xác thực, sau đó triển khai dịch vụ bằng cách chạy tập lệnh đã sửa đổi trước khi chúng ta có thể chạy tập lệnh deploy.sh đã sửa đổi.

Tạo một tài khoản dịch vụ và cấp cho tài khoản đó quyền truy cập cần thiết vào Firestore/Datastore

gcloud iam service-accounts create partner-sa

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:partner-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role=roles/datastore.user

Chỉnh sửa deploy.sh

Sửa đổi tệp deploy.sh để không cho phép quyền truy cập chưa xác thực(–no-allow-unauthenticated) và chỉ định tài khoản dịch vụ mới(–service-account) cho ứng dụng đã triển khai. Sửa GOOGLE_PROJECT_ID thành mã nhận dạng của dự án của riêng bạn.

Bạn sẽ xoá hai dòng đầu tiên và thay đổi ba dòng khác như minh hoạ dưới đây.

gcloud run deploy $SERVICE_NAME \
  --source . \
  --platform managed \
  --region ${REGION} \
  --no-allow-unauthenticated \
  --project=$PROJECT_ID \
  --service-account=partner-sa@${PROJECT_ID}.iam.gserviceaccount.com

Triển khai dịch vụ

Trên dòng lệnh, hãy chạy tập lệnh deploy.sh:

./deploy.sh

Khi quá trình triển khai hoàn tất, dòng cuối cùng của kết quả lệnh sẽ hiển thị URL dịch vụ của ứng dụng mới. Lưu URL trong biến môi trường:

export SERVICE_URL=<URL from last line of command output>

Bây giờ, hãy thử tìm nạp một đơn đặt hàng từ ứng dụng bằng công cụ curl:

curl -i -X GET $SERVICE_URL/partners

Cờ -i cho lệnh curl yêu cầu lệnh này đưa tiêu đề phản hồi vào đầu ra. Dòng đầu tiên của kết quả sẽ là:

HTTP/2 403

Ứng dụng được triển khai với tuỳ chọn không cho phép các yêu cầu chưa được xác thực. Lệnh curl này không chứa thông tin xác thực nên bị Cloud Run từ chối. Ứng dụng được triển khai thực tế thậm chí không chạy hoặc nhận được bất kỳ dữ liệu nào từ yêu cầu này.

5. Tạo yêu cầu đã xác thực

Ứng dụng đã triển khai được gọi bằng cách tạo các yêu cầu web. Giờ đây, các yêu cầu này phải được xác thực để Cloud Run cho phép. Các yêu cầu web được xác thực bằng cách thêm tiêu đề Authorization của biểu mẫu:

Authorization: Bearer identity-token

Mã thông báo nhận dạng là một chuỗi ngắn, được ký bằng mật mã và được mã hoá do một trình cung cấp dịch vụ xác thực đáng tin cậy phát hành. Trong trường hợp này, bạn phải có mã thông báo nhận dạng hợp lệ, chưa hết hạn do Google cấp.

Gửi yêu cầu bằng tài khoản người dùng của bạn

Công cụ Google Cloud CLI có thể cung cấp mã thông báo cho người dùng đã xác thực mặc định. Chạy lệnh này để lấy mã thông báo nhận dạng cho tài khoản của riêng bạn và lưu mã thông báo đó trong biến môi trường ID_TOKEN:

export ID_TOKEN=$(gcloud auth print-identity-token)

Theo mặc định, mã thông báo nhận dạng do Google cấp có hiệu lực trong một giờ. Chạy lệnh curl sau để thực hiện yêu cầu trước đó bị từ chối vì không được uỷ quyền. Lệnh này sẽ bao gồm tiêu đề cần thiết:

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $ID_TOKEN"

Kết quả của lệnh phải bắt đầu bằng HTTP/2 200, cho biết yêu cầu được chấp nhận và đang được thực hiện. (Nếu bạn đợi một giờ rồi thử lại yêu cầu này, yêu cầu sẽ không thành công vì mã thông báo đã hết hạn.) Nội dung của phản hồi nằm ở cuối kết quả, sau một dòng trống:

{"status":"success","data":[]}

Chưa có đối tác nào.

Đăng ký đối tác bằng dữ liệu JSON mẫu trong thư mục bằng hai lệnh curl:

curl -X POST \
  -H "Authorization: Bearer $ID_TOKEN" \
  -H "Content-Type: application/json" \
  -d "@example-partner.json" \
  $SERVICE_URL/partner

curl -X POST \
  -H "Authorization: Bearer $ID_TOKEN" \
  -H "Content-Type: application/json" \
  -d "@example-partner2.json" \
  $SERVICE_URL/partner

Lặp lại yêu cầu GET trước đó để xem tất cả các đối tác đã đăng ký hiện tại:

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $ID_TOKEN"

Bạn sẽ thấy dữ liệu JSON có nhiều nội dung hơn, cung cấp thông tin về hai đối tác đã đăng ký.

Gửi yêu cầu dưới dạng tài khoản trái phép

Yêu cầu đã xác thực được thực hiện ở bước cuối cùng đã thành công không chỉ vì yêu cầu đó đã được xác thực mà còn vì người dùng đã xác thực (tài khoản của bạn) đã được uỷ quyền. Tức là tài khoản có quyền gọi ứng dụng. Không phải tất cả tài khoản đã xác thực đều được phép thực hiện việc đó.

Tài khoản mặc định được dùng trong yêu cầu trước đó đã được uỷ quyền vì đó là tài khoản đã tạo dự án chứa ứng dụng và theo mặc định, tài khoản đó đã cấp quyền gọi mọi ứng dụng Cloud Run trong tài khoản. Bạn có thể thu hồi quyền đó nếu cần, điều này sẽ rất hữu ích trong ứng dụng phát hành công khai. Thay vì làm như vậy ngay bây giờ, bạn sẽ tạo một tài khoản dịch vụ mới không có đặc quyền hoặc vai trò nào được chỉ định và sử dụng tài khoản đó để cố gắng truy cập vào ứng dụng đã triển khai.

  1. Tạo một tài khoản dịch vụ có tên là tester.
gcloud iam service-accounts create tester
  1. Bạn sẽ nhận được mã thông báo danh tính cho tài khoản mới này giống như cách bạn nhận được mã thông báo cho tài khoản mặc định trước đó. Tuy nhiên, để làm được điều này, tài khoản mặc định của bạn phải có quyền mạo danh tài khoản dịch vụ. Cấp quyền này cho tài khoản của bạn.
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="user:$USER_EMAIL" \
  --role=roles/iam.serviceAccountTokenCreator
  1. Bây giờ, hãy chạy lệnh sau để lưu mã thông báo nhận dạng cho tài khoản mới này trong biến môi trường TEST_IDENTITY. Nếu lệnh này hiển thị thông báo lỗi, hãy đợi một hoặc hai phút rồi thử lại.
export TEST_TOKEN=$( \
  gcloud auth print-identity-token \
    --impersonate-service-account \
    "tester@$PROJECT_ID.iam.gserviceaccount.com" \
)
  1. Tạo yêu cầu web đã xác thực như trước, nhưng sử dụng mã thông báo nhận dạng này:
curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $TEST_TOKEN"

Kết quả của lệnh sẽ bắt đầu lại bằng HTTP/2 403 vì yêu cầu, mặc dù đã được xác thực, nhưng chưa được uỷ quyền. Tài khoản dịch vụ mới không có quyền gọi ứng dụng này.

Uỷ quyền cho tài khoản

Người dùng hoặc tài khoản dịch vụ phải có vai trò Trình gọi Cloud Run trên dịch vụ Cloud Run để có thể gửi yêu cầu đến dịch vụ đó. Cấp cho tài khoản dịch vụ của người kiểm thử vai trò đó bằng lệnh:

export REGION=us-central1
gcloud run services add-iam-policy-binding ${SERVICE_NAME} \
  --member="serviceAccount:tester@$PROJECT_ID.iam.gserviceaccount.com" \
  --role=roles/run.invoker \
  --region=${REGION}

Sau khi đợi một hoặc hai phút để cập nhật vai trò mới, hãy lặp lại yêu cầu đã xác thực. Lưu TEST_TOKEN mới nếu đã hơn một giờ kể từ lần lưu đầu tiên.

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $TEST_TOKEN"

Kết quả của lệnh hiện bắt đầu bằng HTTP/1.1 200 OK và dòng cuối cùng chứa phản hồi JSON. Yêu cầu này đã được Cloud Run chấp nhận và ứng dụng xử lý.

6. Xác thực chương trình so với xác thực người dùng

Các yêu cầu đã xác thực mà bạn đã thực hiện cho đến nay đã sử dụng công cụ dòng lệnh curl. Bạn có thể sử dụng các công cụ và ngôn ngữ lập trình khác. Tuy nhiên, bạn không thể tạo các yêu cầu Cloud Run đã xác thực bằng trình duyệt web có trang web thuần tuý. Nếu người dùng nhấp vào một đường liên kết hoặc nhấp vào một nút để gửi biểu mẫu trong một trang web, thì trình duyệt sẽ không thêm tiêu đề Authorization mà Cloud Run yêu cầu cho các yêu cầu đã xác thực.

Cơ chế xác thực tích hợp của Cloud Run dành cho các chương trình, chứ không phải người dùng cuối.

Lưu ý:

Cloud Run có thể lưu trữ các ứng dụng web dành cho người dùng, nhưng những loại ứng dụng đó phải thiết lập Cloud Run để cho phép các yêu cầu chưa xác thực từ trình duyệt web của người dùng. Nếu ứng dụng yêu cầu xác thực người dùng, thì ứng dụng phải xử lý việc này thay vì yêu cầu Cloud Run thực hiện. Ứng dụng có thể thực hiện việc này theo cách tương tự như các ứng dụng web bên ngoài Cloud Run. Cách thực hiện việc này nằm ngoài phạm vi của lớp học lập trình này.

Có thể bạn đã nhận thấy rằng phản hồi cho các yêu cầu mẫu cho đến thời điểm này là các đối tượng JSON, chứ không phải trang web. Đó là vì dịch vụ đăng ký đối tác này dành cho các chương trình sử dụng và JSON là một hình thức thuận tiện để các chương trình đó sử dụng. Tiếp theo, bạn sẽ viết và chạy một chương trình để sử dụng dữ liệu này.

Yêu cầu đã xác thực từ một chương trình Python

Một chương trình có thể tạo các yêu cầu đã xác thực của một ứng dụng Cloud Run được bảo mật thông qua các yêu cầu web HTTP tiêu chuẩn, nhưng bao gồm cả tiêu đề Authorization. Thách thức mới duy nhất đối với các chương trình đó là lấy mã thông báo nhận dạng hợp lệ, chưa hết hạn để đặt vào tiêu đề đó. Mã thông báo đó sẽ được Cloud Run xác thực bằng tính năng Quản lý danh tính và quyền truy cập (IAM) của Google Cloud. Vì vậy, mã thông báo phải do một cơ quan được IAM công nhận phát hành và ký. Có các thư viện ứng dụng có sẵn bằng nhiều ngôn ngữ mà các chương trình có thể sử dụng để yêu cầu phát hành mã thông báo như vậy. Thư viện ứng dụng mà ví dụ này sẽ sử dụng là thư viện google.auth của Python. Có một số thư viện Python để tạo yêu cầu web nói chung; ví dụ này sử dụng mô-đun requests phổ biến.

Bước đầu tiên là cài đặt hai thư viện ứng dụng:

pip install google-auth
pip install requests

Mã Python để yêu cầu mã thông báo nhận dạng cho người dùng mặc định là:

credentials, _ = google.auth.default()
credentials.refresh(google.auth.transport.requests.Request())
identity_token = credentials.id_token

Nếu bạn đang sử dụng một shell lệnh như Cloud Shell hoặc shell dòng lệnh chuẩn trên máy tính của riêng mình, thì người dùng mặc định là bất kỳ người dùng nào đã xác thực bên trong shell đó. Trong Cloud Shell, thông tin này thường là người dùng đã đăng nhập vào Google. Trong các trường hợp khác, đó là bất kỳ người dùng nào đã xác thực bằng gcloud auth login hoặc lệnh gcloud khác. Nếu người dùng chưa từng đăng nhập, thì sẽ không có người dùng mặc định và mã này sẽ không thực hiện được.

Đối với một chương trình đưa ra yêu cầu của một chương trình khác, bạn thường không muốn sử dụng danh tính của một người, mà là danh tính của chương trình yêu cầu. Đó chính là mục đích của tài khoản dịch vụ. Bạn đã triển khai dịch vụ Cloud Run bằng một tài khoản dịch vụ chuyên dụng cung cấp danh tính mà dịch vụ này sử dụng khi tạo các yêu cầu API, chẳng hạn như đến Cloud Firestore. Khi một chương trình chạy trên nền tảng Google Cloud, các thư viện ứng dụng sẽ tự động sử dụng tài khoản dịch vụ được chỉ định cho chương trình đó làm danh tính mặc định, vì vậy, cùng một mã chương trình sẽ hoạt động trong cả hai trường hợp.

Mã Python để tạo một yêu cầu có tiêu đề Uỷ quyền được thêm vào là:

auth_header = {"Authorization": "Bearer " + identity_token}
response = requests.get(url, headers=auth_header)

Chương trình Python hoàn chỉnh sau đây sẽ tạo một yêu cầu đã xác thực cho dịch vụ Cloud Run để truy xuất tất cả đối tác đã đăng ký, sau đó in tên và mã nhận dạng được chỉ định của họ. Sao chép và chạy lệnh bên dưới để lưu mã này vào tệp print_partners.py.

cat > ./print_partners.py << EOF
def print_partners():
    import google.auth
    import google.auth.transport.requests
    import requests

    credentials, _ = google.auth.default()
    credentials.refresh(google.auth.transport.requests.Request())
    identity_token = credentials.id_token

    auth_header = {"Authorization": "Bearer " + identity_token}
    response = requests.get("${SERVICE_URL}/partners", headers=auth_header)

    parsed_response = response.json()
    partners = parsed_response["data"]

    for partner in partners:
        print(f"{partner['partnerId']}: {partner['name']}")


print_partners()
EOF

Bạn sẽ chạy chương trình này bằng lệnh shell. Trước tiên, bạn cần xác thực dưới dạng người dùng mặc định để chương trình có thể sử dụng các thông tin xác thực đó. Chạy lệnh xác thực gcloud bên dưới:

gcloud auth application-default login

Làm theo hướng dẫn để hoàn tất quá trình đăng nhập. Sau đó, chạy chương trình từ dòng lệnh:

python print_partners.py

Kết quả sẽ có dạng như sau:

10102: Zippy food delivery
67292: Foodful

Yêu cầu của chương trình đã đến dịch vụ Cloud Run vì yêu cầu đó được xác thực bằng danh tính của bạn. Bạn là chủ sở hữu của dự án này và do đó được uỷ quyền để chạy dự án theo mặc định. Thông thường, chương trình này sẽ chạy dưới danh tính của tài khoản dịch vụ. Khi chạy trên hầu hết các sản phẩm của Google Cloud, chẳng hạn như Cloud Run hoặc App Engine, danh tính mặc định sẽ là tài khoản dịch vụ và sẽ được dùng thay vì tài khoản cá nhân.

7. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn tất lớp học lập trình!

Bước tiếp theo:

Khám phá các lớp học lập trình khác về Cymbal Eats:

Dọn dẹp

Để tránh bị tính phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được sử dụng trong hướng dẫn này, hãy xoá dự án chứa các tài nguyên đó hoặc giữ lại dự án và xoá từng tài nguyên.

Xoá dự án

Cách dễ nhất để loại bỏ tính năng thanh toán là xoá dự án mà bạn đã tạo cho hướng dẫn này.