Ngân hàng đề — Microsoft Azure Developer

Tìm thấy 409 câu.

Câu 311
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
You develop a software as a service (SaaS) offering to manage photographs. Users upload photos to a web service which then stores the photos in Azure
Storage Blob storage. The storage account type is General-purpose V2.
When photos are uploaded, they must be processed to produce and save a mobile-friendly version of the image. The process to produce a mobile-friendly version of the image must start in less than one minute.
You need to design the process that starts the photo processing.
Solution: Use the Azure Blob Storage change feed to trigger photo processing.
Does the solution meet the goal?
  1. A Yes
  2. B No
Xem giải thích

🧩 Phân tích chi tiết câu hỏi trắc nghiệm

📘 Nội dung câu hỏi:
Câu hỏi thuộc dạng series (một tình huống chung, mỗi câu có giải pháp riêng). Bạn đang phát triển ứng dụng SaaS quản lý ảnh: Người dùng upload ảnh qua web service, lưu vào Azure Storage Blob (loại tài khoản General-purpose V2 - GPv2).
Yêu cầu chính: Khi ảnh được upload, phải xử lý ngay để tạo phiên bản mobile-friendly và lưu lại. Quy trình xử lý PHẢI BẮT ĐẦU TRONG VÒNG DƯỚI 1 PHÚT (less than one minute).
Giải pháp đề xuất: Sử dụng Azure Blob Storage change feed để kích hoạt (trigger) quá trình xử lý ảnh.
Câu hỏi: Giải pháp này có đáp ứng mục tiêu không? (Does the solution meet the goal?)
(Lưu ý: Đây là câu hỏi kiểu "Yes/No" trong kỳ thi chứng chỉ Azure, kiểm tra kiến thức thiết kế serverless/event-driven architecture. Kiến thức cập nhật đến 2026: Azure Blob change feed hỗ trợ GPv2 từ 2020, nhưng vẫn giữ nguyên hạn chế về real-time triggering theo docs mới nhất 2025.)

✅ Đáp án đúng: No
Lý do chọn đáp án đúng (bằng tiếng Việt):
Giải pháp KHÔNG đáp ứng mục tiêu vì Azure Blob Storage change feed chỉ cung cấp log thay đổi (change log) theo thứ tự giao dịch (transactionally consistent), KHÔNG phải cơ chế trigger thời gian thực. Bạn phải tự xây dựng change feed processor (pull-based) để đọc feed từ storage account, dẫn đến độ trễ (latency) có thể vượt quá 1 phút do phụ thuộc vào tần suất polling và khối lượng dữ liệu. Để đạt <1 phút, cần dùng Azure Event Grid hoặc Blob trigger trong Azure Functions (push-based, latency thường <10 giây). Change feed phù hợp cho auditing/replication dài hạn, không phải xử lý ngay lập tức.
(Cập nhật 2025: Docs xác nhận change feed latency "typically low" nhưng không SLA <1 phút cho trigger.)

🛠️ Giải thích tất cả các phương án (giữ nguyên text gốc)

  • Yes ❌ (SAI)
    Phương án này sai vì Azure Blob Storage change feed không được thiết kế để trigger xử lý tức thì. Nó là feed dạng append-only log (ghi thay đổi create/update/delete blobs), yêu cầu ứng dụng tự scan/pull feed (ví dụ dùng Change Feed Processor Library). Độ trễ có thể >1 phút nếu polling interval lớn hoặc account bận (high throughput). Không đảm bảo "start in less than one minute". Thay vào đó, dùng Event Grid subscription trên blob events cho real-time.

  • No ✅ (ĐÚNG)
    Phương án này đúng vì giải pháp không meet goal như đã giải thích. Change feed lý tưởng cho batch processing hoặc analytics (ví dụ sync data to Cosmos DB), nhưng không phù hợp cho yêu cầu low-latency trigger (<1 phút). Giải pháp đúng nên là: Azure Event Grid (event routing từ blob created event) → Azure Functions xử lý ảnh (resize bằng ImageSharp hoặc Azure AI Vision). Hoặc Event-Driven Architecture với Service Bus.

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

💡 Lời khuyên từ Azure Developer: Trong thiết kế SaaS thực tế, ưu tiên Event Grid + Functions cho scalability và cost-effective. Test với high-load để verify latency! 🚀

Câu 312
You develop Azure solutions.

You must connect to a No-SQL globally-distributed database by using the .NET API.

You need to create an object to configure and execute requests in the database.

Which code segment should you use?
  1. A database_name = 'MyDatabase'
    database = client.create_database_if_not_exists(id=database_name)
  2. B client = CosmosClient(endpoint, key)
  3. C container_name = 'MyContainer'
    container = database.create_container_if_not_exists(
    id=container_name, partition_key=PartitionKey(path="/lastName"), offer_throughput=400 )
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 phát triển giải pháp trên Azure, cụ thể là kết nối đến một cơ sở dữ liệu NoSQL phân tán toàn cầu (globally-distributed NoSQL database) bằng .NET API. Đây chính là Azure Cosmos DB – dịch vụ NoSQL đa mô hình của Microsoft Azure, hỗ trợ phân tán toàn cầu với độ trễ thấp và khả năng mở rộng cao.

Chi tiết yêu cầu trong câu hỏi:

  • Bạn đang phát triển giải pháp Azure.
  • Cần kết nối đến Cosmos DB qua .NET SDK.
  • Tạo một object để cấu hình (configure) và thực thi (execute) các yêu cầu (requests) trong database.

Mục tiêu chính là xác định code segment đúng để khởi tạo object kết nối ban đầu, dựa trên Azure Cosmos DB .NET SDK phiên bản 3.x (cập nhật mới nhất đến năm 2026, hỗ trợ Cosmos DB NoSQL API). Object này phải là điểm khởi đầu để thực hiện mọi thao tác CRUD, query, v.v. trên database.

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

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

Đáp án đúng: client = CosmosClient(endpoint, key)

Lý do 🛠️:

  • CosmosClient là class chính trong Azure Cosmos DB .NET SDK để kết nối, cấu hình và thực thi tất cả các requests đến database.
  • Nó nhận endpoint (URI của tài khoản Cosmos DB) và key (primary/secondary key để xác thực).
  • Đây là bước đầu tiên và bắt buộc để tạo các object con như Database, Container. Không có CosmosClient, bạn không thể thực hiện bất kỳ thao tác nào.
  • Phù hợp với best practice mới nhất: Sử dụng CosmosClient với connection string hoặc credential mới (như DefaultAzureCredential cho managed identity).

❌ 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 phương án. Tôi giữ nguyên nội dung code gốc bằng tiếng Anh, chỉ phân tích bằng tiếng Việt. Mỗi phương án được đánh giá dựa trên SDK mới nhất.

  • Phương án 1 (Sai):
    database_name = 'MyDatabase'<br>database = client.create_database_if_not_exists(id=database_name)
    ❌ Sai vì: Code này tạo Database object (nếu chưa tồn tại), KHÔNG phải object để kết nối hoặc thực thi requests ban đầu. Nó phụ thuộc vào client đã tồn tại trước (CosmosClient). Nếu chưa có client, code sẽ lỗi. Câu hỏi yêu cầu object configure và execute requests → chỉ CosmosClient mới làm được điều này toàn diện.

  • Phương án 2 (Đúng):
    client = CosmosClient(endpoint, key)
    ✅ Đúng vì: Đây chính là object cốt lõi để kết nối Cosmos DB, cấu hình (như consistency level, connection mode) và thực thi mọi requests (ReadItemAsync, CreateItemAsync, QueryAsync, v.v.). Theo docs SDK v3.x, đây là cách khởi tạo single client instance cho ứng dụng, hỗ trợ connection pooling và retry logic tự động.

  • Phương án 3 (Sai):
    container_name = 'MyContainer'<br>container = database.create_container_if_not_exists(<br>id=container_name, partition_key=PartitionKey(path="/lastName"), offer_throughput=400 )
    ❌ Sai vì: Code này tạo Container object (tương đương collection/table), KHÔNG phải object kết nối chính. Nó phụ thuộc vào database (và gián tiếp client) đã tồn tại. Partition key và throughput chỉ dùng khi provision container, không dùng để execute requests tổng quát. Câu hỏi nhấn mạnh "in the database" → Container quá cụ thể, không phải object đầu tiên.

🛠️ Lời khuyên thực hành

  • Best practice 2026: Sử dụng CosmosClient với TokenCredential cho AAD auth thay vì key trực tiếp để bảo mật cao hơn. Dispose client đúng cách bằng using hoặc singleton pattern.
  • Ví dụ code đầy đủ:
    using Microsoft.Azure.Cosmos;
    var client = new CosmosClient(endpoint, key);
    var database = await client.CreateDatabaseIfNotExistsAsync("MyDatabase");
    // Sau đó mới tạo container và execute requests
    

Hy vọng phân tích này giúp bạn nắm vững Cosmos DB! 🚀 Nếu cần code sample đầy đủ, hãy hỏi thêm.

Câu 313
A development team is creating a new REST API. The API will store data in Azure Blob storage. You plan to deploy the API to Azure App Service.
Developers must access the Azure Blob storage account to develop the API for the next two months. The Azure Blob storage account must not be accessible by the developers after the two-month time period.
You need to grant developers access to the Azure Blob storage account.
What should you do?
  1. A Generate a shared access signature (SAS) for the Azure Blob storage account and provide the SAS to all developers.
  2. B Create and apply a new lifecycle management policy to include a last accessed date value. Apply the policy to the Azure Blob storage account.
  3. C Provide all developers with the access key for the Azure Blob storage account. Update the API to include the Coordinated Universal Time (UTC) timestamp for the request header.
  4. D Grant all developers access to the Azure Blob storage account by assigning role-based access control (RBAC) roles.
Xem giải thích

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

Câu hỏi mô tả một tình huống thực tế trong phát triển ứng dụng trên Azure: Một đội ngũ phát triển đang xây dựng một REST API mới, dữ liệu sẽ được lưu trữ trong Azure Blob Storage. API này dự kiến triển khai lên Azure App Service.

Yêu cầu chính:

  • Các lập trình viên (developers) phải truy cập được vào tài khoản Azure Blob Storage trong 2 tháng tới để phát triển API.
  • Sau 2 tháng, tài khoản Blob Storage không được phép truy cập bởi developers nữa (tức là quyền truy cập phải tự động hết hạn mà không cần can thiệp thủ công lâu dài).
  • Nhiệm vụ: Cấp quyền truy cập tạm thời cho developers một cách an toàn và có thời hạn.

📌 Mục tiêu cốt lõi: Đảm bảo quyền truy cập tạm thời, có thời hạn chính xác 2 tháng, tuân thủ nguyên tắc least privilege (quyền tối thiểu cần thiết) và bảo mật cao trên Azure. Đây là kịch bản phổ biến trong DevOps Azure, tránh rủi ro lộ key vĩnh viễn.

🛠️ Kiến thức cập nhật (tính đến 2026): Dựa trên tài liệu Azure mới nhất (Azure Storage SAS phiên bản hỗ trợ expiry lên đến 2026 với các tính năng nâng cao như SAS tokens với IP restrictions và protocols HTTPS-only).

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

Đáp án đúng: Generate a shared access signature (SAS) for the Azure Blob storage account and provide the SAS to all developers.

Lý do:

  • Shared Access Signature (SAS) là cơ chế cấp quyền truy cập tạm thời, có thời hạn cho Azure Blob Storage mà không cần chia sẻ access key đầy đủ.
  • Bạn có thể thiết lập expiry time chính xác là 2 tháng (ví dụ: sử dụng SharedAccessExpiryTime trong SAS token).
  • SAS chỉ cho phép quyền cụ thể (như read/write blobs), và tự động hết hạn sau thời gian quy định, đáp ứng hoàn hảo yêu cầu "không accessible sau 2 tháng".
  • An toàn hơn RBAC hoặc access key vì không cấp quyền vĩnh viễn, hỗ trợ granular control (container-level hoặc account-level).
  • Phù hợp cho developers sử dụng trong code hoặc công cụ dev (như Azure Storage Explorer).

Dẫn nguồn:

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

  • ✅ [ĐÚNG] Generate a shared access signature (SAS) for the Azure Blob storage account and provide the SAS to all developers.
    🟢 Đúng vì: Như giải thích trên, SAS lý tưởng cho quyền tạm thời với expiry chính xác 2 tháng. Developers chỉ cần paste SAS URI vào code hoặc tools, không lộ key account. Sau expiry, access tự động bị chặn (HTTP 403 Forbidden).

  • ❌ [SAI] Create and apply a new lifecycle management policy to include a last accessed date value. Apply the policy to the Azure Blob storage account.
    🔴 Sai vì: Lifecycle Management Policy dùng để quản lý vòng đời dữ liệu (như xóa/move blobs dựa trên last modified/access date), KHÔNG cấp quyền truy cập. Nó chỉ ảnh hưởng đến dữ liệu (ví dụ: tiering sang Cool/Archive), không kiểm soát ai truy cập storage account. Không giải quyết yêu cầu quyền tạm thời cho developers.

  • ❌ [SAI] Provide all developers with the access key for the Azure Blob storage account. Update the API to include the Coordinated Universal Time (UTC) timestamp for the request header.
    🔴 Sai vì: Access key là quyền vĩnh viễn (không tự hết hạn), rủi ro cao nếu lộ (developers có full control account). Thêm UTC timestamp chỉ là custom header, KHÔNG làm hết hạn quyền – attackers vẫn dùng key vô thời hạn. Vi phạm best practice "never share account keys".

  • ❌ [SAI] Grant all developers access to the Azure Blob storage account by assigning role-based access control (RBAC) roles.
    🔴 Sai vì: RBAC (như Storage Blob Data Contributor) cấp quyền vĩnh viễn cho users/groups/principal. Không có cơ chế tự động revoke sau 2 tháng (phải thủ công remove role). Không phù hợp cho access tạm thời; dùng Privileged Identity Management (PIM) mới có eligible roles với time-bound, nhưng phương án không đề cập.

Tóm tắt khuyến nghị 🎯: Luôn ưu tiên SAS cho temporary access trong Azure Storage. Nếu cần scale, kết hợp với Azure AD Conditional Access hoặc Managed Identities cho API production (sau 2 tháng dev).

Tham khảo thêm:

Câu 314
You are developing a web application that runs as an Azure Web App. The web application stores data in Azure SQL Database and stores files in an Azure
Storage account. The web application makes HTTP requests to external services as part of normal operations.
The web application is instrumented with Application Insights. The external services are OpenTelemetry compliant.
You need to ensure that the customer ID of the signed in user is associated with all operations throughout the overall system.
What should you do?
  1. A Add the customer ID for the signed in user to the CorrelationContext in the web application
  2. B On the current SpanContext, set the TraceId to the customer ID for the signed in user
  3. C Set the header Ocp-Apim-Trace to the customer ID for the signed in user
  4. D Create a new SpanContext with the TraceFlags value set to the customer ID for the signed in user
Xem giải thích

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

Câu hỏi này xoay quanh việc phát triển một ứng dụng web chạy trên Azure Web App, lưu trữ dữ liệu trong Azure SQL Database, file trong Azure Storage account, và thực hiện các HTTP request đến các dịch vụ external (tuân thủ OpenTelemetry). Ứng dụng đã được instrumented với Application Insights.
Mục tiêu chính: Đảm bảo customer ID của người dùng đã đăng nhập được liên kết (associated) với tất cả các operations xuyên suốt toàn bộ hệ thống (bao gồm web app, database, storage, và external services).
📘 Bối cảnh kỹ thuật: Application Insights hỗ trợ OpenTelemetry để trace và correlate các hoạt động qua các dịch vụ Azure và external. Cần một cơ chế propagate thông tin custom (như customer ID) mà không làm thay đổi các thành phần cốt lõi của trace (như TraceId), đảm bảo tính toàn vẹn của distributed tracing theo chuẩn OpenTelemetry (cập nhật đến 2026, với OpenTelemetry .NET SDK v1.9+ và Azure Monitor Application Insights integration).

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

Đáp án đúng: Add the customer ID for the signed in user to the CorrelationContext in the web application

🛠️ Lý do chi tiết:

  • CorrelationContext trong OpenTelemetry (và tích hợp với Application Insights) được thiết kế để thêm các custom attributes hoặc baggage (như customer ID) vào context hiện tại. Những giá trị này sẽ được propagate tự động qua các HTTP requests, spans, và traces đến Azure SQL, Azure Storage, cũng như external services OpenTelemetry-compliant.
  • Điều này đảm bảo customer ID được gắn với mọi operation trong trace toàn hệ thống, mà không ảnh hưởng đến TraceId hoặc SpanId (giữ tính unique và chuẩn W3C Trace Context).
  • Trong code .NET (Azure Web App thường dùng .NET), bạn có thể dùng Activity.Current?.AddBaggage("customerId", customerId); hoặc OpenTelemetry's Baggage.Current.SetValue("customerId", customerId);, tương đương CorrelationContext. Application Insights sẽ capture và hiển thị trong traces/logs.
  • Cập nhật 2026: Azure Application Insights v2.20+ hỗ trợ native OpenTelemetry baggage propagation, lý tưởng cho user/customer correlation.

Nguồn tham khảo:

📋 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, giữ nguyên nội dung gốc tiếng Anh. Mỗi phương án được đánh giá đúng/sai với lý do cụ thể dựa trên chuẩn OpenTelemetry và Azure best practices:

  • Add the customer ID for the signed in user to the CorrelationContext in the web application
    ✅ Đúng (như đã giải thích ở trên). Đây là cách chuẩn để propagate custom metadata (baggage) an toàn, không làm hỏng trace structure, và được hỗ trợ đầy đủ trong Application Insights + OpenTelemetry.

  • On the current SpanContext, set the TraceId to the customer ID for the signed in user
    ❌ Sai. TraceId phải là một unique identifier (128-bit hex) được generate tự động cho toàn bộ trace, không được set thủ công thành customer ID (thường là string ngắn). Việc này sẽ phá hủy tính toàn vẹn của distributed tracing, làm các spans không correlate đúng, và external services OpenTelemetry sẽ reject hoặc ignore.

  • Set the header Ocp-Apim-Trace to the customer ID for the signed in user
    ❌ Sai. Header Ocp-Apim-Trace là proprietary của Azure API Management (APIM), dùng chỉ cho tracing nội bộ APIM (không phải Application Insights hay OpenTelemetry). Nó không propagate đến Azure SQL/Storage/external services, và set customer ID vào đây không liên kết với operations hệ thống toàn diện.

  • Create a new SpanContext with the TraceFlags value set to the customer ID for the signed in user
    ❌ Sai. TraceFlags là byte flags (8-bit) dùng cho sampling/debug (e.g., bit 0x01 cho sampled, 0x02 cho debug), không phải nơi lưu custom data như customer ID (string). Tạo new SpanContext với flags sai sẽ gây lỗi validation trong OpenTelemetry exporters và không propagate đúng đến các dịch vụ Azure/external.

Kết luận 🏆: Sử dụng CorrelationContext là giải pháp tối ưu, dễ implement, và scale tốt cho production Azure apps! Nếu cần code sample, hãy hỏi thêm nhé! 🚀

Câu 315 Chọn nhiều đáp án
You develop a web application that provides access to legal documents that are stored on Azure Blob Storage with version-level immutability policies. Documents are protected with both time-based policies and legal hold policies. All time-based retention policies have the AllowProtectedAppendWrites property enabled.

You have a requirement to prevent the user from attempting to perform operations that would fail only when a legal hold is in effect and when all other policies are expired.

You need to meet the requirement.

Which two operations should you prevent? Each correct answer presents a complete solution.

NOTE: Each correct selection is worth one point.
  1. A adding data to documents
  2. B deleting documents
  3. C creating documents
  4. D overwriting existing documents
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 Azure Blob Storage với tính năng version-level immutability policies (chính sách bất biến ở mức phiên bản blob). Ứng dụng web cung cấp truy cập tài liệu pháp lý lưu trữ trên Blob Storage, được bảo vệ bởi hai loại chính sách:

  • Time-based retention policies (chính sách lưu giữ dựa trên thời gian): Giữ tài liệu trong một khoảng thời gian nhất định. Tất cả các policy này đều bật AllowProtectedAppendWrites (cho phép thêm dữ liệu append vào blob đang được bảo vệ mà không vi phạm retention).
  • Legal hold policies (chính sách giữ pháp lý): Giữ tài liệu vô thời hạn cho đến khi được xóa hold thủ công, thường dùng cho mục đích pháp lý.

Yêu cầu chính: Ngăn người dùng thực hiện các operations chỉ fail (thất bại) KHI legal hold đang active VÀ tất cả time-based policies đã expired (hết hạn). Nghĩa là:

  • Operation phải thành công nếu KHÔNG có legal hold và time-based expired.
  • Operation fail ngay nếu time-based chưa expired (do retention chung).
  • Nhưng chỉ fail đặc biệt khi time-based expired mà legal hold còn hiệu lực. Mục tiêu là prevent (ngăn chặn trước) các hành động này để tránh lỗi runtime chỉ xảy ra trong trường hợp legal hold duy nhất còn lại.

🛠️ Ngữ cảnh kỹ thuật (cập nhật Azure Storage 2024-2026): Theo tài liệu Microsoft, với version-level immutability + AllowProtectedAppendWrites:

  • Append writes được phép trên blob retained.
  • Delete/overwrites bị chặn bởi bất kỳ policy nào (time-based hoặc legal hold).
  • Create mới không bị ảnh hưởng bởi immutability của blob existing.

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

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

Hai operations cần prevent: "deleting documents" và "overwriting existing documents".
Lý do:

  • Những operations này fail chính xác khi legal hold active + time-based expired, vì lúc đó chỉ legal hold còn giữ immutability (không cho xóa/overwrites). Nếu không có legal hold, chúng sẽ thành công sau khi time-based expired.
  • Prevent chúng giúp tránh lỗi chỉ xảy ra trong scenario cụ thể này, phù hợp yêu cầu. Mỗi lựa chọn đúng worth 1 point (multi-select).

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

Dưới đây là phân tích từng lựa chọn, giữ nguyên text gốc tiếng Anh. Tôi đánh dấu ✅ đúng hoặc ❌ sai, kèm lý do bằng tiếng Việt rõ ràng:

  • adding data to documents ❌ SAI
    🧠 Giải thích: Đây là operation append writes (thêm dữ liệu vào cuối document). Với AllowProtectedAppendWrites enabled, append luôn thành công ngay cả khi time-based active hoặc legal hold đang hiệu lực (không fail). Không cần prevent vì không fail trong scenario yêu cầu.

  • deleting documents ✅ ĐÚNG
    🧠 Giải thích: Xóa document fail nếu bất kỳ policy nào active (time-based hoặc legal hold). Nhưng chỉ fail khi legal hold còn + time-based expired là đúng yêu cầu (vì time-based hết thì bình thường xóa được). Prevent để tránh lỗi cụ thể này.

  • creating documents ❌ SAI
    🧠 Giải thích: Tạo document mới không bị ảnh hưởng bởi immutability của blob existing (version-level chỉ áp dụng cho versions hiện có). Operation luôn thành công, không fail dù legal hold active hay time-based expired. Không liên quan đến yêu cầu.

  • overwriting existing documents ✅ ĐÚNG
    🧠 Giải thích: Overwrite (ghi đè) fail nếu retention/legal hold active, tương tự delete. Chỉ fail đặc biệt khi legal hold còn + time-based expired (vì overwrite tạo version mới, vi phạm immutability). Prevent để đáp ứng chính xác yêu cầu.

🔍 Tóm tắt nhanh: Chỉ delete và overwrite khớp scenario "fail only under legal hold after time-based expiry". Các option khác không fail hoặc fail không selective! 🚀

Câu 316 Chọn nhiều đáp án
You develop and deploy a web app to Azure App Service. The Azure App Service uses a Basic plan in a single region.

Users report that the web app is responding slow. You must capture the complete call stack to help identify performance issues in the code. Call stack data must be correlated across app instances. You must minimize cost and impact to users on the web app.

You need to capture the telemetry.

Which three actions should you perform? Each correct answer presents part of the solution.

NOTE: Each correct selection is worth one point.
  1. A Restart all apps in the App Service plan.
  2. B Enable Application Insights site extensions.
  3. C Upgrade the Azure App Service plan to Premium.
  4. D Enable Profiler.
  5. E Enable the Always On setting for the app service.
  6. F Enable Snapshot debugger.
  7. G Enable remote debugging.
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ủ đề Azure App Service (không phải AWS như mô tả ban đầu, có thể là nhầm lẫn). Tình huống: Bạn phát triển và triển khai một ứng dụng web lên Azure App Service sử dụng Basic plan ở một vùng (single region). Người dùng báo ứng dụng phản hồi chậm (responding slow). Nhiệm vụ là capture complete call stack (bắt toàn bộ ngăn xếp lời gọi) để xác định vấn đề hiệu suất trong code, dữ liệu phải correlated across app instances (liên kết chéo các instance app), đồng thời minimize cost and impact to users (giảm thiểu chi phí và ảnh hưởng đến người dùng).

📌 Yêu cầu cụ thể: Thực hiện ba hành động (three actions) để capture telemetry (dữ liệu giám sát). Đây là câu hỏi multi-select (mỗi lựa chọn đúng đáng 1 điểm). Giải pháp tập trung vào Application Insights Profiler – công cụ miễn phí, low-impact, hỗ trợ Basic plan, capture call stack chi tiết và correlate dữ liệu giữa các instance mà không cần upgrade plan hay restart app (tránh downtime/cost cao).

🛠️ Kiến thức cập nhật (Azure 2026): Theo tài liệu Azure mới nhất (App Service docs v2.0+), Profiler trong Application Insights hỗ trợ .NET/Core/Java/Node, hoạt động trên Basic tier trở lên, yêu cầu Always On để tránh app idle và site extension/integration cho telemetry. Không cần Premium (chỉ cho autoscaling cao cấp). Nguồn: Azure Docs - Troubleshoot App Service performance, Application Insights Profiler (cập nhật 2025).

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

Ba đáp án đúng (tổng 3 điểm):

  1. Enable Application Insights site extensions 🟢 (Cung cấp nền tảng telemetry cho Profiler).
  2. Enable Profiler 🟢 (Capture call stack chi tiết, correlate cross-instances, low-impact).
  3. Enable the Always On setting for the app service 🟢 (Ngăn app idle trên Basic plan, đảm bảo Profiler chạy liên tục mà không tốn kém).

Lý do chọn bộ ba này 📘:

  • Chúng tạo thành chuỗi hoàn chỉnh cho Profiler: Site extension → Always On (keep alive) → Enable Profiler.
  • Minimize cost/impact: Miễn phí, không downtime, không upgrade tier (Basic đủ dùng), chỉ ảnh hưởng nhẹ (~5% CPU).
  • Không làm gián đoạn user (không restart/debug). Hoàn hảo cho single-region Basic plan.

🔍 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, giữ nguyên văn bản gốc tiếng Anh. Phân loại ✅ (Đúng - phần giải pháp) hoặc ❌ (Sai - không cần thiết hoặc gây hại).

  • Restart all apps in the App Service plan.
    ❌ SAI: Việc restart gây downtime toàn bộ app (impact cao đến user), không capture call stack hay correlate data. Chỉ reset tạm thời, không troubleshoot performance. Không minimize cost/impact.

  • Enable Application Insights site extensions.
    ✅ ĐÚNG: Site extension (cách cũ nhưng vẫn hỗ trợ 2026) cài đặt Application Insights, thu thập telemetry cơ bản và enable Profiler. Correlate data cross-instances tự động. Low-cost, zero-downtime. Bắt buộc cho call stack đầy đủ trên Basic plan.

  • Upgrade the Azure App Service plan to Premium.
    ❌ SAI: Premium hỗ trợ staging/autoscale cao cấp, nhưng Profiler hoạt động tốt trên Basic (không yêu cầu). Upgrade tăng cost không cần thiết (~2-3x Basic), vi phạm "minimize cost".

  • Enable Profiler.
    ✅ ĐÚNG: Profiler capture complete call stack (bao gồm CPU hotspots, queries chậm), correlate traces cross-instances qua Application Insights. Chỉ chạy 15p/giờ, low-impact (<5% overhead), lý tưởng cho perf issues. Core action!

  • Enable the Always On setting for the app service.
    ✅ ĐÚNG: Trên Basic plan, app idle sau 20p không request → sleep, làm Profiler/telemetry gián đoạn. Always On giữ app always running (cost ~$10/tháng), đảm bảo capture liên tục mà không tốn kém hơn.

  • Enable Snapshot debugger.
    ❌ SAI: Snapshot debugger chỉ capture exceptions/at-breakpoints, không full call stack cho perf issues (chậm do CPU/memory). High-impact hơn Profiler, không correlate tốt cross-instances.

  • Enable remote debugging.
    ❌ SAI: Remote debug pause app khi attach, gây high-impact (downtime-like cho user), chỉ cho dev local. Không capture telemetry real-time hay correlate, không phù hợp production/minimize impact.

🧮 Tóm tắt điểm: 3 đúng = 100%. Áp dụng ngay trên Azure Portal > App Service > Monitoring > Application Insights/Profiler/Configuration! 🚀

Câu 317 Chọn nhiều đáp án
You have a new Azure subscription. You are developing an internal website for employees to view sensitive data. The website uses Azure Active Directory (Azure
AD) for authentication.
You need to implement multifactor authentication for the website.
Which two actions should you perform? Each correct answer presents part of the solution.
NOTE: Each correct selection is worth one point.
  1. A Configure the website to use Azure AD B2C.
  2. B In Azure AD, create a new conditional access policy.
  3. C Upgrade to Azure AD Premium.
  4. D In Azure AD, enable application proxy.
  5. E In Azure AD conditional access, enable the baseline policy.
Xem giải thích

🧩 Phân tích chi tiết câu hỏi trắc nghiệm

📘 Nội dung câu hỏi:
Câu hỏi mô tả tình huống bạn có một Azure subscription mới, đang phát triển một website nội bộ dành cho nhân viên để xem dữ liệu nhạy cảm. Website này sử dụng Azure Active Directory (Azure AD) (nay là Microsoft Entra ID theo cập nhật 2023-2026) để xác thực. Yêu cầu là triển khai multifactor authentication (MFA) cho website này. Câu hỏi yêu cầu chọn hai hành động cần thực hiện (mỗi lựa chọn đúng worth 1 point).

Đây là câu hỏi kiểu multiple correct answers (chọn nhiều đáp án đúng), tập trung vào việc kích hoạt MFA một cách targeted (hướng đến website cụ thể) cho người dùng nội bộ (employees), không phải tất cả user. MFA giúp tăng bảo mật bằng cách yêu cầu yếu tố xác thực thứ hai (như SMS, app authenticator) sau username/password.

🛠️ Lý do cần hai hành động: MFA cơ bản có thể dùng Security Defaults (miễn phí), nhưng để tùy chỉnh chính sách cho app cụ thể (như website này), phải dùng Conditional Access – tính năng chỉ có ở Azure AD Premium (P1/P2). Kiến thức cập nhật 2026: Microsoft Entra ID Premium vẫn là yêu cầu cho Conditional Access nâng cao (theo docs Microsoft).

✅ Đáp án đúng (hai lựa chọn):

  • In Azure AD, create a new conditional access policy.
  • Upgrade to Azure AD Premium.

Lý do lựa chọn:
✅ Upgrade to Azure AD Premium là bước đầu tiên vì Conditional Access (dùng để yêu cầu MFA cho app cụ thể) chỉ khả dụng ở license Premium P1/P2 (không có ở Free tier). Không upgrade thì không tạo được policy tùy chỉnh.
✅ In Azure AD, create a new conditional access policy để thiết lập quy tắc: yêu cầu MFA khi truy cập website (dựa trên app registration, user/group, location...). Policy này target chính xác website nội bộ, linh hoạt hơn Security Defaults (áp dụng toàn bộ tenant).

📋 Giải thích TẤT CẢ các phương án (sử dụng kiến thức AWS? – Lỗi đề cập, đây là Azure thuần túy):

  • ❌ Configure the website to use Azure AD B2C.
    ❌ Sai vì Azure AD B2C dành cho external customers/consumer apps (tài khoản xã hội/email), không phù hợp website nội bộ cho employees (dùng Azure AD/Entra ID workplace). B2C hỗ trợ MFA nhưng không thay thế xác thực nội bộ, gây phức tạp migration không cần thiết.

  • ✅ In Azure AD, create a new conditional access policy.
    ✅ Đúng vì đây là cách tùy chỉnh MFA targeted cho website: chọn app (website's app registration), điều kiện (user/group truy cập), và yêu cầu MFA. Linh hoạt, an toàn cho dữ liệu nhạy cảm (cập nhật 2026: Entra ID Conditional Access hỗ trợ AI risk-based MFA).

  • ✅ Upgrade to Azure AD Premium.
    ✅ Đúng vì Free tier chỉ có Security Defaults (MFA cơ bản cho tất cả), không hỗ trợ Conditional Access. Premium P1/P2 (từ ~6 USD/user/tháng) mở khóa policy tùy chỉnh. Không upgrade = không implement được MFA cho app cụ thể.

  • ❌ In Azure AD, enable application proxy.
    ❌ Sai vì Application Proxy dùng để publish on-premises apps ra internet an toàn (qua Azure AD), không liên quan triển khai MFA. Nó chỉ là connector cho hybrid access, không ảnh hưởng authentication MFA.

  • ❌ In Azure AD conditional access, enable the baseline policy.
    ❌ Sai vì không có "baseline policy" chính thức trong Conditional Access (cập nhật 2026). Có thể nhầm với Security Defaults (miễn phí, enable MFA toàn tenant) hoặc baseline protections ở Premium, nhưng không target website cụ thể và không yêu cầu "enable" trong Conditional Access.

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

💡 Lời khuyên developer: Để implement thực tế, đăng ký app cho website trước (App Registrations), rồi tạo policy target "All cloud apps" hoặc specific app với MFA controls! 🚀

Câu 318
You are building an application to track cell towers that are available to phones in near real time. A phone will send information to the application by using the Azure Web PubSub service. The data will be processed by using an Azure Functions app. Traffic will be transmitted by using a content delivery network (CDN).

The Azure function must be protected against misconfigured or unauthorized invocations.

You need to ensure that the CDN allows for the Azure function protection.

Which HTTP header should be on the allowed list?
  1. A Authorization
  2. B WebHook-Request-Callback
  3. C Resource
  4. D WebHook-Request-Origin
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 xây dựng một ứng dụng theo dõi các tháp di động (cell towers) có sẵn cho điện thoại theo thời gian thực gần (near real-time). Quy trình hoạt động như sau:

  • Điện thoại gửi thông tin đến ứng dụng qua dịch vụ Azure Web PubSub (dịch vụ pub/sub thời gian thực của Azure).
  • Dữ liệu được xử lý bởi Azure Functions (ứng dụng serverless).
  • Lưu lượng truy cập (traffic) được truyền qua Content Delivery Network (CDN) của Azure để tối ưu hóa phân phối.

Vấn đề cốt lõi: Azure Function cần được bảo vệ chống lại các lời gọi (invocations) bị cấu hình sai hoặc không được ủy quyền. Để CDN cho phép bảo vệ này, cần chỉ định HTTP header nào phải nằm trong danh sách cho phép (allowed list) trên CDN.

🛠️ Mục tiêu chính: Đảm bảo CDN chỉ chuyển tiếp các request hợp lệ từ Azure Web PubSub đến Azure Functions, tránh các cuộc tấn công hoặc gọi không mong muốn bằng cách kiểm tra header xác thực nguồn gốc.

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

Đáp án đúng: WebHook-Request-Origin

Lý do:
Azure Web PubSub tự động thêm header WebHook-Request-Origin vào các HTTP request gửi đến Azure Functions (hoặc endpoint webhook). Header này chứa thông tin nguồn gốc (origin) của sự kiện, giúp Azure Functions xác thực và bảo vệ chống invocations không hợp lệ. Khi sử dụng CDN (như Azure Front Door hoặc CDN Standard), bạn phải thêm header này vào allowed list trong quy tắc CDN để header được chuyển tiếp nguyên vẹn đến Functions. Nếu không, Functions sẽ từ chối request vì thiếu header xác thực. Đây là yêu cầu bắt buộc theo tài liệu chính thức của Azure (cập nhật đến 2026, không thay đổi cơ bản ở phiên bản mới nhất).

📘 Nguồn tham khảo:

📋 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á rõ ràng với lý do bằng tiếng Việt:

  • ❌ Authorization
    Header này dùng cho các token xác thực chung (như Bearer token trong OAuth/JWT). Nó không phải header đặc trưng mà Azure Web PubSub thêm vào request đến Functions. Nếu chỉ allow header này trên CDN, Functions vẫn không xác thực được nguồn gốc từ Web PubSub, dẫn đến invocations bị chặn không mong muốn.

  • ❌ WebHook-Request-Callback
    Đây không phải là header chuẩn của Azure Web PubSub hoặc Azure Functions. Không có tài liệu nào đề cập đến header này trong ngữ cảnh bảo vệ webhook. Sử dụng nó trên CDN sẽ không giúp bảo vệ Functions, thậm chí có thể gây lỗi cấu hình.

  • ❌ Resource
    Header này không tồn tại hoặc không liên quan đến cơ chế bảo vệ Azure Functions/Web PubSub. Nó có thể nhầm lẫn với các API khác (như REST resource paths), nhưng không được dùng để xác thực nguồn gốc request qua CDN. Thêm vào allowed list sẽ vô hiệu.

  • ✅ WebHook-Request-Origin
    Như đã giải thích ở trên: Đây là header chính thức mà Azure Web PubSub chèn vào request (giá trị là URL của hub/event). Phải whitelist trên CDN để Functions đọc và verify origin, đảm bảo bảo vệ chống misconfigured/unauthorized calls. Hoàn hảo khớp với yêu cầu!

🧩 Lưu ý bổ sung: Trong thực tế triển khai (Azure portal hoặc ARM/Bicep template), bạn cấu hình Custom rules trên Azure Front Door/CDN > "Modify request header" > Allow "WebHook-Request-Origin". Kiểm tra logs Functions để verify nếu cần. Nếu áp dụng phiên bản 2026, tích hợp với Private Link sẽ tăng bảo mật hơn nữa!

Câu 319 Chọn nhiều đáp án
You are developing an Azure App Service web app.

The web app must securely store session information in Azure Redis Cache.

You need to connect the web app to Azure Redis Cache.

Which three Azure Redis Cache properties should you use? Each correct answer presents part of the solution.

NOTE: Each correct selection is worth one point.
  1. A Access key
  2. B SSL port
  3. C Subscription name
  4. D Location
  5. E Host name
  6. F Subscription id
Xem giải thích

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

Câu hỏi này thuộc chủ đề Azure App Service và Azure Cache for Redis (phiên bản mới nhất đến năm 2026 vẫn giữ nguyên các thuộc tính kết nối cơ bản).
Nó mô tả tình huống: Bạn đang phát triển một web app trên Azure App Service, cần lưu trữ session thông tin một cách an toàn bằng Azure Redis Cache. Nhiệm vụ là kết nối web app với Azure Redis Cache, và phải chọn ba thuộc tính (properties) của Azure Redis Cache để thực hiện kết nối này.
📌 Lưu ý quan trọng: Đây là câu hỏi multi-select (mỗi lựa chọn đúng đáng 1 điểm), yêu cầu chọn đúng ba thuộc tính cần thiết để kết nối an toàn (securely). Kết nối thường sử dụng chuỗi kết nối (connection string) dạng: hostname:port,password=accesskey,ssl=True,abortConnect=False.
🛠️ Quy trình kết nối điển hình: Trong code (ví dụ .NET, Node.js), bạn cần cung cấp hostname, port (SSL), và access key để authenticate và mã hóa dữ liệu session.

✅ Đáp án đúng (ba lựa chọn chính xác)

Các thuộc tính đúng là: Access key, SSL port, và Host name.
Lý do lựa chọn:

  • Để kết nối an toàn từ Azure App Service đến Azure Redis Cache, bạn bắt buộc phải sử dụng Host name (địa chỉ máy chủ), SSL port (cổng 6380 để mã hóa SSL/TLS – phiên bản mới nhất hỗ trợ TLS 1.2+), và Access key (khóa truy cập Primary/Secondary để xác thực).
  • Những thuộc tính này tạo thành connection string đầy đủ, đảm bảo session data được lưu trữ bảo mật, tránh lộ thông tin. Không có chúng, kết nối sẽ thất bại hoặc không an toàn.
    📘 Tài liệu tham khảo:
  • Azure Docs: Connect to Azure Cache for Redis (cập nhật 2024-2026).
  • Azure Cache for Redis best practices – Nhấn mạnh SSL và access keys.

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

Dưới đây là phân tích từng lựa chọn một, giữ nguyên nội dung gốc tiếng Anh. Mỗi phương án được đánh giá ✅ (đúng) hoặc ❌ (sai), kèm lý do bằng tiếng Việt rõ ràng:

  • Access key ✅
    Đúng: Đây là khóa truy cập (Primary Key hoặc Secondary Key) từ Azure Portal (Redis Cache > Access Keys). Nó dùng để xác thực (authenticate) kết nối, bắt buộc cho mọi kết nối an toàn. Không có access key, Redis sẽ từ chối truy cập. Trong connection string: password=your_access_key.

  • SSL port ✅
    Đúng: Cổng SSL (thường là 6380) được sử dụng để kết nối mã hóa TLS/SSL, đảm bảo session data được bảo mật khỏi nghe lén. Azure khuyến nghị bật SSL bắt buộc (phiên bản mới nhất mặc định TLS 1.2). Không dùng SSL port (mặc định 6379 là non-SSL, không an toàn).

  • Subscription name ❌
    Sai: Tên subscription chỉ dùng để quản lý tài nguyên Azure (như tạo hoặc deploy Redis instance), không liên quan trực tiếp đến kết nối runtime từ web app. Kết nối chỉ cần thông tin instance-specific, không cần tên subscription.

  • Location ❌
    Sai: Vùng địa lý (Location) như East US chỉ ảnh hưởng đến latency và chi phí khi tạo Redis Cache, không phải thuộc tính kết nối. Web app có thể kết nối cross-region mà không cần location trong connection string.

  • Host name ✅
    Đúng: Tên máy chủ (ví dụ: mycache.redis.cache.windows.net) là địa chỉ IP/DNS chính để web app tìm và kết nối đến Redis instance. Đây là phần đầu tiên trong connection string: hostname=mycache.redis.cache.windows.net.

  • Subscription id ❌
    Sai: ID subscription dùng cho API calls quản lý (như ARM templates), không cần thiết cho kết nối trực tiếp từ code web app. Kết nối chỉ dựa vào properties của Redis resource cụ thể, không phải subscription level.

🧩 Tóm tắt: Chọn đúng ba ✅ sẽ cho phép kết nối thành công và an toàn. Các ❌ chỉ dùng ở giai đoạn provisioning, không phải runtime connection! Nếu implement, hãy dùng Azure SDK hoặc StackExchange.Redis library với các properties này.

Câu 320
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
You develop an HTTP triggered Azure Function app to process Azure Storage blob data. The app is triggered using an output binding on the blob.
The app continues to time out after four minutes. The app must process the blob data.
You need to ensure the app does not time out and processes the blob data.
Solution: Update the functionTimeout property of the host.json project file to 10 minutes.
Does the solution meet the goal?
  1. A Yes
  2. B No
Xem giải thích

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

Câu hỏi thuộc dạng phân tích tình huống (scenario-based) trong kỳ thi chứng chỉ Azure Developer, nơi bạn phát triển một ứng dụng Azure Function được kích hoạt bởi HTTP trigger (HTTP triggered) để xử lý dữ liệu từ Azure Storage blob. Ứng dụng sử dụng output binding trên blob để ghi/đẩy dữ liệu ra blob sau khi xử lý.
📌 Vấn đề chính: Ứng dụng liên tục timeout sau 4 phút (khoảng 230 giây) khi xử lý blob data, dù cần hoàn thành việc xử lý.
🛠️ Giải pháp đề xuất: Cập nhật thuộc tính functionTimeout trong file host.json của project lên 10 phút (00:10:00).
❓ Mục tiêu: Đảm bảo ứng dụng không timeout và xử lý xong blob data.
Câu hỏi yêu cầu đánh giá liệu giải pháp này có đạt mục tiêu không (Does the solution meet the goal?). Lưu ý: Đây là phần câu hỏi không thể quay lại sau khi trả lời.

✅ Đáp án đúng: No

Lý do chọn đáp án này:
Giải pháp KHÔNG đạt mục tiêu vì đối với HTTP triggered functions trên Consumption plan (mặc định), thời gian timeout bị giới hạn cố định ở 230 giây (~4 phút) do giới hạn request timeout của HTTP runtime. Thuộc tính functionTimeout trong host.json không áp dụng cho HTTP triggers trên Consumption plan – nó chỉ hiệu quả với non-HTTP triggers hoặc các plan khác như Premium/Dedicated (App Service plan). Dù đặt functionTimeout lên 10 phút, function vẫn timeout sau 4 phút.
🧩 Giải pháp thay thế phù hợp (dựa trên kiến thức Azure Functions v4+ đến 2026):

  • Chuyển sang blob trigger thay vì HTTP trigger để tránh giới hạn HTTP timeout.
  • Scale lên Premium plan hoặc Dedicated plan để hỗ trợ timeout dài hơn (lên đến 60 phút unbounded).
  • Sử dụng Durable Functions cho workflow dài.
  • Hoặc chia nhỏ xử lý thành batch với Queue trigger.

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

  • Yes ❌ SAI: Phương án này sai vì cho rằng cập nhật functionTimeout sẽ mở rộng timeout cho HTTP triggered function. Thực tế, HTTP triggers trên Consumption plan bị giới hạn cứng 230 giây, bất kể setting functionTimeout (docs xác nhận nó bị ignore cho HTTP). Giải pháp không giải quyết timeout, app vẫn fail sau 4 phút.

  • No ✅ ĐÚNG: Phương án này đúng vì giải pháp đề xuất không hiệu quả. functionTimeout chỉ kiểm soát thời gian chạy của function execution cho non-HTTP triggers (max 10 phút trên Consumption). Với HTTP trigger, timeout do HTTP request lifetime quy định, không thay đổi được bằng host.json trên Consumption plan. Cần thay đổi kiến trúc trigger hoặc plan để đạt mục tiêu xử lý blob data mà không timeout.

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

Hy vọng phân tích giúp bạn nắm vững! 🚀 Nếu cần ví dụ code host.json hoặc Durable Functions, hãy hỏi thêm nhé!