Ngân hàng đề — Google Cloud Associate Cloud Engineer

Tìm thấy 449 câu.

Câu 221
Your company uses BigQuery for data warehousing. Over time, many different business units in your company have created 1000+ datasets across hundreds of projects. Your CIO wants you to examine all datasets to find tables that contain an employee_ssn column. You want to minimize effort in performing this task.
What should you do?
  1. A Go to Data Catalog and search for employee_ssn in the search box.
  2. B Write a shell script that uses the bq command line tool to loop through all the projects in your organization.
  3. C Write a script that loops through all the projects in your organization and runs a query on INFORMATION_SCHEMA.COLUMNS view to find the employee_ssn column.
  4. D Write a Cloud Dataflow job that loops through all the projects in your organization and runs a query on INFORMATION_SCHEMA.COLUMNS view to find employee_ssn column.
Xem giải thích

🧩 Phân tích nội dung câu hỏi

Câu hỏi mô tả tình huống công ty sử dụng BigQuery (dịch vụ kho dữ liệu của Google Cloud) để lưu trữ dữ liệu. Theo thời gian, nhiều đơn vị kinh doanh đã tạo hơn 1000 datasets trải rộng trên hàng trăm projects. CIO yêu cầu kiểm tra tất cả datasets để tìm các bảng chứa cột employee_ssn (số an sinh xã hội của nhân viên, thường là dữ liệu nhạy cảm). Yêu cầu chính là giảm thiểu công sức (minimize effort) khi thực hiện nhiệm vụ này.
📌 Mục tiêu chính: Tìm kiếm metadata (siêu dữ liệu) của cột employee_ssn một cách nhanh chóng, không cần quét thủ công toàn bộ projects/datasets/tables – vì số lượng lớn sẽ rất tốn kém thời gian và tài nguyên.

✅ Đáp án đúng và lý do lựa chọn

Đáp án đúng: Go to Data Catalog and search for employee_ssn in the search box.

🛠️ Lý do chi tiết:

  • Data Catalog là dịch vụ quản lý metadata tập trung của Google Cloud, tự động thu thập và lập chỉ mục (index) metadata từ BigQuery (bao gồm tên cột, schema tables) cross-projects mà không cần cấu hình thủ công.
  • Bạn chỉ cần truy cập giao diện Data Catalog (console.cloud.google.com/datacatalog), nhập employee_ssn vào ô tìm kiếm là có thể tìm ngay lập tức tất cả tables/datasets/projects chứa cột này, kèm thông tin chi tiết như project ID, dataset ID, table name.
  • Điều này minimize effort tối đa: Không code, không loop projects, chỉ mất vài giây. Phù hợp với quy mô 1000+ datasets trên hàng trăm projects.
  • Tính năng này được cập nhật liên tục đến 2026, hỗ trợ tìm kiếm semantic và tag-based search cho BigQuery metadata (theo docs Google Cloud 2024+).

📘 Nguồn tham khảo:

📋 Giải thích tất cả các phương án (đúng/sai)

Dưới đây là phân tích từng lựa chọn, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá với lý do cụ thể dựa trên kiến thức Google Cloud mới nhất (2026), tập trung vào việc minimize effort:

  • ✅ Go to Data Catalog and search for employee_ssn in the search box.
    🟢 Đúng: Như giải thích ở trên, đây là cách nhanh nhất, không cần code/script, tận dụng chỉ mục tự động của Data Catalog cho BigQuery metadata cross-projects. Hoàn hảo cho quy mô lớn.

  • ❌ Write a shell script that uses the bq command line tool to loop through all the projects in your organization.
    🔴 Sai: Phương án này yêu cầu viết script shell sử dụng lệnh bq ls để loop qua tất cả projects (cần quyền IAM rộng), liệt kê datasets/tables, rồi kiểm tra schema từng table – rất tốn thời gian (có thể hàng giờ/ngày với 1000+ datasets), dễ lỗi (rate limit bq CLI), và không minimize effort. Không tận dụng metadata sẵn có.

  • ❌ Write a script that loops through all the projects in your organization and runs a query on INFORMATION_SCHEMA.COLUMNS view to find the employee_ssn column.
    🔴 Sai: Sử dụng script (Python/Node.js) loop projects, chạy query SELECT * FROM dataset.INFORMATION_SCHEMA.COLUMNS WHERE column_name = 'employee_ssn' trên từng dataset – tốn kém chi phí query BigQuery (on-demand pricing), thời gian dài (hàng trăm projects), và cần quyền BigQuery Data Viewer rộng rãi. Không hiệu quả, vì quét metadata thay vì dùng chỉ mục sẵn.

  • ❌ Write a Cloud Dataflow job that loops through all the projects in your organization and runs a query on INFORMATION_SCHEMA.COLUMNS view to find employee_ssn column.
    🔴 Sai: Dataflow (Apache Beam) dùng cho ETL lớn, nhưng ở đây loop projects + query INFORMATION_SCHEMA là overkill (quá phức tạp, tốn chi phí Dataflow workers + BigQuery queries). Cần code pipeline phức tạp, deploy job, monitor – hoàn toàn không minimize effort, chỉ phù hợp data processing lớn chứ không phải metadata search đơn giản.

🏆 Kết luận

Sử dụng Data Catalog là giải pháp tối ưu nhất cho Associate Cloud Engineer, thể hiện kiến thức về metadata management trong Google Cloud. Nếu triển khai thực tế, đảm bảo quyền datacatalog.entries.searchAllResources cho user! 🚀

Câu 222
You create a Deployment with 2 replicas in a Google Kubernetes Engine cluster that has a single preemptible node pool. After a few minutes, you use kubectl to examine the status of your Pod and observe that one of them is still in Pending status:

What is the most likely cause?
  1. A The pending Pod's resource requests are too large to fit on a single node of the cluster.
  2. B Too many Pods are already running in the cluster, and there are not enough resources left to schedule the pending Pod.
  3. C The node pool is configured with a service account that does not have permission to pull the container image used by the pending Pod.
  4. D The pending Pod was originally scheduled on a node that has been preempted between the creation of the Deployment and your verification of the Pods' status. It is currently being rescheduled on a new node.
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi thuộc chủ đề Google Kubernetes Engine (GKE) trong Google Cloud Platform (không phải AWS như đề cập ban đầu, có thể là nhầm lẫn). Nội dung mô tả tình huống:
Bạn tạo một Deployment với 2 replicas (2 Pod giống nhau) trong một GKE cluster chỉ có một node pool preemptible duy nhất (preemptible node pool là loại node giá rẻ nhưng có thể bị Google thu hồi tài nguyên bất cứ lúc nào, thường sau tối đa 24 giờ).

Sau vài phút, bạn chạy lệnh kubectl get pods -l app=myapp để kiểm tra trạng thái Pod và thấy:
📸 Phân tích hình ảnh đính kèm (lệnh kubectl get pods -l app=myapp):

  • Có 2 Pod thuộc Deployment myapp-deployment-58ddbb99:
    • Pod đầu tiên (myapp-deployment-58ddbb99-1p86): READY: 0/1, STATUS: Pending, RESTARTS: 0, AGE: 9m (đang chờ schedule, chưa sẵn sàng).
    • Pod thứ hai (myapp-deployment-58ddbb99-qjkg): READY: 1/1, STATUS: Running, RESTARTS: 0, AGE: 9m (đang chạy bình thường).
  • Quan sát chính: Cả 2 Pod cùng tuổi 9 phút, một Pod Running (đã schedule thành công trên node), Pod kia vẫn Pending (chưa được assign vào node nào). Cluster chỉ có single preemptible node pool, nghĩa là node dễ bị preempt (thu hồi đột ngột), dẫn đến Pod phải reschedule lại.

Vấn đề cần xác định: Nguyên nhân most likely (phổ biến nhất) khiến một Pod Pending trong bối cảnh này?

🛠️ Bối cảnh kỹ thuật (cập nhật đến 2026): Trong GKE, preemptible nodes (tương tự Spot Instances) bị preempt ngẫu nhiên. Khi node preempt:

  • Pod trên node đó bị evict (Pending với lý do node loss).
  • Kubernetes scheduler tự động reschedule Pod lên node mới (nếu node pool có capacity).
  • Với single node pool, GKE tự động thay thế node preempt bằng node mới nếu node pool có min size >0 (mặc định). Thời gian reschedule thường nhanh, nhưng có thể delay vài phút nếu cluster bận.

✅ Đáp án đúng:

The pending Pod was originally scheduled on a node that has been preempted between the creation of the Deployment and your verification of the Pods' status. It is currently being rescheduled on a new node.

Lý do lựa chọn:
🟢 Đây là nguyên nhân most likely vì:

  • Cluster chỉ có single preemptible node pool → node dễ bị preempt bất cứ lúc nào (xác suất cao sau vài phút).
  • Cả 2 Pod cùng AGE 9m, chứng tỏ Deployment tạo cùng lúc, nhưng node bị preempt sau khi Pod đầu schedule thành công (bây giờ Running), Pod thứ hai bị evict và đang reschedule (Pending).
  • Hình ảnh cho thấy READY 0/1 và Pending → Pod đang chờ bind node mới, không phải lỗi image/resources vĩnh viễn.
  • GKE xử lý preempt bằng cách tự động reschedule Pod (không fail ngay), phù hợp với Deployment replicas. Nếu không preempt, cả 2 Pod sẽ Running nhanh.

📋 Giải thích tất cả các phương án (đúng/sai)

  • ❌ [SAI] The pending Pod's resource requests are too large to fit on a single node of the cluster.
    Lý do sai: Nếu resource requests quá lớn, cả 2 Pod sẽ Pending ngay từ đầu (không schedule được). Nhưng hình ảnh cho thấy một Pod đã Running (chứng tỏ node có đủ resources cho ít nhất 1 Pod). Pending chỉ xảy ra với 1 Pod sau 9m → không phải issue resources cố định.

  • ❌ [SAI] Too many Pods are already running in the cluster, and there are not enough resources left to schedule the pending Pod.
    Lý do sai: Cluster single preemptible node pool (thường ít node), nhưng một Pod đang Running → có resources cho Pod đó. Nếu "too many Pods", cả Deployment sẽ Pending hoặc scale fail từ lúc tạo. Hình ảnh không chỉ cluster đầy (chỉ 2 Pod), và preemptible node thường empty ban đầu.

  • ❌ [SAI] The node pool is configured with a service account that does not have permission to pull the container image used by the pending Pod.
    Lý do sai: Lỗi image pull sẽ hiển thị ImagePullBackOff hoặc ErrImagePull trong STATUS (không phải Pending thuần). Hình ảnh chỉ Pending (chờ schedule), và Pod Running kia pull image thành công → service account OK. Issue này ảnh hưởng tất cả Pod cùng image.

  • ✅ [ĐÚNG] The pending Pod was originally scheduled on a node that has been preempted between the creation of the Deployment and your verification of the Pods' status. It is currently being rescheduled on a new node.
    (Giải thích chi tiết như phần ✅ ở trên).


📘 Tài liệu tham khảo (cập nhật mới nhất 2026)

  • GKE Preemptible VMs: Google Cloud Docs - About preemptible VM instances → Giải thích node preempt → Pod reschedule, events như "Preempted".
  • Pod Pending troubleshooting: GKE Debugging Pods → Pending do node loss/preempt.
  • kubectl describe pod sẽ show events "FailedScheduling: 0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/preemption-evicted: }, ..." (kiểm tra thực tế).
  • Exam reference: ExamTopics/Google ACE exam QID 04338 (xác nhận D đúng).

Hy vọng phân tích giúp bạn ôn thi hiệu quả! 🚀 Nếu cần demo lab GKE, hỏi thêm nhé!

Câu 223
You want to find out when users were added to Cloud Spanner Identity Access Management (IAM) roles on your Google Cloud Platform (GCP) project. What should you do in the GCP Console?
  1. A Open the Cloud Spanner console to review configurations.
  2. B Open the IAM & admin console to review IAM policies for Cloud Spanner roles.
  3. C Go to the Observability Monitoring console and review information for Cloud Spanner.
  4. D Go to the Observability Logging console, review admin activity logs, and filter them for Cloud Spanner IAM roles.
Xem giải thích

🧩 Phân tích nội dung câu hỏi

Câu hỏi yêu cầu tìm cách xem thời điểm người dùng được thêm vào các vai trò IAM (Identity Access Management) của Cloud Spanner trong một dự án Google Cloud Platform (GCP). Cloud Spanner là dịch vụ cơ sở dữ liệu phân tán có khả năng mở rộng toàn cầu của GCP, và IAM quản lý quyền truy cập vào các tài nguyên này.

Mục tiêu là kiểm tra lịch sử hoạt động quản trị (audit logs) để xác định thời gian chính xác khi người dùng được gán vai trò IAM cụ thể cho Cloud Spanner (ví dụ: roles/spanner.databaseUser). Điều này thuộc về nhật ký hoạt động hành chính (Admin Activity Logs), giúp theo dõi các thay đổi quyền truy cập mà không cần cấu hình thêm.

🛠️ Lý do cần audit logs: GCP ghi lại tất cả các hành động IAM như một phần của Cloud Audit Logs, bao gồm Data Access, Admin Activity, Policy Denied, và System Event. Admin Activity Logs là nơi lưu trữ thay đổi IAM, và bạn có thể lọc theo dịch vụ (Cloud Spanner) qua GCP Console.

📘 Tài liệu tham khảo (cập nhật đến 2026):

✅ Đáp án đúng và lý do lựa chọn

Đáp án đúng: Go to the Observability Logging console, review admin activity logs, and filter them for Cloud Spanner IAM roles.

Lý do:

  • Đây là cách chính xác và trực tiếp nhất để tra cứu lịch sử thay đổi IAM cho Cloud Spanner.
  • Trong Observability Logging console (trước đây gọi là Cloud Logging), bạn chọn Admin Activity Logs, sau đó lọc theo protoPayload.serviceName=spanner.googleapis.com và protoPayload.methodName liên quan đến IAM (như google.iam.admin.v1.SetIamPolicy hoặc google.cloud.spanner.admin.v1.Instance.SetIamPolicy).
  • Logs này ghi lại thời gian chính xác (timestamp), người thực hiện, và chi tiết thay đổi vai trò IAM. Không cần công cụ khác, hoàn toàn miễn phí cho Admin Activity Logs.
  • Phù hợp với best practice GCP để audit compliance và security (theo CIS benchmarks 2025).

📋 Giải thích tất cả các phương án

Dưới đây là phân tích chi tiết từng lựa chọn, giữ nguyên văn bản gốc bằng tiếng Anh:

  • ❌ [SAI] Open the Cloud Spanner console to review configurations.
    Phương án này sai vì Cloud Spanner console chỉ hiển thị cấu hình hiện tại của instance/database (như schema, nodes), không có tính năng xem lịch sử audit logs IAM. Nó không lưu trữ hoặc hiển thị thời gian thêm user vào roles, chỉ dùng để quản lý runtime.

  • ❌ [SAI] Open the IAM & admin console to review IAM policies for Cloud Spanner roles.
    Phương án này sai vì IAM & Admin console chỉ cho xem trạng thái IAM hiện tại (bind members to roles), không hiển thị lịch sử thay đổi hoặc timestamp. Để audit lịch sử, phải dùng Logging, không phải IAM console (dù IAM console có link đến logs).

  • ❌ [SAI] Go to the Observability Monitoring console and review information for Cloud Spanner.
    Phương án này sai vì Observability Monitoring (Cloud Monitoring) tập trung vào metrics/performance như CPU, latency của Spanner, không ghi audit logs IAM. Monitoring không theo dõi thay đổi quyền truy cập, chỉ dùng cho observability hệ thống.

  • ✅ [ĐÚNG] Go to the Observability Logging console, review admin activity logs, and filter them for Cloud Spanner IAM roles.
    Như đã giải thích ở trên, đây là cách chuẩn để truy vấn logs với filter chính xác, đảm bảo tìm được thời gian thêm user vào IAM roles của Spanner. Hỗ trợ query bằng Logs Explorer với các trường như resource.type="spanner.googleapis.com/Instance" hoặc jsonPayload.authenticationInfo.principalEmail.

🧠 Mẹo thi Associate Cloud Engineer: Luôn ưu tiên Cloud Logging cho audit IAM thay đổi, đặc biệt với dịch vụ như Spanner. Thực hành qua GCP Console miễn phí để quen filter logs!

Câu 224 Chọn nhiều đáp án
Your company implemented BigQuery as an enterprise data warehouse. Users from multiple business units run queries on this data warehouse. However, you notice that query costs for BigQuery are very high, and you need to control costs. Which two methods should you use? (Choose two.)
  1. A Split the users from business units to multiple projects.
  2. B Apply a user- or project-level custom query quota for BigQuery data warehouse.
  3. C Create separate copies of your BigQuery data warehouse for each business unit.
  4. D Split your BigQuery data warehouse into multiple data warehouses for each business unit.
  5. E Change your BigQuery query model from on-demand to flat rate. Apply the appropriate number of slots to each Project.
Xem giải thích

🧩 Phân tích nội dung câu hỏi

Câu hỏi tập trung vào việc kiểm soát chi phí truy vấn cao trong BigQuery – một kho dữ liệu doanh nghiệp (enterprise data warehouse) trên Google Cloud Platform (GCP). Công ty đã triển khai BigQuery, và nhiều đơn vị kinh doanh (business units) chạy truy vấn trên cùng một kho dữ liệu này, dẫn đến chi phí rất cao. Yêu cầu chọn hai phương pháp để kiểm soát chi phí một cách hiệu quả.

Vấn đề chính:

  • BigQuery tính phí dựa trên mô hình on-demand (mặc định, tính theo lượng dữ liệu quét – per TB scanned), dễ dẫn đến chi phí tăng vọt nếu truy vấn lớn hoặc thường xuyên.
  • Cần các giải pháp tiết kiệm chi phí mà không ảnh hưởng lớn đến hiệu suất hoặc kiến trúc dữ liệu. 🛠️ Mục tiêu: Giảm chi phí truy vấn mà vẫn hỗ trợ đa đơn vị kinh doanh truy cập chung kho dữ liệu.

✅ Đáp án đúng và lý do lựa chọn

Hai đáp án đúng là:
1. Apply a user- or project-level custom query quota for BigQuery data warehouse.
2. Change your BigQuery query model from on-demand to flat rate. Apply the appropriate number of slots to each Project.

Lý do lựa chọn 📘:

  • Những phương pháp này trực tiếp giới hạn và dự đoán chi phí mà không cần thay đổi kiến trúc dữ liệu lớn. Quota giúp kiểm soát số lượng truy vấn/người dùng/dự án, tránh lạm dụng. Chuyển sang flat-rate pricing (mua slots cố định) loại bỏ phí theo lượng dữ liệu quét, chỉ trả phí cố định cho công suất tính toán (slots), phù hợp cho workload lớn và dự đoán được chi phí (cập nhật đến 2026, BigQuery hỗ trợ reservations và flex slots linh hoạt hơn). Điều này tối ưu cho doanh nghiệp đa đơn vị, tránh chi phí on-demand bùng nổ.

📋 Giải thích tất cả các phương án

Dưới đây là phân tích chi tiết từng lựa chọn, giữ nguyên văn bản gốc bằng tiếng Anh. Tôi đánh dấu ✅ (đúng) hoặc ❌ (sai), kèm giải thích bằng tiếng Việt dựa trên tài liệu BigQuery mới nhất (2026: hỗ trợ advanced quotas, committed/flex slots).

  • ❌ Split the users from business units to multiple projects.
    Phương án này không hiệu quả để kiểm soát chi phí. Việc tách user vào nhiều project chỉ phân tán quản lý IAM, nhưng chi phí BigQuery vẫn tính chung theo dữ liệu quét (on-demand) hoặc slots dự án. Nó tăng độ phức tạp quản lý (multi-project billing), không giảm chi phí trực tiếp mà có thể làm tăng overhead (như duplicate permissions). Không khuyến nghị cho vấn đề query costs.

  • ✅ Apply a user- or project-level custom query quota for BigQuery data warehouse.
    Đúng hoàn toàn. BigQuery cho phép đặt custom quotas ở mức user/project (qua Console/API/quota admin), giới hạn số bytes quét/ngày hoặc số truy vấn. Điều này ngăn chặn truy vấn lớn/lạm dụng từ các business units, trực tiếp kiểm soát chi phí mà không ảnh hưởng dữ liệu chung. Ví dụ: Set 1TB/user/ngày để tránh vượt budget. (Cập nhật 2026: Tích hợp với Budget Alerts tự động).

  • ❌ Create separate copies of your BigQuery data warehouse for each business unit.
    Sai và tốn kém hơn. Sao chép dữ liệu (copy datasets/tables) dẫn đến chi phí storage nhân lên (long-term storage ~$0.023/GB/tháng), cộng thêm query costs riêng lẻ. Không scalable cho enterprise, tăng latency sync dữ liệu và quản lý phức tạp. BigQuery khuyến khích shared warehouse với row-level security thay vì duplicate.

  • ❌ Split your BigQuery data warehouse into multiple data warehouses for each business unit.
    Sai, tương tự phương án trên. Tách dataset thành nhiều warehouse riêng biệt tăng storage và slot usage, không giảm chi phí tổng thể (vẫn cần slots riêng). BigQuery thiết kế cho federated/multi-tenant access qua views/authorized views, không cần split physically. Làm vậy còn khó maintain data consistency.

  • ✅ Change your BigQuery query model from on-demand to flat rate. Apply the appropriate number of slots to each Project.
    Đúng và hiệu quả nhất cho workload lớn. Chuyển từ on-demand (phí biến động theo TB) sang flat-rate (mua slots cố định, ví dụ 500 slots ~$8,000/tháng, không giới hạn query volume). Phân bổ slots cho từng project phù hợp với business units giúp dự đoán chi phí 100%, tránh bill shock. (2026 update: Hỗ trợ Flex Slots tự động scale, committed use discounts lên đến 57%).

📚 Tài liệu tham khảo

Hy vọng phân tích này giúp bạn ôn thi hiệu quả! 🚀 Nếu cần thêm ví dụ thực hành, hãy hỏi nhé.

Câu 225
You are building a product on top of Google Kubernetes Engine (GKE). You have a single GKE cluster. For each of your customers, a Pod is running in that cluster, and your customers can run arbitrary code inside their Pod. You want to maximize the isolation between your customers' Pods. What should you do?
  1. A Use Binary Authorization and whitelist only the container images used by your customers' Pods.
  2. B Use the Container Analysis API to detect vulnerabilities in the containers used by your customers' Pods.
  3. C Create a GKE node pool with a sandbox type configured to gvisor. Add the parameter runtimeClassName: gvisor to the specification of your customers' Pods.
  4. D Use the cos_containerd image for your GKE nodes. Add a nodeSelector with the value cloud.google.com/gke-os-distribution: cos_containerd to the specification of your customers' Pods.
Xem giải thích

🧩 Phân tích nội dung câu hỏi

Câu hỏi tập trung vào việc xây dựng sản phẩm trên Google Kubernetes Engine (GKE) với một cluster GKE duy nhất. Mỗi khách hàng có một Pod riêng chạy trong cluster này, và họ có thể chạy code tùy ý bên trong Pod (arbitrary code). Mục tiêu là tối đa hóa sự cô lập (isolation) giữa các Pod của các khách hàng khác nhau, nhằm tránh tình trạng một Pod có thể ảnh hưởng đến Pod khác (ví dụ: tấn công side-channel, privilege escalation do multi-tenant).

Vấn đề cốt lõi là multi-tenant security trong GKE: Các Pod chia sẻ node và kernel, nên cần cơ chế sandbox runtime để tăng cường isolation mà không cần cluster riêng cho từng khách hàng. Giải pháp phải tận dụng tính năng GKE mới nhất (cập nhật đến 2026), như sandbox runtimes, để đảm bảo an toàn cao nhất cho workloads chạy code không tin cậy.

✅ Đáp án đúng và lý do lựa chọn

Đáp án đúng: Create a GKE node pool with a sandbox type configured to gvisor. Add the parameter runtimeClassName: gvisor to the specification of your customers' Pods.

Lý do chi tiết:
🛠️ gVisor là runtime sandbox của Google dành riêng cho GKE (từ phiên bản GKE 1.18+, cập nhật đầy đủ đến 2026), chạy container trong một môi trường sandboxed VM-like (user-space kernel). Nó tách biệt hoàn toàn Pod khỏi host kernel, giảm bề mặt tấn công >90% so với runc tiêu chuẩn.

  • Tạo node pool riêng với sandbox type: gvisor để các node chỉ chạy runtime này.
  • Thêm runtimeClassName: gvisor vào Pod spec để Pods của khách hàng sử dụng runtime này.
    Điều này tối ưu isolation cho multi-tenant mà không ảnh hưởng performance nhiều (overhead ~5-10%). Đây là best practice chính thức cho workloads chạy code arbitrary.

📋 Giải thích tất cả các phương án

Dưới đây là phân tích từng lựa chọn một cách chi tiết, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá đúng/sai với lý do cụ thể dựa trên tài liệu GKE mới nhất (2026).

  • ❌ Use Binary Authorization and whitelist only the container images used by your customers' Pods.
    Sai vì: Binary Authorization (nay là Binary Authorization for Borg - phần của GKE Enterprise) chỉ kiểm soát và xác thực image trước khi deploy (attest + policy). Nó ngăn image độc hại nhưng không cung cấp runtime isolation giữa Pods đã chạy. Khách hàng vẫn chạy arbitrary code trong Pod, có thể exploit kernel chia sẻ → không maximize isolation.

  • ❌ Use the Container Analysis API to detect vulnerabilities in the containers used by your customers' Pods.
    Sai vì: Container Analysis API (trong Artifact Registry) chỉ quét vulnerability (CVE) trong image/container tại build-time hoặc scan-time. Nó giúp phát hiện lỗ hổng nhưng không thực thi isolation runtime. Pods vẫn chia sẻ kernel, arbitrary code có thể bypass scan → chỉ là defensive measure, không giải quyết multi-tenant isolation.

  • ✅ Create a GKE node pool with a sandbox type configured to gvisor. Add the parameter runtimeClassName: gvisor to the specification of your customers' Pods.
    Đúng vì: Như đã giải thích ở trên. gVisor (sandbox type chính thức từ GKE 1.21+, hỗ trợ full đến 2026) tạo isolation mạnh mẽ qua sentry/user-space kernel. Node pool riêng đảm bảo scalability, runtimeClassName: gvisor chỉ định Pod dùng gVisor → best fit cho yêu cầu.

  • ❌ Use the cos_containerd image for your GKE nodes. Add a nodeSelector with the value cloud.google.com/gke-os-distribution: cos_containerd to the specification of your customers' Pods.
    Sai vì: Container-Optimized OS (COS) với cos_containerd là node OS nhẹ (dùng containerd runtime), cải thiện security qua immutable OS và seccomp. Nhưng nó không phải sandbox runtime như gVisor, chỉ là node-level hardening. Pods vẫn dùng runc kernel chia sẻ → isolation kém hơn, không đủ cho arbitrary code multi-tenant.

📘 Tài liệu tham khảo

  • GKE Sandbox Documentation: gVisor on GKE (cập nhật 2026: hỗ trợ Autopilot + Enterprise).
  • GKE Security Best Practices: Securing Multi-Tenant Workloads – Khuyến nghị gVisor cho arbitrary code.
  • Runtime Classes in GKE: Kubernetes RuntimeClass (tích hợp GKE).
  • So sánh Runtimes: GKE release notes 1.28+ (2024-2026) nhấn mạnh gVisor > COS cho isolation.

Hy vọng phân tích này giúp bạn ôn thi Associate Cloud Engineer! 🚀 Nếu cần thêm ví dụ YAML, hãy hỏi nhé!

Câu 226
Your customer has implemented a solution that uses Cloud Spanner and notices some read latency-related performance issues on one table. This table is accessed only by their users using a primary key. The table schema is shown below.
CREATE TABLE Persons (
  person_id INT64 NOT NULL, 
  account_creation_date DATE, 
  birthdate DATE, 
  firstname STRING(255), 
  lastname STRING(255), 
  profile_picture BYTES(255)
) PRIMARY KEY (person_id)

You want to resolve the issue. What should you do?
  1. A Remove the profile_picture field from the table.
  2. B Add a secondary index on the person_id column.
  3. C Change the primary key to not have monotonically increasing values.
  4. D Create a secondary index using the following Data Definition Language (DDL):
    CREATE INDEX person_id_ix
    ON Persons (
        person_id,
        firstname,
        lastname
    ) STORING (
        profile_picture
    )
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi tập trung vào một vấn đề hiệu suất đọc (read latency) trên bảng Persons trong Google Cloud Spanner (không phải AWS như mô tả ban đầu, vì Cloud Spanner là dịch vụ cơ sở dữ liệu phân tán của GCP). Khách hàng chỉ truy cập bảng này qua primary key (person_id), và schema được cung cấp rõ ràng:

CREATE TABLE Persons (
  person_id INT64 NOT NULL, 
  account_creation_date DATE, 
  birthdate DATE, 
  firstname STRING(255), 
  lastname STRING(255), 
  profile_picture BYTES(255)
) PRIMARY KEY (person_id)

Vấn đề cốt lõi 📈: Read latency cao trên một bảng cụ thể. Trong Cloud Spanner, điều này thường xảy ra do hot spots (điểm nóng) khi primary key có giá trị monotonically increasing (tăng dần liên tục, như ID tự động tăng). Các truy cập đọc/ghi mới tập trung vào cuối không gian key, gây mất cân bằng phân bố dữ liệu trên các split/node, dẫn đến tắc nghẽn và latency cao. Giải pháp cần tối ưu hóa thiết kế primary key để tránh hiện tượng này, theo best practices của Spanner (cập nhật đến 2026: Spanner v2.x vẫn khuyến nghị key design phân tán đều).

Mục tiêu: Giải quyết vấn đề bằng cách thay đổi schema hoặc index phù hợp. 🛠️

✅ Đáp án đúng và lý do lựa chọn

Đáp án đúng: Change the primary key to not have monotonically increasing values.

Lý do chi tiết 🎯:

  • Primary key person_id (INT64) thường được thiết kế tăng dần (ví dụ: timestamp-based hoặc auto-increment), gây hot spot vì tất cả insert/read mới đổ dồn vào các split cuối cùng của bảng.
  • Cloud Spanner phân chia dữ liệu theo key range (splitting), nên key tăng dần làm dữ liệu không phân bố đều, dẫn đến read latency cao ngay cả khi chỉ truy cập qua PK.
  • Giải pháp: Thay đổi PK thành non-monotonic như kết hợp hash(person_id) + person_id, hoặc dùng UUID/random value để phân bố đều trên toàn bộ key space. Điều này cải thiện throughput và giảm latency ngay lập tức (có thể lên đến 10x theo benchmark GCP).
  • Đây là khuyến nghị chính thức từ GCP cho high-read workloads. 📘

❌ Phân tích tất cả các phương án (đúng/sai)

  • [SAI] Remove the profile_picture field from the table.
    ❌ Lý do sai: Trường profile_picture chỉ là BYTES(255) (rất nhỏ, ~255 bytes), không phải nguyên nhân gây latency. Vấn đề nằm ở hot spot từ PK, không liên quan đến kích thước cột. Việc xóa chỉ làm mất dữ liệu mà không giải quyết root cause.

  • [SAI] Add a secondary index on the person_id column.
    ❌ Lý do sai: person_id đã là primary key, nên Spanner tự động index nó hiệu quả nhất (Interleaved hoặc full scan trên PK nhanh). Thêm secondary index trên PK là vô ích, tốn tài nguyên lưu trữ và không giảm hot spot/hot partition.

  • [ĐÚNG] Change the primary key to not have monotonically increasing values.
    ✅ Lý do đúng (như đã giải thích ở trên): Trực tiếp khắc phục hot spot bằng cách làm key phân bố đều, cải thiện read/write throughput. Đây là best practice hàng đầu cho Spanner tables với access pattern chỉ qua PK.

  • [SAI] Create a secondary index using the following Data Definition Language (DDL):

    CREATE INDEX person_id_ix
    ON Persons (
        person_id,
        firstname,
        lastname
    ) STORING (
        profile_picture
    )
    

    ❌ Lý do sai: Index này dựa trên PK đầu tiên (person_id) nên vẫn kế thừa hot spot (person_id tăng dần làm index cũng bị imbalance). STORING profile_picture chỉ tối ưu nếu query select cột này mà không dùng PK trực tiếp, nhưng câu hỏi xác nhận chỉ truy cập qua PK, nên index thừa và không giải quyết latency gốc.

📘 Tài liệu tham khảo (cập nhật 2026)

Hy vọng phân tích này giúp bạn ôn thi hiệu quả! 🚀 Nếu cần ví dụ code thay đổi PK, hãy hỏi thêm.

Câu 227
Your finance team wants to view the billing report for your projects. You want to make sure that the finance team does not get additional permissions to the project. What should you do?
  1. A Add the group for the finance team to roles/billing user role.
  2. B Add the group for the finance team to roles/billing admin role.
  3. C Add the group for the finance team to roles/billing viewer role.
  4. D Add the group for the finance team to roles/billing project/Manager role.
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi này thuộc chủ đề quản lý quyền truy cập billing (hóa đơn) trong Google Cloud Platform (GCP). Cụ thể, đội ngũ tài chính (finance team) muốn xem báo cáo billing cho các dự án (projects) của bạn, nhưng bạn cần đảm bảo họ không nhận thêm quyền nào khác ngoài việc xem báo cáo.

🛠️ Yêu cầu chính:

  • Cấp quyền chỉ đọc (read-only) cho billing reports.
  • Không cấp quyền quản lý, chỉnh sửa hoặc liên kết dự án với billing account.
  • Sử dụng IAM roles ở cấp billing account (không phải project level) để tránh cấp quyền thừa vào project.

📘 Kiến thức nền tảng (cập nhật đến 2026): Trong GCP, quyền billing được quản lý qua Billing Account IAM roles. Các role này được gán trực tiếp cho billing account, không phải project, để kiểm soát chặt chẽ. Không liên quan đến AWS (có lẽ là nhầm lẫn trong yêu cầu, nhưng câu hỏi rõ ràng là GCP). Tham khảo: Google Cloud Billing Access Control và IAM Roles for Billing.

✅ Đáp án đúng

Add the group for the finance team to roles/billing.viewer role.

Lý do lựa chọn:

  • Role roles/billing.viewer cung cấp quyền chỉ đọc billing data, bao gồm xem báo cáo billing, danh sách projects liên kết, và chi phí – chính xác đáp ứng nhu cầu "view the billing report".
  • Không cấp quyền chỉnh sửa, liên kết/unlink projects, hoặc quản lý billing account, đảm bảo finance team không có thêm permissions vào project.
  • Đây là role tối thiểu và an toàn nhất theo nguyên tắc least privilege trong GCP IAM.

📋 Phân tích tất cả các phương án

Dưới đây là giải thích chi tiết từng lựa chọn, dựa trên tài liệu GCP IAM roles mới nhất (predefined roles cho billing account). Tôi giữ nguyên văn bản gốc tiếng Anh của phương án, chỉ phân tích bằng tiếng Việt.

  • [SAI] Add the group for the finance team to roles/billing.user role.
    ❌ Sai vì: Role roles/billing.viewer chỉ cho phép xem, trong khi roles/billing.user cấp thêm quyền liên kết/unlink projects với billing account (ví dụ: gán project mới vào billing). Điều này vi phạm yêu cầu "không cấp thêm permissions", vì finance team có thể thay đổi cấu hình billing ngoài việc xem báo cáo.

  • [SAI] Add the group for the finance team to roles/billing.admin role.
    ❌ Sai vì: Role roles/billing.admin là quyền quản trị đầy đủ billing account, bao gồm tạo/xóa billing account, quản lý payments, và tất cả quyền của user/viewer. Quá mức cần thiết, dẫn đến rủi ro bảo mật cao – finance team có thể kiểm soát toàn bộ billing, không chỉ xem reports.

  • [ĐÚNG] Add the group for the finance team to roles/billing.viewer role.
    ✅ Đúng vì: Như đã giải thích ở trên, role này chỉ cho phép xem billing reports, costs, exports, và projects liên kết – hoàn hảo cho finance team mà không cấp quyền chỉnh sửa hoặc quản lý project.

  • [SAI] Add the group for the finance team to roles/billing.projectManager role.
    ❌ Sai vì: Role roles/billing.projectManager không tồn tại trong GCP IAM predefined roles (kiểm tra docs đến 2026). Có thể nhầm với roles/billing.accountManager (quản lý nhiều billing accounts) hoặc project-level roles, nhưng dù sao cũng không phù hợp vì không tập trung vào "view only" và có thể cấp quyền thừa vào projects.

🛡️ Lời khuyên thực hành: Để triển khai, truy cập Billing Console > Account Management > IAM & Admin, thêm group vào role billing.viewer. Kiểm tra quyền bằng Policy Simulator trong IAM để xác nhận. Nếu cần chi tiết hơn, tham khảo GCP Billing Best Practices.

Câu 228
Your organization has strict requirements to control access to Google Cloud projects. You need to enable your Site Reliability Engineers (SREs) to approve requests from the Google Cloud support team when an SRE opens a support case. You want to follow Google-recommended practices. What should you do?
  1. A Add your SREs to roles/iam.roleAdmin role.
  2. B Add your SREs to roles/accessapproval.approver role.
  3. C Add your SREs to a group and then add this group to roles/iam.roleAdmin.role.
  4. D Add your SREs to a group and then add this group to roles/accessapproval.approver role.
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi tập trung vào việc kiểm soát truy cập nghiêm ngặt (strict access control) đối với các dự án Google Cloud. Tổ chức cần cho phép các Site Reliability Engineers (SREs) phê duyệt (approve) các yêu cầu từ đội ngũ hỗ trợ Google Cloud khi SRE mở một case hỗ trợ. Yêu cầu phải tuân thủ các thực hành khuyến nghị của Google (Google-recommended practices).

📘 Bối cảnh chính:

  • Google Cloud có tính năng Access Approval (phần của Access Context Manager) để kiểm soát truy cập tạm thời từ Google support vào tài nguyên khách hàng, đảm bảo tuân thủ nguyên tắc least privilege (quyền hạn tối thiểu).
  • SREs cần quyền phê duyệt các yêu cầu này mà không cấp quyền quản lý IAM rộng rãi, tránh rủi ro bảo mật.
  • Best practice: Sử dụng nhóm (groups) để quản lý quyền IAM thay vì gán trực tiếp cho cá nhân, giúp dễ dàng scale và audit.

🛠️ Mục tiêu: Tìm cách gán role phù hợp nhất cho SREs để approve requests từ support team.

✅ Đáp án đúng và lý do lựa chọn

Đáp án đúng: Add your SREs to a group and then add this group to roles/accessapproval.approver role.

Lý do:

  • Role roles/accessapproval.approver là role chuyên biệt được Google khuyến nghị để phê duyệt các yêu cầu Access Approval từ support team. Nó cho phép SREs xem, approve/deny requests mà không cấp quyền quản lý IAM hoặc truy cập tài nguyên khác.
  • Sử dụng group để gán role tuân thủ Google IAM best practices: Dễ quản lý (add/remove members), hỗ trợ audit, và tránh gán quyền trực tiếp (impersonation risks).
  • Điều này đảm bảo least privilege và phù hợp với yêu cầu "strict requirements" + "Google-recommended practices" (cập nhật đến 2026, theo docs IAM v2 và Access Approval enhancements).

📋 Giải thích tất cả các phương án (đúng/sai)

  • [SAI] Add your SREs to roles/iam.roleAdmin role.
    ❌ Sai vì: Role roles/iam.roleAdmin cho phép quản lý toàn bộ IAM roles (tạo/sửa/xóa bindings), quyền lực quá cao (over-privileged). Không liên quan đến Access Approval, vi phạm least privilege và không phải best practice cho approve support requests. Rủi ro: SREs có thể thay đổi quyền toàn dự án.

  • [SAI] Add your SREs to roles/accessapproval.approver role.
    ❌ Sai vì: Role đúng (roles/accessapproval.approver) nhưng gán trực tiếp cho SREs thay vì qua group. Google khuyến nghị sử dụng groups/Cloud Identity để quản lý (IAM best practices), tránh quản lý thủ công khó scale và audit kém. Không tuân thủ "recommended practices".

  • [SAI] Add your SREs to a group and then add this group to roles/iam.roleAdmin.role.
    ❌ Sai vì: Sử dụng group là tốt, nhưng role roles/iam.roleAdmin quá rộng (IAM admin đầy đủ). Không giải quyết approve Access Approval, chỉ cấp quyền quản lý IAM không cần thiết, tăng rủi ro bảo mật nghiêm trọng.

  • [ĐÚNG] Add your SREs to a group and then add this group to roles/accessapproval.approver role.
    ✅ Đúng vì: Kết hợp group + role chính xác (roles/accessapproval.approver), đảm bảo SREs chỉ approve được support requests. Hoàn hảo với strict access control và Google best practices (least privilege, scalable management).

📚 Tài liệu tham khảo (cập nhật mới nhất đến 2026)

🛡️ Lưu ý: Luôn enable Access Approval tại folder/organization level trước khi gán roles!

Câu 229
You need to host an application on a Compute Engine instance in a project shared with other teams. You want to prevent the other teams from accidentally causing downtime on that application. Which feature should you use?
  1. A Use a Shielded VM.
  2. B Use a Preemptible VM.
  3. C Use a sole-tenant node.
  4. D Enable deletion protection on the instance.
Xem giải thích

🧩 Phân tích chi tiết câu hỏi

Câu hỏi này thuộc chủ đề Google Cloud Compute Engine (không phải AWS như mô tả ban đầu, có thể là nhầm lẫn). Nội dung câu hỏi:
"You need to host an application on a Compute Engine instance in a project shared with other teams. You want to prevent the other teams from accidentally causing downtime on that instance. Which feature should you use?"

  • Giải thích rõ ràng: Bạn cần triển khai một ứng dụng trên một Compute Engine VM instance trong một project được chia sẻ với các team khác. Mục tiêu là ngăn chặn các team khác vô tình gây ra downtime (ngừng hoạt động) cho ứng dụng đó. Downtime có thể xảy ra do các hành động như xóa instance, dừng máy ảo, hoặc thay đổi cấu hình không mong muốn. Câu hỏi yêu cầu chọn tính năng phù hợp nhất để bảo vệ instance khỏi các thao tác tai nạn từ người dùng khác trong cùng project (không cần cách ly hoàn toàn project).
    ✅ Tính năng cần tìm là giải pháp bảo vệ instance khỏi bị xóa hoặc dừng ngẫu nhiên, giúp duy trì tính sẵn sàng của ứng dụng.

✅ Đáp án đúng: Enable deletion protection on the instance.

Lý do lựa chọn:
Deletion protection là tính năng bảo vệ xóa instance trên Compute Engine, ngăn chặn việc xóa instance qua Console, gcloud CLI, hoặc API một cách vô tình. Khi kích hoạt, instance không thể bị xóa trừ khi tắt tính năng này trước. Điều này lý tưởng cho project chia sẻ, vì các team khác (có quyền editor/viewer) không thể vô tình xóa instance gây downtime. Tính năng này dễ kích hoạt và không ảnh hưởng đến hiệu suất.
🛡️ Lợi ích chính: Chỉ bảo vệ chống xóa, nhưng đủ để tránh downtime do xóa nhầm – phù hợp nhất với yêu cầu "prevent accidentally causing downtime".

📋 Giải thích tất cả các phương án (đúng và sai)

Dưới đây là phân tích từng lựa chọn, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá dựa trên tài liệu GCP mới nhất (cập nhật đến 2026, theo Compute Engine docs phiên bản hiện hành):

  • ❌ [SAI] Use a Shielded VM.
    Shielded VM cung cấp bảo mật nâng cao như verifiable secure boot, integrity monitoring, và vTPM để chống rootkit/malware. Nó không ngăn chặn xóa hoặc dừng instance từ người dùng có quyền trong project. Các team khác vẫn có thể xóa VM gây downtime. ❌ Không liên quan đến bảo vệ chống thao tác vô tình.

  • ❌ [SAI] Use a Preemptible VM.
    Preemptible VM là loại máy ảo rẻ tiền (giảm chi phí đến 80%), nhưng có thể bị Google preempt (dừng đột ngột) sau 24 giờ hoặc khi cần tài nguyên. Điều này tăng nguy cơ downtime thay vì giảm, đặc biệt không kiểm soát được hành động của các team khác. ❌ Phù hợp cho workload không critical, trái ngược yêu cầu.

  • ❌ [SAI] Use a sole-tenant node.
    Sole-tenant node cho phép VM chạy trên node vật lý dành riêng (không chia sẻ hardware với VM khác), tăng bảo mật và tuân thủ (compliance). Tuy nhiên, nó không ngăn chặn xóa instance từ Console/gcloud – các team khác vẫn có thể xóa. Chi phí cao và phức tạp hơn. ❌ Tập trung vào isolation hardware, không phải chống xóa vô tình.

  • ✅ [ĐÚNG] Enable deletion protection on the instance.
    Như đã giải thích ở trên: Trực tiếp ngăn xóa instance, bảo vệ ứng dụng khỏi downtime do thao tác ngẫu nhiên trong project chia sẻ. Có thể kết hợp với advanced protection (bảo vệ nâng cao) để chống dừng/migrate. 🛡️ Giải pháp đơn giản, hiệu quả nhất.

📘 Tài liệu tham khảo (cập nhật mới nhất GCP 2026)

🛠️ Lời khuyên: Trong project chia sẻ, kết hợp deletion protection với IAM roles hạn chế (như compute.instanceAdmin.v1) để bảo vệ toàn diện hơn!

Câu 230
Your organization needs to grant users access to query datasets in BigQuery but prevent them from accidentally deleting the datasets. You want a solution that follows Google-recommended practices. What should you do?
  1. A Add users to roles/bigquery user role only, instead of roles/bigquery dataOwner.
  2. B Add users to roles/bigquery dataEditor role only, instead of roles/bigquery dataOwner.
  3. C Create a custom role by removing delete permissions, and add users to that role only.
  4. D Create a custom role by removing delete permissions. Add users to the group, and then add the group to the custom role.
Xem giải thích

🧩 Giải thích nội dung câu hỏi

Câu hỏi yêu cầu tổ chức cần cấp quyền cho người dùng truy vấn (query) dữ liệu trong các dataset của BigQuery, nhưng ngăn chặn việc xóa nhầm dataset. Giải pháp phải tuân thủ các thực hành tốt nhất được Google khuyến nghị (Google-recommended practices).

🔍 Chi tiết phân tích:

  • Query datasets: Người dùng cần quyền đọc dữ liệu (bigquery.tables.getData), liệt kê dataset/table (bigquery.datasets.list, bigquery.tables.list), và chạy job truy vấn (bigquery.jobs.create).
  • Prevent deleting datasets: Phải loại bỏ quyền bigquery.datasets.delete (chỉ có trong roles như bigquery.dataOwner hoặc bigQuery.admin).
  • Google-recommended practices (cập nhật đến 2026):
    • Sử dụng predefined roles trước custom roles (least privilege principle).
    • Không cấp quyền trực tiếp cho cá nhân; thay vào đó dùng groups để quản lý quy mô lớn, dễ audit và revoke.
    • Custom roles chỉ khi predefined không đủ, và bind vào groups chứ không phải users trực tiếp.
  • Bối cảnh: Giả sử người dùng hiện có quyền cao như dataOwner (có delete), cần downgrade an toàn.

📘 Tài liệu tham khảo:

✅ Đáp án đúng

Create a custom role by removing delete permissions. Add users to the group, and then add the group to the custom role.

Lý do lựa chọn 🛠️:

  • Tạo custom role dựa trên dataOwner/dataEditor nhưng loại bỏ bigquery.datasets.delete để giữ quyền query đầy đủ (read/write nếu cần) mà không xóa dataset.
  • Thêm users vào group, rồi bind group vào custom role: Tuân thủ best practice IAM – scalable, centralized management, dễ thêm/xóa users mà không edit IAM policy nhiều lần.
  • Không bind trực tiếp users (tránh hard-to-manage với hàng trăm users).
  • Hoàn hảo cho enterprise, theo nguyên tắc least privilege + groups (Google khuyến nghị hàng đầu).

❌ Phân tích tất cả các phương án

Dưới đây là phân tích chi tiết từng lựa chọn. Tôi giữ nguyên văn bản gốc tiếng Anh, đánh dấu ✅/❌, và giải thích hoàn toàn bằng tiếng Việt dựa trên IAM/BigQuery docs mới nhất.

  • [SAI] Add users to roles/bigquery user role only, instead of roles/bigquery dataOwner.
    ❌ Sai vì: Role bigquery.user chỉ cho phép chạy job truy vấn cơ bản (bigquery.jobs.create/get/update), không cấp quyền truy cập dataset/table (thiếu bigquery.datasets.get, bigquery.tables.getData/list). Người dùng không query được dataset cụ thể nếu dataset private. Đây chỉ là project-level, không thay thế dataOwner hiệu quả cho query datasets. Không phải best practice.

  • [SAI] Add users to roles/bigquery dataEditor role only, instead of roles/bigquery dataOwner.
    ❌ Sai vì: bigquery.dataEditor cho phép query datasets (có bigquery.tables.getData, datasets.get) và không có quyền xóa dataset (thiếu bigquery.datasets.delete). Tuy nhiên, nó vượt quá nhu cầu (cho phép xóa table/view/routine – có thể xóa nhầm data), và thêm trực tiếp users thay vì groups (vi phạm best practice scalability). Không phải giải pháp "Google-recommended" tối ưu.

  • [SAI] Create a custom role by removing delete permissions, and add users to that role only.
    ❌ Sai vì: Tạo custom role loại bỏ delete là đúng về perms (giữ query, loại bigquery.datasets.delete), nhưng bind trực tiếp vào users làm khó quản lý (không scale cho tổ chức lớn, phải edit policy mỗi khi add/remove user). Google không khuyến nghị – phải dùng groups để bind.

  • [ĐÚNG] Create a custom role by removing delete permissions. Add users to the group, and then add the group to the custom role.
    ✅ Đúng vì: Kết hợp custom role fine-grained (loại delete, giữ query) + groups binding – chính xác Google-recommended practices (least privilege, scalable access). Users query datasets an toàn, không xóa nhầm. Hoàn hảo cho production! 🚀