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

Tìm thấy 409 câu.

Câu 1 Monitoring

You are developing an Azure Function App that needs to log detailed execution information for troubleshooting purposes. Which of the following methods should you use to implement logging in your Azure Function?

  1. A

    Use the `Console.WriteLine` method to log messages to the console.

  2. B

    Use Azure Blob Storage to store log files generated by the function execution.

  3. C

    Set the logging level to "Verbose" in the function's host.json file to capture all execution details.

  4. D

    Configure Application Insights and use the TelemetryClient to send custom events and log messages.

Xem giải thích

Đáp án

D — Cấu hình Application Insights và dùng TelemetryClient để gửi sự kiện tuỳ chỉnh

Vì sao đúng

Application Insights là cách ghi log được khuyến nghị cho Azure Functions, vì nó lo sẵn ba thứ mà các cách khác thiếu: gom log từ mọi lần chạy kể cả khi hàm co giãn ra hàng trăm bản, liên kết log với từng lời gọi cụ thể, và cho truy vấn bằng KQL để lọc và tổng hợp.

TelemetryClient cho gửi sự kiện và số đo tuỳ chỉnh kèm thuộc tính riêng của nghiệp vụ, nên gỡ lỗi không chỉ dừng ở "có ngoại lệ" mà biết được ngoại lệ đó xảy ra với dữ liệu đầu vào nào.

Vì sao các phương án khác sai

  • A. Console.WriteLine — hoạt động nhưng đầu ra không có cấu trúc và khó tra cứu; ở môi trường sản xuất thì gần như vô dụng.
  • B. Tự ghi tệp log lên Blob Storage — tự dựng lại thứ đã có sẵn, kèm việc phải tự xoay vòng và tự tra cứu.
  • C. Đặt mức log thành Verbose trong host.json — có ích và nên làm, nhưng đó chỉ là chỉnh mức chi tiết; nó không tự tạo ra nơi thu thập và tra cứu log.
Câu 2 ARM template
You need to modify an ARM template. You would like the location of the Azure resources to be in the same region as the resource group itself. Which ARM template function meets the criteria?
  1. A [environment()]
  2. B [subscription().location]
  3. C [resourceGroup().location]
  4. D [parameters('location')]
Xem giải thích

Đáp án

C — [resourceGroup().location]

Vì sao đúng

⚠ Hàm resourceGroup() trả về đối tượng mô tả resource group đang triển khai:

⚠ "location": "[resourceGroup().location]"
        ↓
⚠ Tài nguyên được tạo ở CÙNG VÙNG với resource group
Hàm Trả về
⚠ resourceGroup() ⚠ id, name, location, tags của RG
⚠ subscription() ⚠ id, tenantId, displayName — KHÔNG có location
⚠ deployment() ⚠ thông tin lần triển khai hiện tại
⚠ environment() ⚠ endpoint của môi trường Azure

Vì sao các phương án khác sai

  • B (subscription().location) — ⚠ KHÔNG tồn tại: ⚠ subscription ⚠ không có thuộc tính location; ⚠ đây là bẫy đáng chú ý.

  • D (parameters('location')) — ⚠ đọc THAM SỐ do người triển khai truyền vào; ⚠ nó thường ⚠ có defaultValue là [resourceGroup().location], ⚠ nhưng bản thân nó không tự lấy vị trí RG.

  • A (environment()) — ⚠ trả về endpoint của môi trường (Azure Public, Azure China...), ⚠ không phải vị trí.

Ghi nhớ

⚠ Ghi nhớ về chất lượng câu hỏi: ⚠ câu này ⚠ là cặp bổ sung hoàn hảo với #18376 ở lô 164.

Câu Hỏi gì Khoá
⚠ #18376 ⚠ parameters('location') nghĩa là gì ⚠ tham số phải truyền lúc deploy
⚠ #21405 (câu này) ⚠ hàm nào lấy vị trí resource group ⚠ resourceGroup().location
⚠ Bổ sung nhau ⚠ #18376 có phương án nhiễu chính là khoá của câu này
⚠ Mẫu thực tế ⚠ khai tham số location với defaultValue là [resourceGroup().location]

⚠ Hàm ARM template hay dùng: | Hàm | Việc | |---|---| | ⚠ parameters() | ⚠ đọc tham số | | ⚠ variables() | ⚠ đọc biến | | ⚠ resourceGroup() | ⚠ thông tin RG | | ⚠ subscription() | ⚠ thông tin subscription | | ⚠ reference() | ⚠ thuộc tính runtime của tài nguyên khác | | ⚠ resourceId() | ⚠ dựng id đầy đủ của tài nguyên | | ⚠ concat(), uniqueString() | ⚠ ghép chuỗi, sinh hậu tố duy nhất |

Từ khoá nhận diện:

"vị trí của resource group" → ⚠ resourceGroup().location "giá trị truyền vào lúc deploy" → ⚠ parameters() "thuộc tính của tài nguyên vừa tạo" → ⚠ reference() "tên duy nhất toàn cầu" → ⚠ uniqueString()

⚠ Mẫu chuẩn cho tham số location Mẫu
⚠ Khai tham số location
⚠ defaultValue: [resourceGroup().location]
⚠ Tài nguyên dùng [parameters('location')]
⚠ Ưu điểm ⚠ mặc định hợp lý, nhưng vẫn ghi đè được khi cần
⚠ Đây là ⚠ cách Microsoft khuyến nghị trong mọi template mẫu
⚠ uniqueString — hàm rất hữu ích Nội dung
⚠ Sinh chuỗi băm 13 ký tự từ các tham số đầu vào
⚠ Cùng đầu vào luôn cho cùng kết quả
⚠ Dùng để tạo tên storage account duy nhất toàn cầu
⚠ Ví dụ ⚠ [concat('st', uniqueString(resourceGroup().id))]

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Vùng có nên cố định hay theo RG | | | Tên tài nguyên cần duy nhất toàn cầu có dùng uniqueString chưa | | | Đã chạy what-if trước khi deploy chưa | |

Và mẫu viết template được dùng trong hầu hết ví dụ chính thức của Microsoft, kết hợp cả hai câu hỏi này: khai một tham số location với giá trị mặc định là vị trí của resource group. Vừa linh hoạt, vừa không bắt người dùng nhập gì khi không cần.

Câu 3 Azure Functions
How many input bindings is an Azure Function allowed to have?
  1. A Any number or zero
  2. B 1 or more
  3. C 1
  4. D 0 or 1
Xem giải thích

Đáp án

A — Bao nhiêu cũng được, hoặc không có cái nào.

Vì sao đúng

⚠ Azure Functions có ba loại binding với quy tắc số lượng khác nhau: | Loại | Số lượng | |---|---| | ⚠ Trigger | ⚠ BẮT BUỘC đúng MỘT | | ⚠ Input binding | ⚠ BAO NHIÊU CŨNG ĐƯỢC, kể cả 0 | | ⚠ Output binding | ⚠ bao nhiêu cũng được, kể cả 0 |

⚠ {
⚠   "bindings": [
⚠     { "type": "httpTrigger",  "direction": "in" },
⚠     { "type": "blob",         "direction": "in" },
⚠     { "type": "table",        "direction": "in" },
⚠     { "type": "queue",        "direction": "out" }
⚠   ]
⚠ }

Vì sao các phương án khác sai

  • D (0 hoặc 1) và C (đúng 1) — ⚠ là quy tắc của TRIGGER, không phải input binding.

  • B (1 trở lên) — ⚠ SAI: ⚠ hàm hoàn toàn có thể ⚠ không có input binding nào, ⚠ chỉ có trigger.

Ghi nhớ

⚠ Ba loại binding — bảng phải thuộc: | Loại | Vai trò | Số lượng | |---|---|---| | ⚠ Trigger | ⚠ KHỞI ĐỘNG hàm | ⚠ đúng 1 | | ⚠ Input | ⚠ lấy thêm dữ liệu vào | ⚠ 0 tới nhiều | | ⚠ Output | ⚠ ghi kết quả ra | ⚠ 0 tới nhiều |

Từ khoá nhận diện:

"đúng một, bắt buộc" → ⚠ trigger "bao nhiêu cũng được" → ⚠ input và output binding "function.json" → ⚠ nơi khai binding "host.json" → ⚠ cấu hình chung cho cả function app

⚠ Vì sao binding hữu ích Lý do
⚠ KHÔNG phải viết mã kết nối
⚠ Không quản lý chuỗi kết nối trong mã
⚠ Dữ liệu được truyền vào như tham số hàm
⚠ Ít mã hơn, ít lỗi hơn
⚠ Ví dụ ⚠ queue trigger + blob input + table output trong một hàm
⚠ Các trigger phổ biến Trigger
⚠ HTTP ⚠ gọi qua URL
⚠ Timer ⚠ theo lịch NCRONTAB
⚠ Blob ⚠ khi có tệp mới
⚠ Queue, Service Bus ⚠ khi có tin nhắn
⚠ Event Hub, Event Grid ⚠ khi có sự kiện
⚠ Cosmos DB ⚠ change feed
⚠ Giới hạn cần biết Giới hạn
⚠ Một hàm = một trigger
⚠ Muốn nhiều nguồn kích hoạt → viết nhiều hàm
⚠ Chúng có thể gọi chung một hàm logic
⚠ Thiết kế tốt ⚠ giữ hàm nhỏ, mỗi hàm một việc

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Hàm có đúng một trigger chưa | | | Có dùng binding thay cho mã kết nối không | | | Chuỗi kết nối có nằm trong cấu hình chứ không phải mã không | |

Và quy tắc duy nhất cần nhớ chắc về binding của Azure Functions: trigger thì đúng một, còn input và output thì bao nhiêu tuỳ ý.

Câu 4 Access Control
What option do you have to grant someone access to a single container in your Azure storage account without having to give them your storage account keys?
  1. A Grant their user contributor access to your storage account within your subscription
  2. B Create for them a Shared Access Signature (SAS)
  3. C Recycle the storage account keys after giving one to them
  4. D Change the permission settings for the container to public
Xem giải thích

Đáp án

B — Tạo cho họ một Shared Access Signature (SAS).

Vì sao đúng

⚠ SAS cấp quyền HẸP và CÓ HẠN mà không lộ khoá tài khoản:

⚠ Khoá tài khoản
   ⚠ = quyền TOÀN PHẦN trên MỌI thứ
        ↓ ⚠ không bao giờ đưa ra ngoài
⚠ SAS token
   ⚠ chỉ container này
   ⚠ chỉ quyền đọc
   ⚠ hết hạn sau N giờ
   ⚠ giới hạn dải IP
Cấu hình được trong SAS Nội dung
⚠ Dịch vụ và tài nguyên nào ⚠ blob, file, queue, table
⚠ Quyền gì ⚠ đọc, ghi, xoá, liệt kê
⚠ Thời gian bắt đầu và hết hạn
⚠ Dải IP được phép
⚠ Chỉ HTTPS

Vì sao các phương án khác sai

  • D (đổi container thành công khai) — ⚠ NGUY HIỂM: ⚠ cho ⚠ cả thế giới truy cập, không chỉ người kia.

  • A (cấp vai trò Contributor trên storage account) — ⚠ quá rộng: ⚠ cho quyền trên ⚠ toàn bộ tài khoản, ⚠ và Contributor còn ⚠ đọc được khoá.

  • C (đưa một khoá rồi tạo lại khoá sau) — ⚠ vẫn lộ quyền toàn phần trong khoảng thời gian đó.

Ghi nhớ

⚠ Ghi nhớ về chất lượng câu hỏi: ⚠ câu này ⚠ cùng chùm với #19495 và #19578 về quản lý khoá.

Câu Hỏi gì Khoá
⚠ #19495 ⚠ bảo vệ dữ liệu đi và đến Storage ⚠ secure transfer required
⚠ #19578 ⚠ khoá Cosmos bị lộ thì làm gì ⚠ chuyển sang khoá 2 rồi tạo lại
⚠ #21407 (câu này) ⚠ cấp quyền một container không đưa khoá ⚠ SAS
⚠ Ba câu ⚠ cùng nguyên tắc: đừng chia sẻ khoá toàn quyền

⚠ Ba loại SAS — phải phân biệt: | Loại | Ký bằng | Thu hồi được | |---|---|---| | ⚠ Service SAS | ⚠ khoá tài khoản | ⚠ khó — phải đổi khoá | | ⚠ Account SAS | ⚠ khoá tài khoản | ⚠ khó | | ⚠ User delegation SAS | ⚠ Entra ID | ⚠ DỄ — thu hồi danh tính | | ⚠ Khuyến nghị | ⚠ user delegation SAS |

Từ khoá nhận diện:

"cấp quyền tạm thời, phạm vi hẹp" → ⚠ SAS "ứng dụng truy cập không cần bí mật" → ⚠ managed identity "cho cả thế giới" → ⚠ public access — hầu như luôn sai "thu hồi dễ dàng" → ⚠ user delegation SAS hoặc RBAC

⚠ Stored access policy — cách thu hồi SAS Nội dung
⚠ Gắn SAS vào một CHÍNH SÁCH lưu trên container
⚠ Sửa hoặc xoá chính sách là THU HỒI mọi SAS gắn với nó
⚠ Không phải đổi khoá tài khoản
⚠ Rất hữu ích ⚠ khi cần thu hồi quyền đã cấp mà không gây gián đoạn diện rộng
⚠ Thực hành tốt với SAS Thực hành
⚠ Hạn NGẮN nhất có thể
⚠ Quyền TỐI THIỂU
⚠ Giới hạn IP nếu biết trước
⚠ Chỉ HTTPS
⚠ Ưu tiên user delegation SAS
⚠ Tránh ⚠ SAS hạn nhiều năm ký bằng khoá tài khoản

Ba việc kiểm chứng: | Việc | Cách | |---|---| | SAS đang phát hành có hạn bao lâu | | | Có dùng stored access policy để thu hồi được không | | | Có container nào đang ở chế độ công khai không | |

Và điểm yếu cố hữu của SAS mà stored access policy sinh ra để khắc phục: một token đã phát ra thì không gọi lại được. Gắn nó vào một chính sách có thể sửa là cách duy nhất để giữ quyền thu hồi.

Câu 5 Azure Functions
You have a Timer Trigger Function that uses "0 15,30,45 0 * * *" as it's timer setting. How often will the function run?
  1. A Every 15 seconds, every minute of the day
  2. B At 15 minutes, 30 minutes, and 45 minutes past every hour of the day
  3. C At 00:15, 00:30, and 00:45 (12:15am, 12:30am, and 12:45am); three times per day only.
  4. D Every 15 minutes, every hour of the day
Xem giải thích

Đáp án

C — Lúc 00:15, 00:30 và 00:45 — chỉ ba lần mỗi ngày.

Vì sao đúng

⚠ NCRONTAB của Azure Functions có SÁU trường, không phải năm:

⚠ {giây} {phút} {giờ} {ngày} {tháng} {thứ}
⚠    0   15,30,45   0     *      *     *
⚠    │      │       │
⚠    │      │       └── giờ 0 (nửa đêm)
⚠    │      └────────── phút 15, 30, 45
⚠    └───────────────── giây 0
        ↓
⚠ 00:15:00, 00:30:00, 00:45:00
⚠ → BA lần mỗi ngày
Điểm mấu chốt Nội dung
⚠ Trường ĐẦU là GIÂY ⚠ khác cron chuẩn của Linux
⚠ Trường thứ ba là GIỜ, ở đây là 0 ⚠ chỉ chạy trong giờ nửa đêm

Vì sao các phương án khác sai

  • B (15, 30, 45 phút của MỌI giờ) — ⚠ bẫy chính: ⚠ sẽ đúng nếu trường giờ là *; ⚠ nhưng ở đây là ⚠ 0 nên chỉ giờ nửa đêm.

  • D (mỗi 15 phút, mọi giờ) — ⚠ đó là 0 */15 * * * *.

  • A (mỗi 15 giây) — ⚠ hiểu nhầm hoàn toàn vị trí các trường.

Ghi nhớ

⚠ NCRONTAB — sáu trường: | Vị trí | Trường | Khoảng | |---|---|---| | ⚠ 1 | ⚠ giây | ⚠ 0-59 | | ⚠ 2 | ⚠ phút | ⚠ 0-59 | | ⚠ 3 | ⚠ giờ | ⚠ 0-23 | | ⚠ 4 | ⚠ ngày trong tháng | ⚠ 1-31 | | ⚠ 5 | ⚠ tháng | ⚠ 1-12 | | ⚠ 6 | ⚠ thứ trong tuần | ⚠ 0-6, 0 là Chủ nhật | | ⚠ Khác cron Linux | ⚠ Linux chỉ có NĂM trường, không có giây |

⚠ Ví dụ hay gặp: | Biểu thức | Nghĩa | |---|---| | ⚠ 0 */5 * * * * | ⚠ mỗi 5 phút | | ⚠ 0 0 * * * * | ⚠ mỗi giờ đúng phút 0 | | ⚠ 0 0 9 * * * | ⚠ 9 giờ sáng mỗi ngày | | ⚠ 0 0 9 * * 1-5 | ⚠ 9 giờ sáng thứ Hai tới thứ Sáu | | ⚠ 0 30 2 1 * * | ⚠ 2:30 sáng ngày mùng 1 mỗi tháng |

Từ khoá nhận diện:

"sáu trường, có giây" → ⚠ NCRONTAB của Azure Functions "năm trường" → ⚠ cron Linux "* ở trường giờ" → ⚠ mọi giờ "số cụ thể ở trường giờ" → ⚠ chỉ giờ đó

⚠ Cạm bẫy về MÚI GIỜ Cạm bẫy
⚠ Mặc định Timer Trigger chạy theo UTC
⚠ 9 giờ sáng UTC là 4 giờ chiều giờ Việt Nam
⚠ Đặt WEBSITE_TIME_ZONE để đổi ⚠ ví dụ SE Asia Standard Time
⚠ Sự cố kinh điển ⚠ báo cáo "hằng đêm" chạy vào giữa trưa
⚠ Điều cần biết thêm về Timer Trigger Điều
⚠ Lỡ một lần chạy thì mặc định KHÔNG chạy bù
⚠ runOnStartup chỉ nên bật khi phát triển
⚠ Với gói Consumption, hàm có thể bị ngủ
⚠ Nếu cần đúng giờ tuyệt đối ⚠ cân nhắc gói Premium

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Biểu thức có sáu trường không | ⚠ đếm trước khi phân tích | | Múi giờ đã cấu hình chưa | | | Lỡ một lần chạy có sao không | |

Và sai lầm phổ biến nhất khi viết lịch cho Azure Functions: dùng biểu thức cron năm trường quen thuộc từ Linux. Trường đầu tiên ở đây là giây, và mọi thứ dịch đi một ô.

Câu 6 Azure App Service

You are developing an Azure application that uses Application Insights for monitoring. You need to configure custom telemetry to track specific business events, such as when a user completes a purchase. Which of the following methods should you use to send custom events to Application Insights?

  1. A

    TrackEvent

  2. B

    TrackException

  3. C

    TrackTrace

  4. D

    TrackMetric

Xem giải thích

Đáp án

A — TrackEvent

Vì sao đúng

Application Insights có bốn phương thức chính, mỗi cái cho một loại dữ liệu khác nhau:

Phương thức Dùng cho
TrackEvent Sự kiện nghiệp vụ rời rạc — người dùng hoàn tất mua hàng, đăng ký gói dịch vụ
TrackMetric Giá trị số đo được — thời gian xử lý, số mục trong giỏ
TrackTrace Thông điệp log dạng văn bản để chẩn đoán
TrackException Ngoại lệ kèm ngăn xếp lời gọi

Đề nói rõ là sự kiện nghiệp vụ, nên TrackEvent là lựa chọn đúng. Nó còn cho gắn thuộc tính tuỳ ý (loại sản phẩm, giá trị đơn) để phân tích về sau.

Vì sao các phương án khác sai

  • D. TrackMetric — nếu bạn muốn theo dõi giá trị đơn hàng thì dùng nó, nhưng "khi ai đó hoàn tất mua hàng" là một sự kiện, không phải một con số.
  • C. TrackTrace và B. TrackException — thuộc về chẩn đoán kỹ thuật, không phải phân tích nghiệp vụ.
Câu 7 Container Registry
What does the CLI command 'az acr build --registry $ACR_NAME --image helloacrtasks:v1 .' do?
  1. A Creates a new ACR resource if one doesn't exist under that name, otherwise does nothing
  2. B Performs a docker build and keeps the image on the local machine
  3. C Creates a new ACR resource if one doesn't exist under that name, or deletes the images from the existing resource
  4. D Performs a docker build and immediately pushes the result image into an ACR.
Xem giải thích

Đáp án

D — Thực hiện docker build rồi ĐẨY NGAY ảnh kết quả vào ACR.

Vì sao đúng

⚠ az acr build chạy toàn bộ quá trình TRÊN ĐÁM MÂY:

⚠ az acr build --registry $ACR_NAME \
⚠   --image helloacrtasks:v1 .
        ↓
⚠ 1. Nén thư mục hiện tại (dấu chấm) và tải lên ACR
⚠ 2. ACR Tasks BUILD ảnh trên máy chủ Azure
⚠ 3. Ảnh được ĐẨY thẳng vào registry
        ↓
⚠ KHÔNG cần Docker cài trên máy bạn
Lợi ích Nội dung
⚠ Không cần Docker cục bộ
⚠ Không tốn băng thông đẩy ảnh lên ⚠ chỉ tải mã nguồn lên
⚠ Build nhanh hơn trên hạ tầng Azure
⚠ Dùng được trong CI/CD

Vì sao các phương án khác sai

  • B (build rồi giữ ảnh trên máy cục bộ) — ⚠ đó là docker build, không phải az acr build.

  • A và C (tạo hoặc xoá tài nguyên ACR) — ⚠ đó là az acr create và az acr delete; ⚠ lệnh build ⚠ không tạo registry.

Ghi nhớ

⚠ Ba cách đưa ảnh vào ACR: | Cách | Nội dung | |---|---| | ⚠ docker build rồi docker push | ⚠ build cục bộ, cần Docker | | ⚠ az acr build | ⚠ build TRÊN ĐÁM MÂY, đẩy luôn | | ⚠ az acr import | ⚠ sao chép ảnh từ registry khác |

Từ khoá nhận diện:

"build trên đám mây, không cần Docker" → ⚠ az acr build "build cục bộ" → ⚠ docker build "sao chép từ Docker Hub" → ⚠ az acr import "tự build lại khi mã nguồn đổi" → ⚠ ACR Tasks

⚠ ACR Tasks — mở rộng của az acr build Nội dung
⚠ Quick task ⚠ chính là az acr build
⚠ Auto-build khi commit vào Git
⚠ Auto-build khi ảnh CƠ SỞ cập nhật ⚠ tính năng đáng giá nhất
⚠ Multi-step task ⚠ build, test, đẩy theo chuỗi
⚠ Vì sao quan trọng ⚠ ảnh cơ sở vá lỗi bảo mật thì ảnh của bạn tự build lại
⚠ Các bậc của ACR Bậc
⚠ Basic ⚠ học và thử nghiệm
⚠ Standard ⚠ phần lớn nhu cầu sản xuất
⚠ Premium ⚠ geo-replication, private link, content trust
⚠ Geo-replication ⚠ CHỈ có ở Premium — kéo ảnh nhanh ở nhiều vùng
⚠ Xác thực với ACR Cách
⚠ az acr login ⚠ cho người dùng
⚠ Managed identity ⚠ cho AKS, App Service — khuyến nghị
⚠ Service principal
⚠ Admin user ⚠ chỉ nên dùng khi thử nghiệm

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Có cần Docker trên máy build không | | | Ảnh cơ sở cập nhật thì ảnh của bạn có tự build lại không | | | AKS xác thực với ACR bằng gì | ⚠ nên là managed identity |

Và tính năng của ACR Tasks đáng bật nhất cho môi trường sản xuất, thường bị bỏ qua: tự động build lại khi ảnh cơ sở được vá lỗi bảo mật. Không có nó, ảnh của bạn mang lỗ hổng đã được vá từ nhiều tháng trước.

Câu 8 Containers

You are tasked with creating a Docker image for a .NET Core application and deploying it to Azure Container Instances. Which command would you use to build the Docker image from the Dockerfile located in your current directory and tag it as "myapp:v1"?

  1. A

    docker create -t myapp:v1 .

  2. B

    docker image build -t myapp:v1 .

  3. C

    docker build -t myapp:v1 .

  4. D

    docker run -t myapp:v1 .

Xem giải thích

Đáp án

C — docker build -t myapp:v1 .

Vì sao đúng

docker build là lệnh dựng ảnh từ Dockerfile. Ba phần trong lệnh:

  • -t myapp:v1 — gắn thẻ cho ảnh: tên và phiên bản.
  • . — build context, tức thư mục chứa Dockerfile và các tệp cần chép vào ảnh. Dấu chấm rất hay bị quên và khi thiếu thì lệnh báo lỗi.

Vì sao các phương án khác sai

  • B. docker image build -t myapp:v1 . — đây là cú pháp mới của cùng lệnh, và nó cũng chạy được. Đây là phương án nhiễu gần nhất; docker build là dạng rút gọn phổ biến hơn và là cách được hỏi tới trong hầu hết tài liệu.
  • A. docker create — tạo container từ một ảnh đã có, không dựng ảnh.
  • D. docker run — tạo và khởi chạy container từ ảnh đã có.
Câu 9 Event Solutions
The speed of an Azure Event Hub is determined by the number of Throughput units you reserve for it. You can set between 1 and 20 throughput units for the Event Hub. How fast does 1 throughput unit represent for data coming in to an Event Hub?
  1. A 1 MB per second or 1000 events per second (whichever comes first)
  2. B 1 GB per second
  3. C 1000 events per second
  4. D 1 throughput unit is one event per second
Xem giải thích

Đáp án

A — 1 MB mỗi giây HOẶC 1.000 sự kiện mỗi giây, tuỳ cái nào tới trước.

Vì sao đúng

⚠ Throughput unit của Event Hub giới hạn theo HAI chiều: | Chiều | Giới hạn mỗi TU | |---|---| | ⚠ Ingress (vào) | ⚠ 1 MB/giây HOẶC 1.000 sự kiện/giây | | ⚠ Egress (ra) | ⚠ 2 MB/giây hoặc 4.096 sự kiện/giây |

⚠ Gửi 1.500 sự kiện nhỏ mỗi giây
   ⚠ dù tổng chỉ 200 KB
        ↓
⚠ VẪN vượt giới hạn 1.000 sự kiện
        ↓
⚠ Bị điều tiết

⚠ Điểm mấu chốt: ⚠ chạm ⚠ BẤT KỲ giới hạn nào cũng bị điều tiết, ⚠ không phải cả hai.

Vì sao các phương án khác sai

  • C (1.000 sự kiện mỗi giây) — ⚠ thiếu vế dung lượng: ⚠ 500 sự kiện mỗi cái 5KB đã vượt 1MB.

  • B (1 GB mỗi giây) — ⚠ quá lớn, không đúng con số.

  • D (một sự kiện mỗi giây) — ⚠ quá nhỏ.

Ghi nhớ

⚠ Con số Event Hub cần nhớ: | Chỉ số | Giá trị | |---|---| | ⚠ Ingress mỗi TU | ⚠ 1 MB/s hoặc 1.000 sự kiện/s | | ⚠ Egress mỗi TU | ⚠ 2 MB/s hoặc 4.096 sự kiện/s | | ⚠ Số TU (Standard) | ⚠ 1 tới 20, xin thêm được | | ⚠ Kích thước sự kiện tối đa | ⚠ 1 MB | | ⚠ Thời gian giữ (Standard) | ⚠ 1 tới 7 ngày | | ⚠ Số partition | ⚠ chọn lúc tạo, ảnh hưởng song song |

Từ khoá nhận diện:

"1 MB/s hoặc 1.000 sự kiện/s" → ⚠ throughput unit "tự tăng TU khi cần" → ⚠ Auto-inflate "partition" → ⚠ đơn vị song song khi ĐỌC "consumer group" → ⚠ nhiều ứng dụng đọc độc lập cùng dòng

⚠ Auto-inflate — tính năng nên bật Nội dung
⚠ Tự TĂNG số TU khi lưu lượng vượt ngưỡng
⚠ Đặt được mức tối đa
⚠ KHÔNG tự giảm xuống ⚠ điểm cần nhớ
⚠ Vì vậy ⚠ vẫn nên theo dõi và hạ thủ công khi hết cao điểm
⚠ Partition — quyết định lúc tạo Nội dung
⚠ Quyết định mức SONG SONG khi đọc
⚠ Mỗi partition có một consumer đọc tại một thời điểm
⚠ Không đổi được sau khi tạo ⚠ với bậc Standard
⚠ Nguyên tắc ⚠ số partition ít nhất bằng số consumer dự kiến
⚠ Consumer group Nội dung
⚠ Mỗi nhóm đọc ĐỘC LẬP cùng một dòng
⚠ Mỗi nhóm giữ vị trí đọc riêng
⚠ Ví dụ ⚠ một nhóm ghi vào data lake, một nhóm tính cảnh báo thời gian thực

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Đang chạm giới hạn dung lượng hay số sự kiện | ⚠ hai chiều khác nhau | | Số partition có đủ cho số consumer không | | | Auto-inflate đã bật chưa và có ai hạ lại không | |

Và chi tiết dễ gây bất ngờ nhất về Event Hub: rất nhiều sự kiện nhỏ có thể chạm trần trước khi tổng dung lượng gần tới giới hạn. Một triệu tin nhắn một kilobyte vượt hạn mức sự kiện từ lâu trước khi vượt hạn mức megabyte.

Câu 10 Azure Storage
You have a Lifecycle Storage policy that moves blobs from hot storage to cool storage if they have not been modified in 30 days. You realize that there is a frequently accessed file that is in cool storage due to this policy, and you'd like to save money by moving it back to hot storage. So you manually move this file back to hot storage. Will this solve your problem?
  1. A No, the blob will be automatically moved back to cool storage the next day
  2. B Yes
Xem giải thích

Đáp án

A — Không, blob sẽ TỰ ĐỘNG bị chuyển lại về Cool vào ngày hôm sau.

Vì sao đúng

⚠ Chính sách lifecycle dựa trên lastModified, và đổi tầng KHÔNG cập nhật mốc đó:

⚠ Blob sửa lần cuối: 60 ngày trước
        ↓ ⚠ policy: chưa sửa trong 30 ngày → Cool
⚠ Blob bị chuyển sang Cool
        ↓ ⚠ bạn chuyển tay về Hot
⚠ lastModified VẪN là 60 ngày trước
        ↓ ⚠ policy chạy lại ngày hôm sau
⚠ Điều kiện VẪN thoả → chuyển về Cool
        ↓
⚠ Vòng lặp vô ích, và mỗi lần đổi tầng đều TỐN TIỀN
Điều cần hiểu Nội dung
⚠ Đổi tầng KHÔNG phải sửa nội dung
⚠ lastModified không đổi
⚠ Policy chạy MỖI NGÀY một lần
⚠ Chỉ ĐỌC blob cũng không đổi lastModified

Vì sao các phương án khác sai

  • B (Có, blob sẽ ở lại Hot) — ⚠ SAI: ⚠ chính sách sẽ đưa nó về lại.

Ghi nhớ

⚠ Ghi nhớ về chất lượng câu hỏi: ⚠ câu này ⚠ là ứng dụng sâu của kiến thức ở #19528.

Câu Hỏi gì Khoá
⚠ #19509 / #19536 / #19584 ⚠ đặc điểm các tầng ⚠ đánh đổi lưu và truy cập
⚠ #19528 ⚠ giảm chi phí 10TB log cũ ⚠ lifecycle policy
⚠ #21413 (câu này) ⚠ ghi đè policy bằng tay được không ⚠ KHÔNG — nó sẽ đảo lại
⚠ Bài học ⚠ policy tự động luôn thắng thao tác tay, trừ khi bạn sửa chính policy

⚠ Cách xử lý ĐÚNG khi có tệp cần ở Hot: | Cách | Nội dung | |---|---| | ⚠ Sửa policy để LOẠI TRỪ tệp đó | ⚠ theo tiền tố đường dẫn | | ⚠ Dùng blob index tag để lọc | ⚠ linh hoạt nhất | | ⚠ Đổi điều kiện sang lastAccessTime | ⚠ cần bật access tracking | | ⚠ Chuyển tệp sang container khác không áp policy | |

Từ khoá nhận diện:

"lifecycle policy đảo lại thao tác tay" → ⚠ phải sửa policy "theo thời gian truy cập cuối" → ⚠ lastAccessTime, cần bật tracking "lọc theo thẻ" → ⚠ blob index tags "loại trừ một thư mục" → ⚠ prefixMatch

⚠ lastAccessTime — giải pháp tốt hơn cho ca này Nội dung
⚠ Điều kiện theo lần TRUY CẬP cuối, không phải lần SỬA cuối
⚠ Tệp được đọc thường xuyên sẽ ở lại Hot
⚠ Phải bật access time tracking TRƯỚC
⚠ Chi phí ⚠ có phụ phí nhỏ cho việc theo dõi
⚠ Đây là ⚠ cách thiết kế policy đúng cho dữ liệu có mẫu truy cập không đều
⚠ Cạm bẫy chi phí khi đổi tầng qua lại Cạm bẫy
⚠ Mỗi lần chuyển tầng đều tính phí thao tác
⚠ Chuyển từ Cool ra trước 30 ngày còn bị PHẠT rút sớm
⚠ Vòng lặp Hot-Cool mỗi ngày rất tốn
⚠ Vì vậy ⚠ phát hiện sớm vòng lặp này rất quan trọng

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Policy dựa trên lastModified hay lastAccessTime | | | Có tệp nào đang bị chuyển tầng qua lại không | ⚠ kiểm tra metrics | | Có cần loại trừ thư mục nào khỏi policy không | |

Và bài học chung từ mọi hệ thống tự động hoá, thể hiện rất rõ ở câu hỏi này: thao tác tay không thắng được chính sách tự động — muốn thay đổi kết quả thì phải sửa chính sách.