Ngân hàng đề — Google Cloud Professional Cloud Developer

Tìm thấy 358 câu.

Câu 51
Your application is running in multiple Google Kubernetes Engine clusters. It is managed by a Deployment in each cluster. The Deployment has created multiple replicas of your Pod in each cluster. You want to view the logs sent to stdout for all of the replicas in your Deployment in all clusters.
Which command should you use?
  1. A kubectl logs [PARAM]
  2. B gcloud logging read [PARAM]
  3. C kubectl exec ג€"it [PARAM] journalctl
  4. D gcloud compute ssh [PARAM] ג€"-command= ג€sudo journalctlג€
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 xem logs (nhật ký) được gửi đến stdout (standard output) của tất cả các replicas Pod thuộc một Deployment chạy trên nhiều Google Kubernetes Engine (GKE) clusters.

  • Bối cảnh chính:
    • Ứng dụng chạy trên nhiều GKE clusters (không chỉ một cluster).
    • Deployment quản lý và tạo nhiều replicas Pod trong từng cluster.
    • Logs cần xem là stdout từ các Pod (không phải logs từ node hoặc journal).
    • Yêu cầu: Một lệnh duy nhất để xem tất cả logs từ tất cả replicas ở tất cả clusters.

Mục tiêu là tìm lệnh phù hợp để truy vấn logs tập trung, tận dụng tính năng Cloud Logging (trước đây gọi là Stackdriver Logging) của Google Cloud, nơi GKE tự động chuyển tiếp logs stdout/stderr từ containers sang Cloud Logging cho việc quản lý tập trung.

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

✅ Đáp án đúng: gcloud logging read [PARAM]

Lý do lựa chọn:

  • Trong GKE, logs stdout từ Pods tự động được gửi đến Cloud Logging (qua Logging agent).
  • Lệnh gcloud logging read cho phép truy vấn logs từ nhiều clusters/projects bằng filter (ví dụ: [PARAM] có thể là "resource.type=gke_container jsonPayload.message:*" --freshness=1h).
  • Đây là cách tập trung và scalable nhất cho multi-cluster/multi-replica, không cần switch context kubectl hay SSH từng node.
  • ✅ Hoàn hảo vì hỗ trợ logs realtime/từ xa mà không giới hạn scope như kubectl.

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

  • ❌ [SAI] kubectl logs [PARAM]
    Lệnh kubectl logs chỉ xem logs của một Pod cụ thể (hoặc --all-containers cho Pod multi-container), ngay cả với --selector cho replicas.
    ❌ Không phù hợp vì:

    • Chỉ hoạt động trong một cluster (phải switch context bằng kubectl config use-context cho từng cluster).
    • Không scale cho multi-cluster; phải chạy lệnh lặp nhiều lần. Không phải cách official cho logs tập trung.
  • ✅ [ĐÚNG] gcloud logging read [PARAM]
    Như đã giải thích ở trên: Query Cloud Logging để lấy logs stdout từ tất cả Pods/replicas/multi-clusters qua filter mạnh mẽ (ví dụ: theo namespace, pod-name, cluster-name).
    ✅ Lý tưởng cho production multi-cluster, hỗ trợ export/aggregation.

  • ❌ [SAI] kubectl exec ג€"it [PARAM] journalctl
    (Ghi chú: "ג€"it" là lỗi ký tự, ý chỉ --it). Lệnh exec vào container rồi chạy journalctl (systemd journal trên Linux node).
    ❌ Sai hoàn toàn vì:

    • journalctl xem node-level logs (không phải stdout container).
    • Exec chỉ vào một Pod, không phải tất cả replicas/clusters. Không liên quan đến stdout app.
  • ❌ [SAI] gcloud compute ssh [PARAM] ג€"-command= ג€sudo journalctlג€
    (Ghi chú: "ג€" là lỗi, ý chỉ --command="sudo journalctl"). SSH vào Compute Engine VM và chạy journalctl.
    ❌ Không áp dụng vì:

    • GKE là managed clusters (nodes không trực tiếp SSH dễ dàng, cần node pools config).
    • journalctl lại là node system logs, không phải stdout Pods.
    • Không scale cho multi-nodes/multi-clusters; chỉ cho một instance.

Kết luận: Chỉ gcloud logging read đáp ứng yêu cầu multi-cluster/multi-replica stdout logs một cách hiệu quả! 🚀

Câu 52
You are using Cloud Build to create a new Docker image on each source code commit to a Cloud Source Repositories repository. Your application is built on every commit to the master branch. You want to release specific commits made to the master branch in an automated method.
What should you do?
  1. A Manually trigger the build for new releases.
  2. B Create a build trigger on a Git tag pattern. Use a Git tag convention for new releases.
  3. C Create a build trigger on a Git branch name pattern. Use a Git branch naming convention for new releases.
  4. D Commit your source code to a second Cloud Source Repositories repository with a second Cloud Build trigger. Use this repository for new releases only.
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 quy trình tự động hóa việc build và release Docker image sử dụng Google Cloud Build kết nối với Cloud Source Repositories (một dịch vụ Git repository của Google Cloud).

  • Bối cảnh: Mỗi khi có commit mới vào repository, Cloud Build sẽ tự động build Docker image. Quy trình build hiện tại chỉ kích hoạt trên master branch cho mọi commit.
  • Yêu cầu: Bạn muốn release chỉ những commit cụ thể trên master branch một cách tự động (automated), không phải build mọi commit mà chỉ release khi cần (ví dụ: version mới).
  • Mục tiêu: Tách biệt giữa build liên tục (CI) trên mọi commit master (để test/deploy dev) và release tự động cho các commit được đánh dấu đặc biệt, giúp kiểm soát quy trình CD (Continuous Delivery) một cách chính xác và an toàn.

Vấn đề cốt lõi là cần một trigger (kích hoạt build) linh hoạt hơn branch, vì master build mọi thứ, nhưng release chỉ cần cho "specific commits" → Giải pháp lý tưởng là sử dụng Git tags để đánh dấu release (ví dụ: tag "v1.0.0" cho commit cần release).

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

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

Đáp án đúng: Create a build trigger on a Git tag pattern. Use a Git tag convention for new releases.

Lý do 🛠️:

  • Cloud Build hỗ trợ build trigger dựa trên Git tag pattern (ví dụ: regex ^v[0-9]+\.[0-9]+\.[0-9]+$ cho tags như "v1.2.3"). Khi developer push tag lên master branch, trigger sẽ tự động kích hoạt build/release riêng biệt (có thể deploy lên production).
  • Điều này cho phép tách biệt CI (build mọi commit master) và CD (release chỉ tag cụ thể), hoàn toàn automated, không can thiệp thủ công.
  • Phù hợp best practice GitFlow/Semantic Versioning, đảm bảo release chỉ từ commit đã test ổn định trên master.
  • Cập nhật mới nhất (2026): Cloud Build hỗ trợ tag triggers với substitutions như $TAG_NAME để inject version vào Dockerfile hoặc deployment YAML.

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

  • [SAI] Manually trigger the build for new releases.
    ❌ Sai vì: Phương án này yêu cầu kích hoạt build thủ công (qua gcloud CLI hoặc Console), vi phạm yêu cầu "automated method". Không scalable cho production, dễ lỗi con người và không tích hợp CI/CD pipeline.

  • [ĐÚNG] Create a build trigger on a Git tag pattern. Use a Git tag convention for new releases.
    ✅ Đúng vì: Như giải thích trên, sử dụng tag pattern để trigger tự động chỉ cho commit được tag (ví dụ: git tag v1.0.0 && git push --tags). Build master vẫn chạy mọi commit (cho dev/test), tag build chỉ release. Linh hoạt, chuẩn AWS-like (tương tự CodeBuild với tags), nhưng tối ưu cho Google Cloud.

  • [SAI] Create a build trigger on a Git branch name pattern. Use a Git branch naming convention for new releases.
    ❌ Sai vì: Trigger trên branch name pattern (ví dụ: release-*) không phù hợp, vì yêu cầu release "specific commits made to the master branch". Phải tạo branch mới từ master → phức tạp, không automated thuần túy (cần merge/cherry-pick), và master vẫn build mọi commit gây nhầm lẫn.

  • [SAI] Commit your source code to a second Cloud Source Repositories repository with a second Cloud Build trigger. Use this repository for new releases only.
    ❌ Sai vì: Tạo repo thứ hai để commit lại code → duplicate effort, mất lịch sử Git, khó sync (phải manual copy commit), tăng chi phí lưu trữ. Không automated cho "specific commits on master", vi phạm nguyên tắc single source of truth trong GitOps.

Câu 53
You are designing a schema for a table that will be moved from MySQL to Cloud Bigtable. The MySQL table is as follows:
CREATE TABLE AccountActivity (
    Account_id int,
    Event_timestamp datetime,
    Transaction_type string,
    Amount numeric(18, 4),
    PRIMARY KEY (Account_id, Event_timestamp)
);

How should you design a row key for Cloud Bigtable for this table?
  1. A Set Account_id as a key.
  2. B Set Account_id_Event_timestamp as a key.
  3. C Set Event_timestamp_Account_id as a key.
  4. D Set Event_timestamp as a key.
Xem giải thích

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

Câu hỏi yêu cầu thiết kế row key phù hợp cho bảng Cloud Bigtable khi migrate từ bảng MySQL AccountActivity. Bảng gốc có cấu trúc:

CREATE TABLE AccountActivity (
    Account_id int,
    Event_timestamp datetime,
    Transaction_type string,
    Amount numeric(18, 4),
    PRIMARY KEY (Account_id, Event_timestamp)
);
  • Mục tiêu chính: Row key trong Bigtable phải unique cho mỗi hàng dữ liệu, đảm bảo phân tán đều (high cardinality đầu tiên để tránh hot spot), hỗ trợ truy vấn hiệu quả (theo thứ tự phổ biến: Account_id trước, sau đó Event_timestamp tăng dần), và tuân thủ nguyên tắc thiết kế schema Bigtable (dữ liệu theo hàng lớn, cột ít, row key composite nếu cần).
  • Bối cảnh: Bigtable là NoSQL wide-column store của Google Cloud, ưu tiên truy vấn nhanh theo row key. Từ PK composite của MySQL (Account_id, Event_timestamp), cần ghép thành row key dạng chuỗi (ví dụ: dùng delimiter như _ hoặc # để phân biệt).
  • Kiến thức cập nhật (2026): Theo tài liệu Bigtable mới nhất (v2+), row key nên bắt đầu bằng trường có cardinality cao (Account_id), theo sau là trường thời gian monotonic (Event_timestamp) để tránh range scan hot spot trên cùng node.

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

✅ Đáp án đúng và lý do

Đáp án đúng: Set Account_id_Event_timestamp as a key.
🛠️ Lý do chi tiết:

  • Ghép Account_id (cardinality cao, phân tán đều workload qua nhiều account) làm prefix, theo sau Event_timestamp (tăng dần theo thời gian) làm suffix → Tránh hot spot vì các event mới của cùng account phân tán đều, dễ range scan theo thời gian (ví dụ: Account123_2024-01-01 đến Account123_2024-01-02).
  • Phù hợp PK MySQL gốc, đảm bảo unique row key. Hỗ trợ truy vấn phổ biến: lấy tất cả activity của một account theo thứ tự thời gian.
  • Theo best practice Bigtable: Prefix hot (nhiều read/write), suffix cold (sequential).

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

  • ❌ Set Account_id as a key.
    Sai vì: Chỉ dùng Account_id làm row key sẽ không unique (nhiều event cùng account → overwrite dữ liệu). Bigtable yêu cầu row key duy nhất cho mỗi row; thiếu timestamp không phân biệt được các sự kiện khác nhau của cùng account. Dẫn đến mất dữ liệu và không hỗ trợ time-series query.

  • ✅ Set Account_id_Event_timestamp as a key.
    Đúng vì: Như giải thích trên, composite key lý tưởng với prefix phân tán cao (Account_id) + suffix thời gian (Event_timestamp). Đảm bảo unique, hiệu suất cao cho workload account-based time-series (ví dụ: banking activity). Tuân thủ Bigtable row key design: 16-64 bytes, monotonic suffix tránh hot spot.

  • ❌ Set Event_timestamp_Account_id as a key.
    Sai vì: Prefix Event_timestamp gây hot spot nghiêm trọng (tất cả event cùng thời điểm/gần đây tập trung một node, overload write/read). Cardinality thấp ở prefix (thời gian monotonic), khó range scan theo account. Không phù hợp truy vấn chính (per-account), vi phạm nguyên tắc "high-cardinality prefix first".

  • ❌ Set Event_timestamp as a key.
    Sai vì: Tương tự trên, không unique (nhiều event cùng timestamp → collision). Prefix thời gian gây hot spot cực lớn (toàn bộ hệ thống write mới vào vài row key gần nhất). Không hỗ trợ truy vấn theo account, chỉ phù hợp global time-series (không phải case này).

Câu 54
You want to view the memory usage of your application deployed on Compute Engine.
What should you do?
  1. A Install the Observability Client Library.
  2. B Install the Observability Monitoring Agent.
  3. C Use the Observability Metrics Explorer.
  4. D Use the Google Cloud Platform Console.
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 xem chỉ số sử dụng bộ nhớ (memory usage) của ứng dụng được triển khai trên Compute Engine (dịch vụ máy ảo của Google Cloud).
✅ Mục tiêu chính: Thu thập và theo dõi metrics bộ nhớ từ bên trong VM (guest OS metrics), không chỉ metrics mặc định từ hypervisor.
🛠️ Bối cảnh: Compute Engine cung cấp metrics cơ bản (như CPU từ host), nhưng để xem chi tiết memory usage (RAM, swap, v.v.) cần agent thu thập từ OS bên trong VM. Đây là phần của Cloud Monitoring trong Google Cloud Observability.

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

Đáp án đúng: Install the Observability Monitoring Agent.
🧩 Lý do:

  • Observability Monitoring Agent (hay còn gọi là Ops Agent hoặc Cloud Operations Agent) là agent chính thức của Google Cloud để thu thập metrics chi tiết từ guest OS trên Compute Engine, bao gồm memory usage (utilized memory, available memory, page faults, v.v.).
  • Sau khi install agent này trên VM, metrics sẽ tự động được gửi đến Cloud Monitoring, cho phép xem biểu đồ thời gian thực.
  • Đây là phương pháp chuẩn và được khuyến nghị theo tài liệu mới nhất (cập nhật 2024-2026), thay thế cho các agent cũ như Stackdriver Agent.
    📘 Nguồn tham khảo:
  • Google Cloud Ops Agent Documentation
  • Collect guest OS metrics

❌ 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, giữ nguyên văn bản gốc tiếng Anh:

  • [SAI] Install the Observability Client Library.
    ❌ Sai vì: Observability Client Library (như OpenTelemetry Client Library) dùng để instrument application-level metrics (từ code app), không thu thập guest OS metrics như memory usage của toàn VM. Nó phù hợp cho custom metrics từ app, không phải monitor hệ thống OS. Không giải quyết được yêu cầu xem memory của Compute Engine VM.

  • [ĐÚNG] Install the Observability Monitoring Agent.
    ✅ Đúng vì: Như đã giải thích ở trên, agent này chuyên thu thập system-level metrics (bao gồm memory usage từ /proc/meminfo trên Linux hoặc tương đương trên Windows), gửi trực tiếp đến Cloud Monitoring. Bước install đơn giản qua gcloud hoặc script, hỗ trợ auto-detection Compute Engine.

  • [SAI] Use the Observability Metrics Explorer.
    ❌ Sai vì: Observability Metrics Explorer (trong Cloud Monitoring console) chỉ dùng để xem và query metrics đã có sẵn, không thu thập metrics mới. Nếu chưa install agent, memory guest metrics sẽ không xuất hiện (chỉ có host metrics cơ bản như CPU). Đây là công cụ visualization, không phải giải pháp thu thập.

  • [SAI] Use the Google Cloud Platform Console.
    ❌ Sai vì: Google Cloud Console (nay là Google Cloud Console) cung cấp dashboard tổng quan (Metrics tab), nhưng không thu thập guest memory metrics nếu chưa có agent. Nó chỉ hiển thị metrics mặc định (host-level), thiếu chi tiết memory OS. Console là UI chung, không thay thế agent thu thập dữ liệu.

🛠️ Lời khuyên bổ sung: Sau khi install Ops Agent, truy cập Metrics Explorer trong Cloud Monitoring để query metric agent.googleapis.com/memory/utilization. Kiểm tra phiên bản agent mới nhất qua sudo apt update trên Debian/Ubuntu hoặc tương đương!
📘 Tài liệu bổ sung: Google Cloud Monitoring Metrics List (cập nhật 2026).

Câu 55
You have an analytics application that runs hundreds of queries on BigQuery every few minutes using BigQuery API. You want to find out how much time these queries take to execute.
What should you do?
  1. A Use Observability Monitoring to plot slot usage.
  2. B Use Observability Trace to plot API execution time.
  3. C Use Observability Trace to plot query execution time.
  4. D Use Observability Monitoring to plot query execution times.
Xem giải thích

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

Câu hỏi mô tả một ứng dụng phân tích dữ liệu chạy hàng trăm truy vấn (queries) trên BigQuery mỗi vài phút thông qua BigQuery API. Mục tiêu là đo lường thời gian thực thi của các truy vấn này (query execution time).
📌 Vấn đề chính: Cần công cụ phù hợp trong Google Cloud Observability (bao gồm Monitoring và Trace) để theo dõi và vẽ biểu đồ (plot) thời gian thực thi truy vấn một cách chính xác, hiệu quả. BigQuery cung cấp các metrics chi tiết qua Cloud Monitoring để giám sát hiệu suất truy vấn, giúp phát hiện bottleneck trong môi trường sản xuất với tần suất cao.

✅ Đáp án đúng

Use Observability Monitoring to plot query execution times.

Lý do lựa chọn:
🛠️ Cloud Monitoring (trong Google Cloud Observability) hỗ trợ metric bigquery.googleapis.com/query/execution_time (đơn vị milliseconds), cho phép vẽ biểu đồ thời gian thực thi truy vấn một cách trực tiếp và chính xác. Điều này lý tưởng cho hàng trăm truy vấn chạy thường xuyên, giúp theo dõi xu hướng, đặt alert và tối ưu hóa. Theo tài liệu mới nhất (cập nhật 2024-2026), metric này được khuyến nghị chính thức cho việc giám sát hiệu suất BigQuery queries.
📘 Nguồn tham khảo:

📋 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, giữ nguyên văn bản gốc tiếng Anh. Tôi sử dụng ✅ cho đúng và ❌ cho sai, kèm giải thích rõ ràng:

  • Use Observability Monitoring to plot slot usage.
    ❌ Sai: Metric "slot usage" (bigquery.googleapis.com/slot_ms hoặc slot usage) đo lường lượng slot compute được sử dụng (tài nguyên tính phí), không phải thời gian thực thi truy vấn. Nó hữu ích cho chi phí và quota, nhưng không trả lời trực tiếp câu hỏi về execution time. Sử dụng sai sẽ không plot được thời gian mong muốn.

  • Use Observability Trace to plot API execution time.
    ❌ Sai: Cloud Trace chuyên theo dõi thời gian thực thi API calls (như latency của BigQuery API requests từ ứng dụng), bao gồm network và client-side delays. Nó không đo query execution time bên trong BigQuery (thời gian engine BigQuery xử lý dữ liệu). Phù hợp cho end-to-end tracing, nhưng không chính xác cho metrics query-specific.

  • Use Observability Trace to plot query execution time.
    ❌ Sai: Cloud Trace không có metric trực tiếp để plot query execution time. Trace tập trung vào distributed tracing (spans cho API flows), không phải metrics aggregate của BigQuery engine. Dù có thể trace một phần query qua API, nó không hiệu quả cho hàng trăm queries và không plot execution time chuẩn như Monitoring.

  • Use Observability Monitoring to plot query execution times.
    ✅ Đúng: Như đã giải thích ở trên, Cloud Monitoring cung cấp metric query/execution_time chính xác để plot biểu đồ thời gian thực thi. Đây là cách chuẩn, scalable cho workload cao, hỗ trợ dashboard tùy chỉnh và alerting tự động theo best practices GCP mới nhất.

Câu 56
You are designing a schema for a Cloud Spanner customer database. You want to store a phone number array field in a customer table. You also want to allow users to search customers by phone number.
How should you design this schema?
  1. A Create a table named Customers. Add an Array field in a table that will hold phone numbers for the customer.
  2. B Create a table named Customers. Create a table named Phones. Add a CustomerId field in the Phones table to find the CustomerId from a phone number.
  3. C Create a table named Customers. Add an Array field in a table that will hold phone numbers for the customer. Create a secondary index on the Array field.
  4. D Create a table named Customers as a parent table. Create a table named Phones, and interleave this table into the Customer table. Create an index on the phone number field in the Phones table.
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 thiết kế schema (cấu trúc dữ liệu) cho cơ sở dữ liệu khách hàng trong Google Cloud Spanner. Yêu cầu cụ thể là:

  • Lưu trữ một mảng (array) số điện thoại trong bảng khách hàng (customer table).
  • Đồng thời cho phép người dùng tìm kiếm khách hàng theo số điện thoại một cách hiệu quả.

Cloud Spanner là dịch vụ cơ sở dữ liệu phân tán, hỗ trợ SQL chuẩn với các tính năng đặc biệt như interleaving tables (liên kết bảng con vào bảng cha để tối ưu truy vấn hierarchical data) và secondary indexes (chỉ mục phụ). Vấn đề chính ở đây là array fields không hỗ trợ indexing trực tiếp để tìm kiếm, dẫn đến query chậm nếu dữ liệu lớn. Giải pháp cần tận dụng interleaved tables và index để đạt hiệu suất cao, đặc biệt với dữ liệu 1:N (một khách hàng có nhiều số điện thoại).

Kiến thức cập nhật đến 2026: Theo tài liệu Cloud Spanner mới nhất (phiên bản Spanner SQL 2.1+), interleaving giúp giảm latency cho JOIN và lookup, index trên child table hỗ trợ search nhanh chóng.
📘 Tài liệu tham khảo:

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

Đáp án đúng:
Create a table named Customers as a parent table. Create a table named Phones, and interleave this table into the Customer table. Create an index on the phone number field in the Phones table.

Lý do chọn đáp án này 🛠️:

  • Interleaving Phones vào Customers: Tạo mối quan hệ hierarchical (cha-con), giúp query JOIN tự động nhanh chóng (không cần full scan), giảm I/O và latency.
  • Index trên phone number: Cho phép tìm kiếm nhanh theo số điện thoại (O(log N) thay vì O(N)), sau đó lookup parent CustomerID.
  • Phù hợp với dữ liệu 1:N (một customer nhiều phones), tối ưu cho search và scalability của Spanner. Không dùng array vì array không index được hiệu quả.

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

  • ❌ Phương án SAI:
    Create a table named Customers. Add an Array field in a table that will hold phone numbers for the customer.
    Giải thích: Array field lưu nhiều số điện thoại gọn gàng, nhưng Cloud Spanner không hỗ trợ secondary index trên array elements. Tìm kiếm phải dùng UNNEST hoặc ARRAY_CONTAINS, dẫn đến full table scan chậm (không scale với dữ liệu lớn). Không đáp ứng yêu cầu search hiệu quả.

  • ❌ Phương án SAI:
    Create a table named Customers. Create a table named Phones. Add a CustomerId field in the Phones table to find the CustomerId from a phone number.
    Giải thích: Tách bảng riêng là ý hay cho 1:N, nhưng không có index trên phone number nên search phải scan toàn bộ Phones table (chậm). Ngoài ra, không dùng interleaving nên JOIN Customers-Phones tốn kém hơn (cần explicit JOIN với full scan potential).

  • ❌ Phương án SAI:
    Create a table named Customers. Add an Array field in a table that will hold phone numbers for the customer. Create a secondary index on the Array field.
    Giải thích: Spanner không cho phép secondary index trực tiếp trên array field (lỗi syntax). Index chỉ áp dụng cho scalar columns, không phải array elements. Dẫn đến không thể search hiệu quả, vi phạm nguyên tắc thiết kế schema.

  • ✅ Phương án ĐÚNG (như đã giải thích ở trên):
    Create a table named Customers as a parent table. Create a table named Phones, and interleave this table into the Customer table. Create an index on the phone number field in the Phones table.
    Giải thích: Kết hợp interleaving (tối ưu hierarchical lookup) + index trên phone (search nhanh). Query ví dụ: SELECT * FROM Customers c JOIN Phones p ON p.CustomerId = c.CustomerId WHERE p.Phone = '123456' sẽ siêu nhanh!

Kết luận 🎯: Thiết kế này tuân thủ best practices của Cloud Spanner cho dữ liệu lặp lại, đảm bảo strong consistency, high availability và low latency ngay cả với petabyte-scale data.

Câu 57
You are deploying a single website on App Engine that needs to be accessible via the URL http://www.altostrat.com/.
What should you do?
  1. A Verify domain ownership with Webmaster Central. Create a DNS CNAME record to point to the App Engine canonical name ghs.googlehosted.com.
  2. B Verify domain ownership with Webmaster Central. Define an A record pointing to the single global App Engine IP address.
  3. C Define a mapping in dispatch.yaml to point the domain www.altostrat.com to your App Engine service. Create a DNS CNAME record to point to the App Engine canonical name ghs.googlehosted.com.
  4. D Define a mapping in dispatch.yaml to point the domain www.altostrat.com to your App Engine service. Define an A record pointing to the single global App Engine IP address.
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 triển khai một website đơn lẻ trên Google App Engine (một dịch vụ PaaS của Google Cloud Platform - GCP) và làm cho nó có thể truy cập qua URL tùy chỉnh http://www.altostrat.com/.

  • Bối cảnh chính: App Engine tự động cung cấp một subdomain mặc định (như your-project.appspot.com), nhưng để sử dụng domain tùy chỉnh (custom domain) như www.altostrat.com, bạn cần cấu hình DNS và xác minh quyền sở hữu domain với Google.
  • Yêu cầu cốt lõi: Quy trình phải đảm bảo traffic từ domain tùy chỉnh được route đúng đến App Engine mà không cần IP tĩnh (vì App Engine sử dụng load balancer động, không có IP cố định toàn cầu).
  • Kiến thức cập nhật (tính đến 2026): Theo tài liệu GCP mới nhất, quy trình mapping custom domain cho App Engine standard environment vẫn yêu cầu xác minh qua Google Search Console (trước đây gọi là Webmaster Tools/Central), và sử dụng CNAME record trỏ đến ghs.googlehosted.com. Không hỗ trợ A record do IP thay đổi. Dispatch.yaml chỉ dùng cho module routing nội bộ, không phải custom domain. (📘 Nguồn tham khảo: Google Cloud App Engine Documentation - Mapping Custom Domains và Google Search Console Help).

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

Đáp án đúng: Verify domain ownership with Webmaster Central. Create a DNS CNAME record to point to the App Engine canonical name ghs.googlehosted.com.

Lý do 🛠️:

  • Đây là quy trình chuẩn chính thức của Google App Engine cho custom domain đơn lẻ.
  • Xác minh domain (verify ownership) qua Webmaster Central (nay là Google Search Console) là bước bắt buộc để Google biết bạn sở hữu domain và kích hoạt mapping.
  • CNAME record trỏ đến ghs.googlehosted.com (canonical name của App Engine) đảm bảo DNS resolve đúng đến load balancer động của Google, tránh vấn đề IP thay đổi.
  • Không cần dispatch.yaml vì đây là website đơn lẻ (single service), không có multi-path routing phức tạp.

📋 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 một cách chi tiết, giữ nguyên văn bản gốc bằng tiếng Anh:

  • Verify domain ownership with Webmaster Central. Create a DNS CNAME record to point to the App Engine canonical name ghs.googlehosted.com.
    ✅ Đúng 🏆: Như đã giải thích ở trên, đây là bước chính xác 100% theo docs GCP. Xác minh + CNAME là combo hoàn hảo cho App Engine standard/flex environment.

  • Verify domain ownership with Webmaster Central. Define an A record pointing to the single global App Engine IP address.
    ❌ Sai 🚫: Mặc dù xác minh đúng, nhưng App Engine không có IP tĩnh toàn cầu cố định (IP thay đổi theo load balancer). Sử dụng A record sẽ gây downtime khi IP rotate. GCP khuyến cáo tuyệt đối dùng CNAME thay thế.

  • Define a mapping in dispatch.yaml to point the domain www.altostrat.com to your App Engine service. Create a DNS CNAME record to point to the App Engine canonical name ghs.googlehosted.com.
    ❌ Sai 🔧: CNAME đúng, nhưng dispatch.yaml chỉ dùng để route path/host nội bộ giữa các version/module trong cùng project (ví dụ: api altostrat.com vs www). Không dùng cho custom domain mapping chính thức – sẽ không hoạt động mà không có xác minh Google.

  • Define a mapping in dispatch.yaml to point the domain www.altostrat.com to your App Engine service. Define an A record pointing to the single global App Engine IP address.
    ❌ Sai kép 💥: Vừa sai dispatch.yaml (như trên), vừa sai A record (IP không tĩnh). Kết hợp này hoàn toàn thất bại, dẫn đến không route được traffic.

Tóm tắt nhanh 📈: Chỉ phương án đầu tiên tuân thủ quy trình GCP chuẩn. Các sai lầm phổ biến là nhầm IP tĩnh hoặc lạm dụng dispatch.yaml! Nếu triển khai thực tế, kiểm tra console GCP sau 24-48h để propagate DNS. 🚀

Câu 58
You are running an application on App Engine that you inherited. You want to find out whether the application is using insecure binaries or is vulnerable to XSS attacks.
Which service should you use?
  1. A Cloud Amor
  2. B Observability Debugger
  3. C Cloud Security Scanner
  4. D Observability Error Reporting
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 ứng dụng đang chạy trên Google App Engine (một dịch vụ PaaS của Google Cloud để triển khai ứng dụng web mà không cần quản lý server). Bạn kế thừa ứng dụng này và muốn kiểm tra xem ứng dụng có sử dụng các binary không an toàn (insecure binaries) hoặc dễ bị tấn công XSS (Cross-Site Scripting - một lỗ hổng phổ biến cho phép inject mã độc vào trang web).
📌 Mục tiêu chính: Tìm dịch vụ phù hợp để quét (scan) bảo mật tự động, phát hiện lỗ hổng trên App Engine mà không cần can thiệp thủ công. Đây là tình huống thực tế trong phát triển cloud, nơi cần công cụ tích hợp sẵn để audit security.

✅ Đáp án đúng: Cloud Security Scanner

Lý do lựa chọn:
Cloud Security Scanner là dịch vụ chuyên dụng của Google Cloud để quét tự động các ứng dụng trên App Engine, Compute Engine và GKE, phát hiện chính xác các lỗ hổng như XSS, injection attacks, insecure binaries, và các vấn đề OWASP Top 10. Nó mô phỏng các cuộc tấn công thực tế (fuzzing) mà không ảnh hưởng đến production. Với phiên bản cập nhật đến 2026, nó hỗ trợ scan không gián đoạn, tích hợp IAM, và báo cáo chi tiết qua Security Command Center. Đây là lựa chọn tối ưu cho App Engine!
🛡️ Nguồn tham khảo: Google Cloud Documentation - Cloud Security Scanner (cập nhật 2024-2026).

📋 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 một cách chi tiết:

  • Cloud Amor ❌
    Sai vì: Đây có lẽ là lỗi chính tả của Cloud Armor (Web Application Firewall - WAF). Cloud Armor bảo vệ ứng dụng bằng cách chặn traffic độc hại tại HTTP(S) Load Balancer hoặc Cloud CDN, nhưng không quét nội dung ứng dụng để tìm insecure binaries hay XSS. Nó chỉ phòng thủ thụ động, không phải công cụ audit lỗ hổng trên App Engine. 🛑 Không phù hợp!

  • Observability Debugger ❌
    Sai vì: Đây là Cloud Debugger (trong bộ Google Cloud Observability), dùng để debug code thời gian thực bằng cách đặt breakpoint mà không cần redeploy. Nó giúp sửa lỗi logic, nhưng không scan bảo mật, không phát hiện XSS hay insecure binaries. Chỉ dành cho developer debug, không phải security scanning! 🔍 Không liên quan.

  • Cloud Security Scanner ✅
    Đúng vì: Như đã giải thích ở trên, đây là công cụ chính xác nhất để quét App Engine, xác định XSS và insecure binaries. Tích hợp dễ dàng qua gcloud CLI hoặc Console, hỗ trợ scan scheduled. Hoàn hảo cho kịch bản này! 🎯 Lý tưởng 100%.

  • Observability Error Reporting ❌
    Sai vì: Error Reporting (trong Observability) chỉ thu thập và báo cáo lỗi runtime (như exception, crash) từ ứng dụng. Nó không quét bảo mật, không phát hiện lỗ hổng tiềm ẩn như XSS hay binaries không an toàn trước khi xảy ra lỗi. Chỉ theo dõi sau sự cố, không phải proactive scanning! 📉 Không đáp ứng yêu cầu.

🏆 Kết luận & Lời khuyên

✅ Cloud Security Scanner là lựa chọn duy nhất phù hợp, giúp bạn nhanh chóng audit ứng dụng kế thừa trên App Engine. Để triển khai: Sử dụng lệnh gcloud app services scan SERVICE --project=PROJECT_ID.
📘 Tài liệu bổ sung:

Câu 59
You are working on a social media application. You plan to add a feature that allows users to upload images. These images will be 2 MB `" 1 GB in size. You want to minimize their infrastructure operations overhead for this feature.
What should you do?
  1. A Change the application to accept images directly and store them in the database that stores other user information.
  2. B Change the application to create signed URLs for Cloud Storage. Transfer these signed URLs to the client application to upload images to Cloud Storage.
  3. C Set up a web server on GCP to accept user images and create a file store to keep uploaded files. Change the application to retrieve images from the file store.
  4. D Create a separate bucket for each user in Cloud Storage. Assign a separate service account to allow write access on each bucket. Transfer service account credentials to the client application based on user information. The application uses this service account to upload images to Cloud Storage.
Xem giải thích

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

Câu hỏi mô tả một ứng dụng mạng xã hội cần thêm tính năng cho phép người dùng upload hình ảnh với kích thước từ 2 MB đến 1 GB. Mục tiêu chính là giảm thiểu chi phí vận hành hạ tầng (infrastructure operations overhead) cho tính năng này.
📌 Yêu cầu cốt lõi: Tìm giải pháp upload file lớn một cách hiệu quả, an toàn, scalable, tránh phải quản lý server trung gian hoặc lưu trữ không phù hợp, tận dụng dịch vụ managed của Google Cloud Platform (GCP) như Cloud Storage.
🛠️ Bối cảnh: Upload trực tiếp qua app server sẽ gây tải cao (bandwidth, CPU), không scale tốt với file lớn. Giải pháp lý tưởng phải cho phép client upload trực tiếp vào storage mà không qua backend, giảm ops overhead.

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

Đáp án đúng: Change the application to create signed URLs for Cloud Storage. Transfer these signed URLs to the client application to upload images to Cloud Storage.

Lý do:

  • ✅ Signed URLs (hay còn gọi là Signed Upload URLs) cho phép backend tạo URL tạm thời, có thời hạn và quyền ghi hạn chế, gửi cho client để upload trực tiếp vào Cloud Storage mà không cần qua app server.
  • 🛡️ An toàn: URL chỉ dùng một lần hoặc thời hạn ngắn, tránh lộ key.
  • ⚡ Hiệu quả: Giảm tải server (không proxy data), scale tự động với Cloud Storage (hỗ trợ file lên đến 5TB/object, cập nhật 2024-2026).
  • 💰 Minimize ops: Không cần quản lý server upload, chỉ config IAM và bucket policy. Phù hợp best practice GCP cho user-generated content.
    📘 Tài liệu tham khảo: Google Cloud Storage Signed URLs (cập nhật mới nhất 2026: hỗ trợ V4 signing với thêm bảo mật HMAC).

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

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 tiếng Anh. Mỗi phương án được đánh giá dựa trên tiêu chí minimize ops overhead, scalability cho file lớn (2MB-1GB), và best practice GCP (phiên bản mới nhất 2026).

  • ❌ SAI: Change the application to accept images directly and store them in the database that stores other user information.
    Giải thích: Lưu blob lớn (1GB) vào database (như Cloud SQL/Firestore) gây vấn đề hiệu suất nghiêm trọng: tăng latency, chi phí lưu trữ cao (DB không tối ưu cho binary data), và giới hạn kích thước (ví dụ Firestore doc max 1MB). Không scale, tăng ops overhead (quản lý DB size, backup). Không phải best practice – GCP khuyến nghị dùng Object Storage cho file.

  • ✅ ĐÚNG: Change the application to create signed URLs for Cloud Storage. Transfer these signed URLs to the client application to upload images to Cloud Storage.
    Giải thích: Như đã nêu ở phần đáp án đúng. Đây là giải pháp tối ưu, tận dụng Cloud Storage (99.999999999% durability, auto-scale), signed URLs V4 (cập nhật 2024) hỗ trợ resumable upload cho file lớn, giảm hoàn toàn ops cho server-side handling.

  • ❌ SAI: Set up a web server on GCP to accept user images and create a file store to keep uploaded files. Change the application to retrieve images from the file store.
    Giải thích: Yêu cầu setup web server (như Compute Engine/App Engine) và file store (như Filestore/NFS) → tăng ops overhead lớn (provision VM, scaling autoscaler, monitoring, security patching). Proxy upload qua server gây bottleneck bandwidth với file 1GB, không scalable. GCP khuyên tránh self-managed storage.

  • ❌ SAI: Create a separate bucket for each user in Cloud Storage. Assign a separate service account to allow write access on each bucket. Transfer service account credentials to the client application based on user information. The application uses this service account to upload images to Cloud Storage.
    Giải thích: Tạo bucket riêng/user (hàng triệu bucket nếu app lớn) gây ops nightmare: quản lý quota (GCP limit 100 buckets/project mặc định), chi phí billing cao, và chuyển service account credentials cho client → rủi ro bảo mật cực lớn (client-side key exposure, dễ bị hack). Không tuân thủ least privilege; dùng signed URLs hoặc public bucket với ACL tốt hơn.

🧩 Kết luận: Giải pháp signed URLs là best practice cho social media apps như Instagram/TikTok trên GCP, giúp dev focus vào business logic thay vì infra. Nếu triển khai, kết hợp với Cloud Armor cho DDoS protection và Lifecycle policies để quản lý storage cost!

Câu 60
Your application is built as a custom machine image. You have multiple unique deployments of the machine image. Each deployment is a separate managed instance group with its own template. Each deployment requires a unique set of configuration values. You want to provide these unique values to each deployment but use the same custom machine image in all deployments. You want to use out-of-the-box features of Compute Engine.
What should you do?
  1. A Place the unique configuration values in the persistent disk.
  2. B Place the unique configuration values in a Cloud Bigtable table.
  3. C Place the unique configuration values in the instance template startup script.
  4. D Place the unique configuration values in the instance template instance metadata.
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ủ đề Google Cloud Compute Engine, tập trung vào việc quản lý các deployment sử dụng custom machine image (hình ảnh máy ảo tùy chỉnh). Ứng dụng được xây dựng dưới dạng image này, và có nhiều deployment độc lập, mỗi cái là một managed instance group (MIG) riêng biệt với instance template riêng. Mỗi deployment cần tập hợp giá trị cấu hình (configuration values) độc đáo, nhưng sử dụng chung một custom machine image. Yêu cầu sử dụng các tính năng out-of-the-box (sẵn có) của Compute Engine để cung cấp config unique mà không thay đổi image.

📌 Vấn đề cốt lõi: Làm thế nào để inject (chèn) config unique vào từng MIG mà không chỉnh sửa image gốc, đảm bảo tính linh hoạt, dễ quản lý và tự động hóa. Giải pháp phải tận dụng instance template vì mỗi MIG có template riêng.

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

Đáp án đúng: Place the unique configuration values in the instance template instance metadata.

🛠️ Lý do chi tiết:

  • Instance metadata trong instance template là tính năng out-of-the-box của Compute Engine, cho phép lưu trữ key-value pairs unique cho từng template (và do đó cho từng MIG).
  • Khi instance khởi động, startup script hoặc ứng dụng có thể truy cập metadata qua Metadata Server (http://metadata.google.internal) mà không cần thay đổi image.
  • Điều này lý tưởng vì: Giữ image chung, config unique per deployment, dễ cập nhật template mà không rebuild image. Hỗ trợ automation qua gcloud/CLI hoặc Terraform.
  • Cập nhật mới nhất (2026): Tính năng này vẫn là best practice trong Compute Engine v1 API và Instance Metadata v2 (custom metadata keys lên đến 32KB per key).

📘 Tài liệu 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á dựa trên tính phù hợp với yêu cầu (unique config per deployment, dùng chung image, out-of-the-box Compute Engine).

  • ❌ [SAI] Place the unique configuration values in the persistent disk.
    Phương án này không phù hợp vì persistent disk (đĩa bền vững) gắn vào instance sẽ không unique tự động cho từng MIG – nếu dùng chung image, disk sẽ giống nhau hoặc cần mount riêng (phức tạp, không out-of-the-box). Dẫn đến data chia sẻ không mong muốn giữa deployments, vi phạm tính độc lập. Không scalable cho MIG autoscaling.

  • ❌ [SAI] Place the unique configuration values in a Cloud Bigtable table.
    Không đúng vì Bigtable là dịch vụ NoSQL ngoài Compute Engine (không out-of-the-box thuần túy), yêu cầu code ứng dụng query table (thêm dependency phức tạp). Không tận dụng template/MIG native, overkill cho config đơn giản, tăng chi phí và latency khởi động.

  • ❌ [SAI] Place the unique configuration values in the instance template startup script.
    Sai lầm phổ biến vì startup script trong template là chuỗi văn bản tĩnh, khó quản lý config unique phức tạp (như JSON/YAML lớn). Script chỉ chạy một lần lúc boot, không linh hoạt như metadata (có thể đọc động). Nếu hardcode config vào script, phải chỉnh sửa template mỗi lần thay đổi – vi phạm "dùng chung image" gián tiếp.

  • ✅ [ĐÚNG] Place the unique configuration values in the instance template instance metadata.
    Như đã giải thích ở trên: Hoàn hảo vì metadata là native, dynamic, per-template, dễ truy cập từ bất kỳ script nào trong image mà không thay đổi image. Hỗ trợ MIG rolling updates seamless. Best practice cho configuration management trong Compute Engine!

🧠 Lời khuyên thực tế: Kết hợp metadata với startup script để parse config (ví dụ: curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/my-config" -H "Metadata-Flavor: Google"). Điều này đảm bảo zero-downtime deployments!