Lớp học lập trình về Trusted Space

1. Tổng quan

Bạn đã sẵn sàng nâng cao tính bảo mật và quyền riêng tư của các khối lượng công việc được tăng tốc GPU chưa? Lớp học lập trình này sẽ hướng dẫn bạn về các tính năng của Trusted Space (Không gian đáng tin cậy), một dịch vụ cung cấp tính năng hỗ trợ tăng tốc và tách biệt mạnh mẽ cho các tác vụ AI/ML nhạy cảm.

Việc bảo vệ dữ liệu, mô hình và khoá có giá trị trở nên quan trọng hơn bao giờ hết. Trusted Space cung cấp giải pháp bằng cách đảm bảo rằng khối lượng công việc của bạn hoạt động trong một môi trường an toàn và đáng tin cậy, ngay cả khi người vận hành khối lượng công việc không có quyền truy cập.

Dưới đây là những tính năng của Không gian đáng tin cậy:

  • Nâng cao quyền riêng tư và bảo mật: Trusted Space cung cấp một môi trường thực thi đáng tin cậy, nơi các tài sản nhạy cảm của bạn (ví dụ: mô hình, dữ liệu có giá trị và khoá) vẫn được bảo vệ, dựa trên bằng chứng mã hoá.
  • Phân tách toán tử: Loại bỏ mối lo ngại về sự can thiệp của toán tử. Với Không gian đáng tin cậy, ngay cả người vận hành khối lượng công việc cũng không có quyền truy cập, ngăn họ sử dụng SSH, truy cập dữ liệu, cài đặt phần mềm hoặc can thiệp vào mã của bạn.
  • Hỗ trợ trình tăng tốc: Không gian đáng tin cậy được thiết kế để hoạt động liền mạch với nhiều trình tăng tốc phần cứng, bao gồm cả GPU như H100, A100, T4 và L4. Điều này giúp đảm bảo các ứng dụng AI/học máy quan trọng về hiệu suất chạy trơn tru.

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

  • Tìm hiểu các dịch vụ chính của Trusted Space.
  • Tìm hiểu cách triển khai và định cấu hình môi trường Không gian đáng tin cậy để bảo mật các tài sản có giá trị trong khối lượng công việc AI/ML.

Bạn cần có

Bảo vệ lời nhắc tạo mã nhạy cảm bằng Công ty Primus

Trong lớp học lập trình này, chúng ta sẽ nhập vai Primus, một công ty ưu tiên quyền riêng tư và tính bảo mật của dữ liệu nhân viên. Primus muốn triển khai một mô hình tạo mã để hỗ trợ các nhà phát triển trong các tác vụ lập trình. Tuy nhiên, họ lo ngại về việc bảo vệ tính bảo mật của các câu lệnh do nhân viên gửi, vì các câu lệnh này thường chứa các đoạn mã nhạy cảm, thông tin chi tiết về dự án nội bộ hoặc thuật toán độc quyền.

Tại sao Công ty Primus không tin tưởng Nhà mạng?

Primus Corp hoạt động trong một thị trường có tính cạnh tranh cao. Cơ sở mã của họ chứa tài sản trí tuệ có giá trị, bao gồm các thuật toán độc quyền và đoạn mã nhạy cảm giúp mang lại lợi thế cạnh tranh. Họ lo ngại về khả năng các nhà điều hành tải công việc có thể hoạt động gián điệp cho công ty. Ngoài ra, lời nhắc của nhân viên có thể bao gồm các phần mã "Cần biết" mật mà Primus Corp muốn bảo vệ.

Để giải quyết mối lo ngại này, Primus Corp sẽ tận dụng Trusted Space để tách biệt máy chủ suy luận đang chạy mô hình để tạo mã. Cách hoạt động như sau:

  • Mã hoá lời nhắc: Trước khi gửi lời nhắc đến máy chủ suy luận, mỗi nhân viên sẽ mã hoá lời nhắc đó bằng khoá KMS do Primus Corp quản lý trong Google Cloud. Điều này đảm bảo rằng chỉ môi trường Không gian đáng tin cậy (có khoá giải mã tương ứng) mới có thể giải mã và truy cập vào lời nhắc văn bản thô. Trong trường hợp thực tế, các thư viện hiện có có thể xử lý việc mã hoá phía máy khách (ví dụ: tink). Trong lớp học lập trình này, chúng ta sẽ sử dụng ứng dụng khách mẫu này với tính năng mã hoá phong bì.
  • Phân tách toán tử: Chỉ máy chủ suy luận chạy trong môi trường Không gian đáng tin cậy mới có quyền truy cập vào khoá dùng để mã hoá và có thể giải mã lời nhắc trong môi trường đáng tin cậy. Quyền truy cập vào khoá mã hoá sẽ được bảo vệ bằng Workload Identity Pool. Do tính năng đảm bảo tách biệt của Không gian đáng tin cậy, ngay cả người vận hành khối lượng công việc cũng không thể truy cập vào khoá dùng để mã hoá và nội dung đã giải mã.
  • Suy luận bảo mật bằng(các) Trình tăng tốc: Máy chủ suy luận sẽ được khởi chạy trên một máy ảo được bảo vệ (trong quá trình thiết lập Không gian đáng tin cậy) để đảm bảo rằng thực thể khối lượng công việc không bị xâm phạm bởi phần mềm độc hại ở cấp khởi động hoặc cấp hạt nhân hoặc trình mô phỏng hệ thống. Máy chủ này giải mã lời nhắc trong môi trường Trusted Space, thực hiện suy luận bằng mô hình tạo mã và trả về mã đã tạo cho nhân viên.

2. Thiết lập Tài nguyên trên đám mây

Trước khi bắt đầu

  • Sao chép kho lưu trữ này bằng lệnh dưới đây để lấy các tập lệnh bắt buộc được dùng trong lớp học lập trình này.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Thay đổi thư mục cho lớp học lập trình này.
cd confidential-space/codelabs/trusted_space_codelab/scripts
  • Đảm bảo bạn đã thiết lập các biến môi trường dự án bắt buộc như minh hoạ dưới đây. Để biết thêm thông tin về cách thiết lập dự án GCP, vui lòng tham khảo lớp học lập trình này. Bạn có thể tham khảo đây để biết thông tin chi tiết về cách truy xuất mã dự án và sự khác biệt giữa mã dự án với tên dự án và số dự án.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
gcloud services enable \
    cloudapis.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudkms.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • Chỉ định giá trị cho các biến cho tên tài nguyên được chỉ định ở trên bằng lệnh sau. Các biến này cho phép bạn tuỳ chỉnh tên tài nguyên nếu cần và cũng sử dụng các tài nguyên hiện có nếu đã tạo. (ví dụ: export PRIMUS_SERVICE_ACCOUNT='my-service-account')
  1. Bạn có thể đặt các biến sau đây bằng tên tài nguyên đám mây hiện có trong dự án Primus. Nếu bạn đặt biến này, thì tài nguyên đám mây hiện có tương ứng từ dự án Primus sẽ được sử dụng. Nếu bạn không đặt biến này, tên tài nguyên trên đám mây sẽ được tạo từ tên dự án và một tài nguyên trên đám mây mới sẽ được tạo bằng tên đó. Sau đây là các biến được hỗ trợ cho tên tài nguyên:

$PRIMUS_PROJECT_REGION

Khu vực mà tài nguyên theo khu vực sẽ được tạo cho công ty Primus.

$PRIMUS_SERVICE_LOCATION

Vị trí tạo tài nguyên cho công ty Primus.

$PRIMUS_PROJECT_ZONE

Vùng mà tài nguyên theo vùng sẽ được tạo cho công ty Primus.

$PRIMUS_WORKLOAD_IDENTITY_POOL

Nhóm Workload Identity của công ty Primus để bảo vệ tài nguyên trên đám mây.

$PRIMUS_WIP_PROVIDER

Nhà cung cấp Workload Identity Pool (WIP) của công ty Primus, bao gồm điều kiện uỷ quyền để sử dụng cho các mã thông báo do Dịch vụ xác minh chứng thực ký.

$PRIMUS_SERVICEACCOUNT

Tài khoản dịch vụ của công ty Primus mà $PRIMUS_WORKLOAD_IDENTITY_POOL sử dụng để truy cập vào các tài nguyên được bảo vệ. Ở bước này, ứng dụng có quyền xem dữ liệu khách hàng được lưu trữ trong bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ENC_KEY

Khoá KMS được dùng để mã hoá các câu lệnh do nhân viên của công ty Primus cung cấp.

$PRIMUS_ENC_KEYRING

Khoá chuỗi KMS sẽ được dùng để tạo khoá mã hoá $PRIMUS_ENC_KEY cho công ty Primus.

$PRIMUS_ENC_KEYVERSION

Phiên bản khoá KMS của khoá mã hoá $PRIMUS_ENC_KEY. Giá trị mặc định là 1. Hãy cập nhật thông tin này nếu bạn đang sử dụng một khoá hiện có đã được xoay trong quá khứ và phiên bản của khoá đó đã được cập nhật.

$PRIMUS_ARTIFACT_REPOSITORY

Kho lưu trữ cấu phần phần mềm nơi hình ảnh docker của khối lượng công việc sẽ được đẩy.

$PRIMUS_PROJECT_REPOSITORY_REGION

Khu vực cho kho lưu trữ cấu phần phần mềm sẽ có hình ảnh docker tải trọng đã xuất bản.

$WORKLOAD_VM

Tên của máy ảo tải công việc.

$WORKLOAD_IMAGE_NAME

Tên của hình ảnh docker cho khối lượng công việc.

$WORKLOAD_IMAGE_TAG

Thẻ của hình ảnh vùng chứa khối lượng công việc.

$WORKLOAD_SERVICEACCOUNT

Tài khoản dịch vụ có quyền truy cập vào Máy ảo bảo mật chạy khối lượng công việc.

$CLIENT_VM

Tên của máy ảo ứng dụng khách sẽ chạy ứng dụng khách của máy chủ suy luận.

$CLIENT_SERVICEACCOUNT

Tài khoản dịch vụ mà $CLIENT_VM sử dụng

  • Bạn cần có vai trò Quản trị viên bộ nhớ, Quản trị viên kho lưu trữ cấu phần phần mềm, Quản trị viên Cloud KMS, Quản trị viên tài khoản dịch vụ, Quản trị viên nhóm nhận dạng theo tải công việc IAM cho dự án $PRIMUS_PROJECT_ID. Bạn có thể tham khảo hướng dẫn này về cách cấp vai trò IAM bằng bảng điều khiển GCP.
  • Đối với $PRIMUS_PROJECT_ID, hãy chạy tập lệnh sau để đặt tên biến còn lại thành giá trị dựa trên mã dự án của bạn cho tên tài nguyên.
source config_env.sh

Thiết lập tài nguyên của Công ty Primus

Trong bước này, bạn sẽ thiết lập các tài nguyên đám mây cần thiết cho Primus. Chạy tập lệnh sau để thiết lập tài nguyên cho Primus. Các tài nguyên sau đây sẽ được tạo trong quá trình thực thi tập lệnh:

  • Khoá mã hoá ($PRIMUS_ENC_KEY) và khoá truy cập ($PRIMUS_ENC_KEYRING) trong KMS để mã hoá tệp dữ liệu khách hàng của công ty Primus.
  • Nhóm danh tính tải ($PRIMUS_WORKLOAD_IDENTITY_POOL) để xác thực các tuyên bố dựa trên điều kiện thuộc tính được định cấu hình trong nhà cung cấp của nhóm.
  • Tài khoản dịch vụ ($PRIMUS_SERVICE_ACCOUNT) được đính kèm vào nhóm nhận dạng khối lượng công việc ($PRIMUS_WORKLOAD_IDENTITY_POOL) nêu trên có quyền giải mã dữ liệu bằng khoá KMS (sử dụng vai trò roles/cloudkms.cryptoKeyDecrypter), mã hoá dữ liệu bằng khoá KMS (sử dụng vai trò roles/cloudkms.cryptoKeyEncrypter), đọc dữ liệu từ bộ nhớ trên đám mây (sử dụng vai trò objectViewer) và kết nối tài khoản dịch vụ với nhóm nhận dạng khối lượng công việc (sử dụng roles/iam.workloadIdentityUser).
./setup_primus_resources.sh

3. Tạo khối lượng công việc

Tạo tài khoản dịch vụ khối lượng công việc

Bây giờ, bạn sẽ tạo một tài khoản dịch vụ cho khối lượng công việc với các vai trò và quyền bắt buộc. Chạy tập lệnh sau để tạo tài khoản dịch vụ khối lượng công việc trong dự án Primus. Tài khoản dịch vụ này sẽ được máy ảo chạy máy chủ suy luận sử dụng.

Tài khoản dịch vụ khối lượng công việc này ($WORKLOAD_SERVICEACCOUNT) sẽ có các vai trò sau:

  • confidentialcomputing.workloadUser để nhận mã thông báo chứng thực
  • logging.logWriter để ghi nhật ký vào Cloud Logging.
./create_workload_service_account.sh

Tạo mức tải

Trong bước này, bạn sẽ tạo một hình ảnh docker cho khối lượng công việc. Workload sẽ do công ty Primus tạo. Khối lượng công việc được sử dụng trong lớp học lập trình này là mã Python sử dụng mô hình codegemma từ vùng chứa GCS có sẵn công khai (của vườn mô hình đỉnh). Workload sẽ tải mô hình codegemma và khởi chạy máy chủ suy luận để phân phát các yêu cầu tạo mã từ các nhà phát triển của Primus.

Trên yêu cầu tạo mã, Workload sẽ nhận được DEK đã gói cùng với lời nhắc được mã hoá. Sau đó, Workload sẽ thực hiện lệnh gọi API KMS để giải mã DEK, sau đó giải mã lời nhắc bằng DEK này. Khoá mã hoá (cho DEK) sẽ được bảo vệ thông qua nhóm nhận dạng khối lượng công việc và quyền truy cập sẽ được cấp cho những khối lượng công việc đáp ứng các điều kiện thuộc tính. Các điều kiện thuộc tính này được mô tả chi tiết hơn trong phần tiếp theo về việc uỷ quyền cho khối lượng công việc. Sau khi có lời nhắc đã giải mã, máy chủ suy luận sẽ tạo mã bằng cách sử dụng mô hình đã tải và trả về phản hồi.

Chạy tập lệnh sau để tạo một khối lượng công việc trong đó các bước sau đang được thực hiện:

  • Tạo Artifact Registry($PRIMUS_ARTIFACT_REGISTRY) do Primus sở hữu.
  • Cập nhật mã khối lượng công việc bằng tên tài nguyên bắt buộc.
  • Tạo tải máy chủ suy luận và tạo Dockerfile để tạo hình ảnh Docker của mã tải. Đây là Dockerfile dùng cho lớp học lập trình này.
  • Tạo và phát hành hình ảnh Docker lên Cấu phần phần mềm đăng ký ($PRIMUS_ARTIFACT_REGISTRY) do Primus sở hữu.
  • Cấp quyền đọc $WORKLOAD_SERVICEACCOUNT cho $PRIMUS_ARTIFACT_REGISTRY. Điều này cần thiết để vùng chứa khối lượng công việc lấy hình ảnh docker khối lượng công việc từ Cấu phần phần mềm.
./create_workload.sh

Để bạn tham khảo, sau đây là phương thức generate() của khối lượng công việc được tạo và sử dụng trong lớp học lập trình này (bạn có thể tìm thấy toàn bộ mã khối lượng công việc tại đây).

def generate():
  try:
    data = request.get_json()
    ciphertext = base64.b64decode(data["ciphertext"])
    wrapped_dek = base64.b64decode(data["wrapped_dek"])
    unwrapped_dek_response = kms_client.decrypt(
        request={"name": key_name, "ciphertext": wrapped_dek}
    )
    unwrapped_dek = unwrapped_dek_response.plaintext
    f = Fernet(unwrapped_dek)
    plaintext = f.decrypt(ciphertext)
    prompt = plaintext.decode("utf-8")
    tokens = tokenizer(prompt, return_tensors="pt")
    outputs = model.generate(**tokens, max_new_tokens=128)
    generated_code = tokenizer.decode(outputs[0])
    generated_code_bytes = generated_code.encode("utf-8")

    response = f.encrypt(generated_code_bytes)
    ciphertext_base64 = base64.b64encode(response).decode("utf-8")
    response = {"generated_code_ciphertext": ciphertext_base64}
    return jsonify(response)

  except (ValueError, TypeError, KeyError) as e:
    return jsonify({"error": str(e)}), 500

4. Uỷ quyền và chạy khối lượng công việc

Uỷ quyền cho Workload

Primus muốn uỷ quyền cho các khối lượng công việc truy cập vào khoá KMS dùng để mã hoá nhanh dựa trên các thuộc tính của các tài nguyên sau:

  • Nội dung: Mã được xác minh
  • Vị trí: Môi trường an toàn
  • Who (Ai): Một nhà vận hành đáng tin cậy

Primus sử dụng tính năng liên kết danh tính theo khối lượng công việc để thực thi chính sách truy cập dựa trên các yêu cầu này. Tính năng liên kết danh tính theo khối lượng công việc cho phép bạn chỉ định điều kiện thuộc tính. Các điều kiện này hạn chế danh tính nào có thể xác thực bằng nhóm danh tính tải (WIP). Bạn có thể thêm Dịch vụ xác minh chứng thực vào WIP dưới dạng nhà cung cấp nhóm danh tính tải để trình bày các số liệu đo lường và thực thi chính sách.

Nhóm danh tính tải đã được tạo trước đó trong bước thiết lập tài nguyên trên đám mây. Bây giờ, Primus sẽ tạo một nhà cung cấp nhóm danh tính tải OIDC mới. --attribute-condition được chỉ định sẽ cấp quyền truy cập vào vùng chứa khối lượng công việc. Yêu cầu:

  • Nội dung: $WORKLOAD_IMAGE_NAME mới nhất được tải lên kho lưu trữ $PRIMUS_ARTIFACT_REPOSITORY.
  • Vị trí: Môi trường thực thi đáng tin cậy của Không gian bảo mật đang chạy trên hình ảnh máy ảo Không gian bảo mật được hỗ trợ đầy đủ.
  • Ai: Tài khoản dịch vụ $WORKLOAD_SERVICE_ACCOUNT của Primus.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG  --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --project="$PRIMUS_PROJECT_ID" \
  --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'HARDENED_SHIELDED' && assertion.hwmodel == 'GCP_SHIELDED_VM' && 
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
 assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

Lệnh trên xác minh rằng khối lượng công việc đang chạy trong môi trường không gian đáng tin cậy bằng cách kiểm tra để đảm bảo rằng hwmodel được đặt thành "GCP_SHIELDED_VM" và swname được đặt thành "HARDENED_SHIELDED". Ngoài ra, tính năng này còn bao gồm các câu nhận định dành riêng cho khối lượng công việc, chẳng hạn như image_digestimage_reference, để tăng cường bảo mật và đảm bảo tính toàn vẹn của khối lượng công việc đang chạy.

Chạy khối lượng công việc

Trong bước này, chúng ta sẽ chạy khối lượng công việc trong máy ảo Trusted Space (Không gian đáng tin cậy) có gắn trình tăng tốc. Các đối số TEE bắt buộc được truyền bằng cờ siêu dữ liệu. Các đối số cho vùng chứa khối lượng công việc được truyền bằng phần "tee-cmd" của cờ. Để trang bị GPU Nvidia Tesla T4 cho máy ảo tải công việc, chúng ta sẽ sử dụng cờ --accelerator=type=nvidia-tesla-t4,count=1. Thao tác này sẽ đính kèm một GPU vào máy ảo. Chúng ta cũng cần đưa tee-install-gpu-driver=true vào cờ siêu dữ liệu để kích hoạt quá trình cài đặt trình điều khiển GPU thích hợp.

gcloud compute instances create ${WORKLOAD_VM} \
  --accelerator=type=nvidia-tesla-t4,count=1 \
  --machine-type=n1-standard-16 \
  --shielded-secure-boot \
  --image-project=conf-space-images-preview \
  --image=confidential-space-0-gpupreview-796705b \
  --zone=${PRIMUS_PROJECT_ZONE} \
  --maintenance-policy=TERMINATE \
  --boot-disk-size=40 \
  --scopes=cloud-platform \
  --service-account=${WORKLOAD_SERVICEACCOUNT}@${PRIMUS_PROJECT_ID}.iam.gserviceaccount.com \
  --metadata="^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-install-gpu-driver=true~tee-restart-policy=Never"

Chạy truy vấn suy luận

Sau khi khởi chạy thành công máy chủ suy luận khối lượng công việc, nhân viên của công ty Primus hiện có thể gửi yêu cầu tạo mã đến máy chủ suy luận.

Trong lớp học lập trình này, chúng ta sẽ sử dụng tập lệnh sau để thiết lập ứng dụng khách sẽ tương tác với máy chủ suy luận. Chạy tập lệnh này để thiết lập máy ảo ứng dụng.

./setup_client.sh

Các bước sau đây minh hoạ cách SSH vào máy ảo ứng dụng và thực thi một ứng dụng ứng dụng mẫu trong môi trường ảo Python. Ứng dụng mẫu này sử dụng phương thức mã hoá phong bì bằng thư viện Fernet, nhưng xin lưu ý rằng bạn có thể điều chỉnh các thư viện mã hoá cụ thể cho phù hợp với nhiều trường hợp sử dụng.

gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}

Chạy các lệnh sau để kích hoạt môi trường ảo Python trong máy ảo của ứng dụng khách và thực thi ứng dụng khách.

source venv/bin/activate
python3 inference_client.py

Kết quả của ứng dụng mẫu này sẽ hiển thị các yêu cầu lời nhắc mã hoá và văn bản thuần tuý, cũng như các phản hồi đã mã hoá và giải mã tương ứng.

5. Dọn dẹp

Dưới đây là tập lệnh có thể dùng để dọn dẹp các tài nguyên mà chúng ta đã tạo trong lớp học lập trình này. Trong quá trình dọn dẹp này, các tài nguyên sau sẽ bị xoá:

  • Tài khoản dịch vụ Primus ($PRIMUS_SERVICEACCOUNT).
  • Khoá mã hoá Primus ($PRIMUS_ENC_KEY).
  • Kho lưu trữ cấu phần phần mềm của Primus ($PRIMUS_ARTIFACT_REPOSITORY).
  • Nhóm danh tính tải Primus ($PRIMUS_WORKLOAD_IDENTITY_POOL) với nhà cung cấp.
  • Tài khoản dịch vụ tải trọng của Primus ($WORKLOAD_SERVICEACCOUNT).
  • Máy ảo tải công việc ($WORKLOAD_VM) và máy ảo ứng dụng ($CLIENT_VM).
./cleanup.sh

Nếu bạn đã khám phá xong, vui lòng cân nhắc xoá dự án của mình.