{
  "10": {
    "stem": "Lưu ý: Câu hỏi này thuộc một nhóm câu có cùng bối cảnh nhưng mỗi câu có kết quả riêng. Xác định giải pháp có đáp ứng yêu cầu không.\n\nBạn chạy lệnh Register-AzureRmAutomationDscNode trong môi trường công ty.\nBạn cần đảm bảo các test server luôn được cấu hình đúng, kể cả khi xảy ra configuration drift.\nGiải pháp: Đặt tham số -ConfigurationMode thành ApplyAndAutocorrect.\nGiải pháp này có đáp ứng mục tiêu không?",
    "explanation": "Đáp án: Yes\n\nĐề dùng Register-AzureRmAutomationDscNode và cần test servers luôn đúng cấu hình dù có configuration drift. Solution đặt -ConfigurationMode thành ApplyAndAutocorrect.\n\nApplyAndAutocorrect vừa apply desired configuration vừa liên tục kiểm tra. Khi phát hiện drift, DSC engine tự đưa node về trạng thái mong muốn. Đây là mode đúng cho mục tiêu.\n\nApplyOnly chỉ apply một lần. ApplyAndMonitor chỉ ghi nhận drift. ApplyAndAutocorrect mới tự remediate.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Register-AzureRmAutomationDscNode\" + \"ApplyAndAutocorrect\" → Yes.\n"
  },
  "24": {
    "stem": "Bạn đã tạo Azure DevOps project cho ứng dụng mới sẽ deploy lên nhiều Azure virtual machine chạy Windows Server 2016.\nBạn cần giải pháp deploy giúp các VM giữ cấu hình đồng nhất và giảm tối đa công sức quản trị cấu hình VM.\nHai thành phần nào sau đây nên có trong giải pháp? (Chọn hai.)",
    "options": {
      "A": "Azure Resource Manager templates",
      "B": "PowerShell Desired State Configuration (DSC) extension for Windows",
      "C": "Azure pipeline deployment groups",
      "D": "Custom Script Extension for Windows",
      "E": "Azure pipeline stage templates"
    },
    "explanation": "Đáp án: Azure Resource Manager templates; The PowerShell Desired State Configuration (DSC) extension for Windows\n\nĐề deploy Windows Server 2016 Azure VMs, giữ uniform configuration và giảm administrative effort.\n\nARM templates mô tả infrastructure as code nên mỗi lần deploy VM đều cùng network, size và extension. PowerShell DSC extension enforce desired state bên trong guest (role, service, setting) và tự kéo về khi có drift.\n\nAzure pipeline deployment groups phục vụ cài app, không giữ guest configuration lâu dài. Custom Script Extension chạy script một lần, không continuous desired state. Azure pipeline stage templates tái sử dụng YAML stage, không cấu hình VM.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Windows Server 2016\" + \"uniform configuration\" + \"minimum administrative effort\" → ARM templates + PowerShell DSC extension.\n",
    "answerText": "A,B"
  },
  "25": {
    "stem": "Công ty có ứng dụng gồm nhiều Azure App Service web app và Azure Function.\nBạn muốn xem khuyến nghị bảo mật cho web app và function, và định vào mục Compute and Apps.\nBạn cần truy cập dịch vụ nào để dùng Compute and Apps?",
    "options": {
      "A": "Azure Log Analytics",
      "B": "Azure Event Hubs",
      "C": "Azure Advisor",
      "D": "Azure Security Center"
    },
    "explanation": "Đáp án: Azure Security Center\n\nĐề muốn xem security recommendations cho Azure App Service web apps và Azure Functions bằng cách vào Compute and Apps.\n\nCompute and Apps nằm trong Azure Security Center (Microsoft Defender for Cloud). Mục này liệt kê khuyến nghị bảo mật cho compute gồm web app và function.\n\nAzure Log Analytics phân tích log vận hành, không phải blade Compute and Apps. Azure Event Hubs là ingestion stream. Azure Advisor tập trung cost, performance và reliability, không phải security posture Compute and Apps.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Compute and Apps\" + \"security\" + \"web apps and functions\" → Azure Security Center.\n",
    "answerText": "D"
  },
  "28": {
    "stem": "Công ty dùng Azure SQL Database Intelligent Insights và Azure Application Insights để monitoring.\nBạn được giao phân tích monitoring bằng ad-hoc queries và cần chọn đúng query language.\nGiải pháp: Dùng Transact-SQL.\nGiải pháp này có đáp ứng mục tiêu không?",
    "explanation": "Đáp án: No\n\nĐề vẫn cần ad-hoc queries trên Intelligent Insights và Application Insights. Solution dùng Transact-SQL.\n\nT-SQL query relational data trên Azure SQL Database. Telemetry Application Insights nằm trên Azure Monitor Logs và query bằng KQL, không bằng T-SQL. Một ngôn ngữ T-SQL không cover cả hai nguồn monitoring như đề yêu cầu.\n\nKQL mới là ngôn ngữ ad-hoc cho Application Insights. Intelligent Insights cũng xem trên portal hoặc API Azure Monitor, không phải T-SQL thuần. Solution không đạt.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Application Insights\" + \"ad-hoc queries\" + \"Transact-SQL\" → No.\n"
  },
  "33": {
    "stem": "Bạn định tạo alert dựa trên page load performance của trang chủ.\nBạn có Application Insights log query như trong exhibit.\n\nDùng drop-down để chọn đáp án hoàn thành mỗi câu theo thông tin trong hình.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "boxes": {
      "1": {
        "label": "Để tạo alert theo trải nghiệm page load của đa số user, mức alerting phải dựa trên [answer choice].",
        "answer": "percentile_duration_95"
      },
      "2": {
        "label": "Để chỉ alert khi có authentication error trên server, query phải filter theo [answer choice].",
        "answer": "success"
      }
    },
    "answerText": "percentile_duration_95, success",
    "explanation": "Đáp án: percentile_duration_95; success\n\nĐề tạo alerts từ Application Insights query về page load của home page. Cần mức alert phản ánh trải nghiệm hầu hết user, và lọc khi authentication error xảy ra trên server.\n\npercentile_duration_95 phản ánh duration của hầu hết request, tránh outlier của max. Cột success (success == false) đánh dấu request thất bại, gồm lỗi authentication phía server.\n\nDùng average hoặc max duration không đại diện “most users”. Lọc theo name hay url không tách riêng authentication failure như success.\n\nKeywords phản xạ nhanh (AZ-400)\n\"page load experience of most users\" + \"authentication error\" → percentile_duration_95 + success.\n"
  },
  "34": {
    "options": {
      "A": "Azure Automation runbook",
      "B": "Azure Monitor alert có dynamic threshold",
      "C": "Azure Monitor alert có static threshold",
      "D": "Azure Monitor autoscale settings",
      "E": "Azure Monitor alert dùng action group có email action"
    },
    "answerText": "A,B",
    "explanation": "Đáp án: an Azure Automation runbook; an Azure Monitor alert that has a dynamic threshold\n\nĐề tăng logging level khi web app vượt normal usage patterns, đồng thời giảm administrative overhead.\n\nDynamic threshold học baseline usage theo ngày và tuần, phát hiện lệch khỏi “normal” mà không chỉnh threshold tay. Alert kích hoạt action group gọi Azure Automation runbook để đổi logging level.\n\nStatic threshold dễ false positive khi traffic biến thiên. Autoscale đổi số instance, không đổi logging. Email action chỉ thông báo, không tự tăng logging.\n\nKeywords phản xạ nhanh (AZ-400)\n\"exceeds normal usage patterns\" + \"increase the logging level\" → dynamic threshold alert + Automation runbook.\n"
  },
  "35": {
    "boxes": {
      "1": {
        "answer": "livenessProbe:"
      },
      "2": {
        "answer": "periodSeconds: 15"
      }
    },
    "answerText": "livenessProbe:, periodSeconds: 15",
    "explanation": "Đáp án: livenessProbe:; periodSeconds: 15\n\nTheo keys, cần hoàn thiện YAML health probe: khai báo livenessProbe và chu kỳ periodSeconds: 15.\n\nlivenessProbe cho runtime biết container còn sống; fail thì restart. periodSeconds: 15 nghĩa là kubelet (hoặc ACI) gọi probe mỗi 15 giây.\n\nreadinessProbe chỉ quyết định nhận traffic, không restart. Không khai báo periodSeconds thì dùng mặc định, không khớp giá trị 15 trong đáp án.\n\nKeywords phản xạ nhanh (AZ-400)\n\"livenessProbe\" + \"periodSeconds\" → livenessProbe: + periodSeconds: 15.\n"
  },
  "40": {
    "stem": "Công ty đang xây web application mới.\nBạn định thu thập feedback từ pilot user về các tính năng đang deliver.\nPilot user dùng máy corporate có Google Chrome và extension Microsoft Test & Feedback, test app bằng Chrome.\nBạn cần xác định access level trong Azure DevOps để developer có thể request và thu feedback từ pilot user, theo nguyên tắc least privilege.\nChọn access level phù hợp trong answer area.",
    "explanation": "Đáp án: Developers: Basic; Pilot users: Stakeholder\n\nĐề thu feedback từ pilot users dùng Chrome và Microsoft Test & Feedback extension. Cần access levels least privilege để developers request và gather feedback.\n\nBasic cho developers quyền tạo request feedback và làm việc với work items. Stakeholder đủ để pilot users xem request và gửi feedback, không cần license Basic.\n\nStakeholder cho developers thì thiếu quyền request đầy đủ. Basic cho pilot users vượt least privilege. Visual Studio Enterprise không được hỏi và không cần cho tester.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Test & Feedback\" + \"least privilege\" + \"pilot users\" → Basic + Stakeholder.\n",
    "boxes": {
      "1": {
        "label": "Developers:",
        "answer": "Basic"
      },
      "2": {
        "label": "Pilot users:",
        "answer": "Stakeholder"
      }
    },
    "answerText": "Basic, Stakeholder"
  },
  "42": {
    "options": {
      "A": "Azure Logic Apps",
      "B": "Azure Pipelines",
      "C": "Microsoft Visual Studio App Center",
      "D": "Azure DevOps Project",
      "E": "Azure Application Insights"
    },
    "answerText": "A,E",
    "explanation": "Đáp án: Azure Logic Apps; Azure Application Insights\n\nĐề recommend giải pháp tự gửi daily summary exceptions của web application tới Microsoft Teams.\n\nApplication Insights chứa exceptions. Logic Apps schedule hàng ngày, query rồi gửi Teams.\n\nAzure Pipelines làm CI/CD, không tóm tắt exception theo lịch. Visual Studio App Center dành mobile. Azure DevOps Project chỉ bootstrap project. Cặp đúng là Logic Apps và Application Insights.\n\nKeywords phản xạ nhanh (AZ-400)\n\"daily summary of the exceptions\" + \"Microsoft Teams\" → Azure Logic Apps + Azure Application Insights.\n"
  },
  "45": {
    "options": {
      "A": "Sửa load balancer settings của VMSS1.",
      "B": "Redeploy VMSS1.",
      "C": "Upload custom script file lên sa1.",
      "D": "Sửa Custom Script extension settings của VMSS1.",
      "E": "Cập nhật configuration của một virtual machine trong VMSS1."
    },
    "answerText": "C,D,E",
    "explanation": "Đáp án: Upload a custom script file to sa1; Modify the Custom Script extension settings of VMSS1; Update the configuration of a virtual machine in VMSS1\n\nĐề WebApp1 trên VMSS1 dùng Custom Script extension từ storage sa1, session stateful. Cần limited user testing bản UI mới.\n\nUpload script mới lên sa1. Cập nhật Custom Script extension settings của VMSS1 để trỏ hoặc chạy script mới. Update configuration của một VM trong scale set để chỉ một phần instance chạy bản mới cho limited testing.\n\nModify load balancer settings phục vụ A/B traffic rộng, không bắt buộc. Redeploy toàn bộ VMSS1 quá mức cho thay đổi UI nhỏ và limited test.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Custom Script extension\" + \"limited user testing\" + \"VMSS1\" → upload script to sa1 + modify extension + update a VM configuration.\n"
  },
  "51": {
    "stem": "Bạn monitor health và performance của Azure web app bằng Azure Application Insights.\nBạn cần gửi alert khi web app có đột biến performance issues và failures.\nBạn nên dùng gì?",
    "options": {
      "A": "custom events",
      "B": "Application Insights Profiler",
      "C": "usage analysis",
      "D": "Smart Detection",
      "E": "Continuous export"
    },
    "explanation": "Đáp án: Smart Detection\n\nĐề monitor web app bằng Application Insights và cần alert khi có sudden rise về performance issues và failures.\n\nSmart Detection học baseline rồi tự gửi notification khi failure rate hoặc performance lệch đột ngột, không cần viết rule tay.\n\nCustom events chỉ ghi sự kiện bạn emit. Application Insights Profiler bắt sample chậm, không tự alert anomaly. Usage analysis phân tích hành vi user. Continuous export chỉ đẩy data ra ngoài, không alert.\n\nKeywords phản xạ nhanh (AZ-400)\n\"sudden rise in performance issues and failures\" → Smart Detection.\n",
    "answerText": "D"
  },
  "52": {
    "stem": "HOTSPOT —\nBạn có Azure DevOps project Contoso App chứa pipeline Azure Pipelines cho GitHub repositories.\nBạn cần developer nhận Microsoft Teams notification khi pipeline của Contoso App fail.\nBạn nên chạy lệnh gì trong Teams? Chọn option phù hợp trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: subscribe; https://dev.azure.com/contoso/contoso-app/\n\nĐề developers nhận Microsoft Teams notifications khi pipeline của project Contoso App fail.\n\nTrong channel đã cài Azure Pipelines app, lệnh @azure pipelines subscribe kèm project URL đăng ký sự kiện pipeline. URL https://dev.azure.com/contoso/contoso-app/ trỏ đúng project Contoso App.\n\nLệnh unsubscribe gỡ đăng ký. URL organization gốc không chỉ đúng project. subscribe kèm pipeline URL cụ thể cũng được, nhưng keys chọn project URL.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Microsoft Teams notifications\" + \"failures in a pipeline\" → @azure pipelines subscribe + project URL.\n",
    "boxes": {
      "1": {
        "answer": "subscribe"
      },
      "2": {
        "answer": "https://dev.azure.com/contoso/contoso-app/"
      }
    },
    "answerText": "subscribe, https://dev.azure.com/contoso/contoso-app/"
  },
  "56": {
    "options": {
      "A": "lần thử xóa resource ASP-9bb7 thất bại",
      "B": "thay đổi role assignment cho resource ASP-9bb7",
      "C": "lần thử xóa resource ASP-9bb7 thành công",
      "D": "lần thử scale up resource ASP-9bb7 thất bại"
    },
    "answerText": "A",
    "explanation": "Đáp án: a failed attempt to delete the ASP-9bb7 resource\n\nĐề có alert rule Azure Monitor (exhibit). Keys chọn failed attempt to delete ASP-9bb7.\n\nRule kiểu Activity Log, category Administrative, operation Delete, status Failed trên resource ASP-9bb7 sẽ fire khi xóa thất bại.\n\nChange to a role assignment là operation khác. Successful delete không khớp status Failed. Failed scale-up là operation Microsoft.Web/serverFarms/scale, không phải delete.\n\nKeywords phản xạ nhanh (AZ-400)\n\"alert rule\" + \"Administrative\" + \"delete\" → failed attempt to delete the resource.\n"
  },
  "58": {
    "stem": "HOTSPOT —\nBạn dùng Azure DevOps quản lý build và deployment của app App1.\nBạn có release pipeline deploy virtual machine VM1.\nBạn định monitor release pipeline bằng Azure Monitor.\nBạn cần tạo alert monitor performance VM1: trigger khi average CPU usage vượt 70% trong năm phút, tính average mỗi phút một lần.\nCấu hình alert rule thế nào? Chọn option trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: 5 minutes; Static; Greater than\n\nĐề alert khi average CPU của VM1 vượt 70 percent trong năm phút, tính average mỗi phút.\n\nAggregation granularity (Period) 5 minutes là cửa sổ đánh giá. Threshold type Static vì ngưỡng cố định 70 percent. Operator Greater than vì vượt ngưỡng mới fire.\n\nDynamic threshold không dùng số 70 cố định. Less than đảo điều kiện. Period 1 minute chỉ là tần suất đánh giá, không phải cửa sổ năm phút.\n\nKeywords phản xạ nhanh (AZ-400)\n\"average CPU usage exceeds 70 percent for five minutes\" → 5 minutes + Static + Greater than.\n",
    "boxes": {
      "1": {
        "answer": "5 minutes"
      },
      "2": {
        "answer": "Static"
      },
      "3": {
        "answer": "Greater than"
      }
    },
    "answerText": "5 minutes, Static, Greater than"
  },
  "63": {
    "stem": "Bạn có GitHub repository chứa source code của app App1.\nBạn cần tạo process documentation cho App1, gồm diagram thể hiện quan hệ giữa các phase như trong exhibit.\nHoàn thành markdown code thế nào? Kéo giá trị phù hợp vào target. Mỗi giá trị dùng một lần, nhiều lần hoặc không dùng.",
    "explanation": "Đáp án: stateDiagram; Processing\n\nĐề hoàn thiện Mermaid markdown cho diagram các phases của App1.\n\nstateDiagram (hoặc stateDiagram-v2) khai báo loại diagram. Processing là state trung gian trong transition tới Successful, khớp exhibit.\n\nflowchart hay sequenceDiagram không phải cú pháp state. Sai tên state thì mũi tên không khớp exhibit. Keys chọn stateDiagram và Processing.\n\nKeywords phản xạ nhanh (AZ-400)\n\"mermaid\" + \"phases of App1\" → stateDiagram + Processing.\n",
    "boxes": {
      "1": {
        "answer": "stateDiagram"
      },
      "2": {
        "answer": "Processing"
      }
    },
    "answerText": "stateDiagram, Processing"
  },
  "64": {
    "explanation": "Đáp án: Modify ApplicationInsights.config.; Modify the Usage and estimated costs settings.\n\nĐề đổi sampling rate telemetry của AppInsights1 mà không redeploy webapp1 mỗi lần sửa.\n\nUsage and estimated costs trên resource Application Insights chỉnh ingestion sampling ở service, không cần redeploy. Cặp keys cũng gồm sửa ApplicationInsights.config trong repo cho cấu hình SDK-side.\n\nChỉ Continuous export không đổi sampling. Đổi Startup.cs rồi deploy thì trái “without having to redeploy” nếu đó là cách duy nhất. Portal Usage and estimated costs là phần không redeploy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"sampling rate\" + \"without having to redeploy\" → Usage and estimated costs (và ApplicationInsights.config theo keys).\n",
    "boxes": {
      "1": {
        "label": "Từ code repository của webapp1:",
        "answer": "Modify ApplicationInsights.config."
      },
      "2": {
        "label": "Từ AppInsights1:",
        "answer": "Modify the Usage and estimated costs settings."
      }
    },
    "answerText": "Modify ApplicationInsights.config., Modify the Usage and estimated costs settings."
  },
  "68": {
    "stem": "Bạn có web app App1 dùng Application Insights trong Azure Monitor.\nBạn cần so sánh CPU usage theo giờ của App1 trong 24 giờ qua; biểu đồ phải có threshold line ở 75%.\nHoàn thành query thế nào? Kéo giá trị vào target.",
    "explanation": "Đáp án: bin(TimeGenerated, 1d); render\n\nTheo keys, hoàn thiện query so sánh CPU và vẽ graph có threshold.\n\nbin(TimeGenerated, 1d) gom điểm theo ngày (keys dùng 1d). render vẽ timechart; exhibit thường thêm threshold 75 percent.\n\nsummarize không có bin thì không chuỗi thời gian đều. print không vẽ graph. Keys chỉ định bin và render.\n\nKeywords phản xạ nhanh (AZ-400)\n\"graph\" + \"threshold line\" + \"CPU usage\" → bin(TimeGenerated, 1d) + render.\n",
    "boxes": {
      "1": {
        "answer": "bin(TimeGenerated, 1d)"
      },
      "2": {
        "answer": "render"
      }
    },
    "answerText": "bin(TimeGenerated, 1d), render"
  },
  "70": {
    "stem": "Bạn có Azure virtual machine tên web1.\nBạn cần query lượng free memory available trên web1 trong 7 ngày qua, với yêu cầu:\n• Hiển thị dạng time chart.\n• Tính average mỗi giờ.\nHoàn thành KQL query thế nào? Chọn option trong answer area.",
    "explanation": "Đáp án: TimeGenerated > ago(7d); bin(TimeGenerated 1h)\n\nĐề query free memory trên web1 bảy ngày, time chart, average mỗi giờ.\n\nwhere TimeGenerated > ago(7d) giới hạn bảy ngày. bin(TimeGenerated, 1h) (keys viết thiếu dấu phẩy) gom average theo giờ rồi render timechart.\n\nago(1d) không đủ bảy ngày. bin 1d cho average theo ngày, không phải per hour.\n\nKeywords phản xạ nhanh (AZ-400)\n\"past seven days\" + \"average value per hour\" → TimeGenerated > ago(7d) + bin(TimeGenerated, 1h).\n",
    "boxes": {
      "1": {
        "answer": "TimeGenerated > ago(7d)"
      },
      "2": {
        "answer": "bin(TimeGenerated 1h)"
      }
    },
    "answerText": "TimeGenerated > ago(7d), bin(TimeGenerated 1h)"
  },
  "72": {
    "stem": "Bạn có project trong Azure DevOps.\nBạn cần cấu hình dashboard gồm các metric:\n• Bottleneck trong quy trình phát triển phần mềm\n• Burndown chart cho work trong một iteration\n• Thời gian đóng work item sau khi item đã được bắt đầu\nWidget nào dùng cho từng metric? Kéo widget type vào metric tương ứng.",
    "explanation": "Đáp án: Cumulative flow diagram (CFD); Cycle time; Sprint burndown\n\nĐề dashboard: bottlenecks trong process, thời gian close work item sau khi started, burndown một iteration.\n\nCFD nhìn chỗ work ứ theo state, đó là bottleneck. Cycle time đo từ lúc started đến closed. Sprint burndown là burndown của một iteration.\n\nLead time tính từ lúc tạo item. Velocity đếm story points xong. Release burndown phủ nhiều sprint, không phải single iteration.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Bottlenecks\" + \"after the item was started\" + \"single iteration\" → CFD + Cycle time + Sprint burndown.\n",
    "boxes": {
      "1": {
        "label": "Bottleneck trong quy trình phát triển phần mềm:",
        "answer": "Cumulative flow diagram (CFD)"
      },
      "2": {
        "label": "Thời gian đóng work item sau khi item đã được bắt đầu:",
        "answer": "Cycle time"
      },
      "3": {
        "label": "Burndown chart cho work trong một iteration:",
        "answer": "Sprint burndown"
      }
    },
    "answerText": "Cumulative flow diagram (CFD), Cycle time, Sprint burndown"
  },
  "75": {
    "stem": "Bạn có Azure DevOps project gồm hai user User1 và User2.\nBạn định dùng Azure Monitor quản lý logs.\nBạn cần đảm bảo user thực hiện được các action trong bảng (exhibit).",
    "explanation": "Đáp án: User1: Monitoring Contributor; User2: Monitoring Reader\n\nĐề hai user thực hiện actions khác nhau trên Azure Monitor logs (bảng trong đề). Cần role phù hợp.\n\nMonitoring Contributor cho User1 quyền đọc và thay đổi cấu hình monitoring (alert, settings). Monitoring Reader cho User2 chỉ xem metrics, logs và alert.\n\nOwner quá rộng. Contributor trên subscription vượt least privilege. Monitoring Reader cho User1 sẽ thiếu quyền ghi nếu bảng yêu cầu tạo hoặc sửa.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Monitor\" + \"User1\" + \"User2\" → Monitoring Contributor + Monitoring Reader.\n",
    "boxes": {
      "1": {
        "label": "User1:",
        "answer": "Monitoring Contributor"
      },
      "2": {
        "label": "User2:",
        "answer": "Monitoring Reader"
      }
    },
    "answerText": "Monitoring Contributor, Monitoring Reader"
  },
  "80": {
    "stem": "Truy cập https://dev.azure.com, chọn Start Free và đăng nhập:\n• User: [email protected]\n• Password: 0123456789\nDùng cài đặt mặc định đăng ký Azure DevOps và tạo organization. Sau đó tạo private project tên Project1.\nBạn cần thêm external user [email protected] làm stakeholder của organization User1-12345678.\nUser phải thuộc Azure DevOps group hạn chế nhất.\nHoàn thành task: đăng nhập Azure DevOps portal với [email protected].",
    "explanation": "Đáp án: Thêm user ngoài với access level Stakeholder vào group hạn chế nhất.\n\nĐề tạo org, private Project1, thêm user@ ngoài làm stakeholder, group restrictive nhất.\n\nOrganization Settings, Users, Add users, email ngoài, Access level Stakeholder, thêm vào Project Readers hoặc group hạn chế tương đương.\n\nBasic hoặc Visual Studio subscription vượt “most restrictive”. Project Administrators quá rộng. Không mời user thì không vào được org.\n\nKeywords phản xạ nhanh (AZ-400)\n\"external user\" + \"stakeholder\" + \"most restrictive\" → Stakeholder + Readers.\n"
  },
  "81": {
    "stem": "Với resource group RG1lod12345678, tạo action group tên DevOpsAG có thể trigger từ mọi region qua Alerts.\nAction group phải email [email protected] và [email protected], đồng thời notify thành viên role Owner của resource.\nChỉ dùng common alert schema khi notify resource owners.",
    "explanation": "Đáp án: Action group DevOpsAG trong RG1lod12345678, email hai user, notify Owner bằng common alert schema, region any.\n\nĐề action group kích hoạt từ mọi region, email hai địa chỉ và Owner của resource, chỉ common alert schema cho owners.\n\nMonitor, Alerts, Action groups, Create, name DevOpsAG, global/any region, Email actions, ARM Role Owner với Use common alert schema.\n\nChỉ email không notify Owner. Action group local một region trái “any region”. Tắt common alert schema trái yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"action group\" + \"any region\" + \"Owner\" + \"common alert schema\" → DevOpsAG email + ARM Role Owner.\n"
  },
  "82": {
    "stem": "Viết KQL query đếm số inbound request theo từng source IP, cho mọi kết nối trong ba tháng cuối năm 2021.\nDùng Azure Data Explorer: https://dataexplorer.azure.com/clusters/help/databases/SecurityLogs\nRequest nằm trong bảng InboundBrowsing, database SecurityLogs.\nQuery trả về hai cột NumberOfRequests và SourceIP. Export kết quả ra C:\\Samples.",
    "explanation": "Đáp án: KQL trên InboundBrowsing, last three months of 2021, NumberOfRequests và SourceIP, export C:\\Samples\n\nĐề đếm inbound requests theo source IP trong quý 4 năm 2021 trên cluster help, database SecurityLogs.\n\nInboundBrowsing | where TimeGenerated between datetime 2021-10-01 và 2021-12-31 | summarize NumberOfRequests = count() by SourceIP. Export kết quả ra C:\\Samples.\n\nThiếu between 2021 Q4 sẽ sai cửa sổ. Đặt tên cột khác NumberOfRequests hoặc SourceIP không khớp đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"InboundBrowsing\" + \"last three months of 2021\" + \"NumberOfRequests\" → summarize count() by SourceIP.\n"
  },
  "83": {
    "stem": "Bạn có Azure subscription chứa nhiều web app.\nBạn cần bật Change Analysis cho các web app.\nHoàn thành script thế nào? Chọn option trong answer area.",
    "explanation": "Đáp án: Register-AzResourceProvider -ProviderNamespace; Set-AzResource -ResourceId\n\nĐề enable Change Analysis cho nhiều web apps bằng script.\n\nRegister-AzResourceProvider -ProviderNamespace Microsoft.ChangeAnalysis đăng ký provider. Set-AzResource -ResourceId $webapp.Id -Tag $tags -Force gắn tag kích hoạt Change Analysis trên từng web app.\n\nRegister-AzProviderFeature không phải cmdlet trong keys. Update-AzTag khác chữ ký. New-AzResource tạo resource mới, không enable Change Analysis trên web app có sẵn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Change Analysis\" + \"Microsoft.ChangeAnalysis\" → Register-AzResourceProvider + Set-AzResource.\n",
    "boxes": {
      "1": {
        "answer": "Register-AzResourceProvider -ProviderNamespace"
      },
      "2": {
        "answer": "Set-AzResource -ResourceId"
      }
    },
    "answerText": "Register-AzResourceProvider -ProviderNamespace, Set-AzResource -ResourceId"
  },
  "84": {
    "options": {
      "A": "Bật Azure Security Center",
      "B": "Tạo và cấu hình Azure Monitor alert rule",
      "C": "Tạo Azure Service Health alert",
      "D": "Tạo và cấu hình action group"
    },
    "answerText": "C,D",
    "explanation": "Đáp án: Create an Azure Service Health alert.; Create and configure an action group.\n\nĐề gửi SMS khi scheduled maintenance được lên kế hoạch cho Azure services.\n\nService Health alert loại Planned maintenance. Action group có SMS (và email nếu cần) nhận thông báo.\n\nEnable Azure Security Center không báo maintenance. Azure Monitor metric alert theo CPU hay request, không biết lịch bảo trì platform.\n\nKeywords phản xạ nhanh (AZ-400)\n\"SMS alert\" + \"scheduled maintenance\" → Service Health alert + action group.\n"
  },
  "85": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario, mỗi câu một giải pháp; có thể không có đáp án đúng. Không quay lại câu trước.\n\nBạn có Azure DevOps organization Contoso và Azure subscription. Subscription có VMSS1 bật autoscaling.\nProject1 build web app App1 và deploy lên VMSS1.\nBạn cần email alert mỗi khi VMSS1 scale in hoặc scale out.\nGiải pháp: Từ Azure Monitor, cấu hình autoscale settings.\nGiải pháp này có đáp ứng mục tiêu không?",
    "explanation": "Đáp án: No\n\nĐề cần email alert khi VMSS1 scale (stem series Contoso, App1 trên VMSS1). Solution chỉ cấu hình autoscale settings trong Azure Monitor để gửi email.\n\nAutoscale settings đổi số instance theo metric. Settings đó không gửi email khi scale in hoặc scale out. Cần Activity Log alert hoặc action riêng.\n\nChỉ bật autoscale không đạt “email alert is generated” khi scaling. Solution không meet goal.\n\nKeywords phản xạ nhanh (AZ-400)\n\"email alert\" + \"autoscaling\" + \"autoscale settings\" → No.\n"
  },
  "86": {
    "stem": "Bạn cấu hình Azure Application Insights và shared service plan tier cho web app.\nBạn bật Smart Detection, thấy standard metrics trong logs, nhưng khi test failure không nhận Smart Detection notification.\nĐiều gì ngăn notification được gửi?",
    "options": {
      "A": "Phải bật Snapshot Debugger cho web app",
      "B": "Smart Detection dùng 24 giờ đầu để thiết lập normal behavior của web app",
      "C": "Web app dùng shared service plan tier",
      "D": "Phải restart web app trước khi bật Smart Detection"
    },
    "answerText": "B",
    "explanation": "Đáp án: Smart Detection uses the first 24 hours to establish the normal behavior of the web app\n\nĐề đã bật Smart Detection, thấy standard metrics, test failure nhưng không nhận notification.\n\nSmart Detection cần khoảng 24 giờ học baseline. Trong learning period, failure chủ động thường không tạo Smart Detection notification.\n\nSnapshot Debugger không liên quan learning. Shared service plan không chặn Smart Detection. Restart web app không bắt buộc để Smart Detection gửi notify.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Smart Detection\" + \"do not receive a notification\" → first 24 hours to establish normal behavior.\n"
  },
  "87": {
    "stem": "Các khách hàng đều dùng Azure DevOps cho work item management.\nWork item process nào dùng cho từng khách hàng? Kéo process vào khách hàng tương ứng.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: Litware: Scrum; Contoso: Agile; A. Datum: CMMI\n\nĐề chọn work item process cho từng customer (bảng trong exhibit).\n\nScrum phù hợp team theo sprint, PBI và bug trên backlog. Agile phù hợp user story, tách development và test. CMMI phù hợp process formal với requirement, change request, risk và review.\n\nBasic quá tối giản cho cả ba. Gán CMMI cho team Scrum làm thừa formal. Phải map đúng Scrum, Agile, CMMI theo keys.\n\nKeywords phản xạ nhanh (AZ-400)\n\"work item process\" + \"Litware / Contoso / A. Datum\" → Scrum + Agile + CMMI.\n",
    "boxes": {
      "1": {
        "label": "Litware:",
        "answer": "Scrum"
      },
      "2": {
        "label": "Contoso:",
        "answer": "Agile"
      },
      "3": {
        "label": "A. Datum:",
        "answer": "CMMI"
      }
    },
    "answerText": "Scrum, Agile, CMMI"
  },
  "92": {
    "stem": "SIMULATION —\nĐảm bảo Microsoft Visual Studio 2017 có thể remote attach vào Azure Function fa11566895.\nHoàn thành task: đăng nhập Microsoft Azure portal.",
    "explanation": "Đáp án: Bật Remote Debugging On, Visual Studio version 2017 trên function app.\n\nĐề Visual Studio 2017 remotely attach tới Azure Function fa11566895.\n\nPortal, function app, Configuration / Application settings, Debugging: Remote Debugging On, Remote Visual Studio version 2017.\n\nTắt Remote Debugging thì VS không attach. Chọn version Visual Studio khác 2017 không khớp đề. Chỉ mở inbound NSG không thay setting Debugging của Function.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Visual Studio 2017\" + \"remotely attach\" + \"Azure Function\" → Remote Debugging On + version 2017.\n",
    "answerText": "Bật Remote Debugging:\n1. Azure portal → function app fa-11566895\n2. Application settings\n3. Debugging: Remote Debugging = On, Remote Visual Studio version = 2017"
  },
  "95": {
    "options": {
      "A": "Thêm <InitialSamplingPercentage>99</InitialSamplingPercentage> vào ApplicationInsights.config.",
      "B": "Trong code application, bật adaptive sampling.",
      "C": "Trong code application, thêm Azure Application Insights telemetry.",
      "D": "Thêm <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond> vào ApplicationInsights.config.",
      "E": "Trong code application, tắt adaptive sampling."
    },
    "answerText": "C,E",
    "explanation": "Đáp án: From the code of the application, add Azure Application Insights telemetry; From the code of the application, disable adaptive sampling.\n\nĐề ASP.NET Core, capture telemetry để tạo utilization baseline, minimize storage cost về lâu dài nhưng keys chọn add telemetry và disable adaptive sampling.\n\nPhải thêm Application Insights SDK thì mới có telemetry. Disable adaptive sampling trong giai đoạn baseline để mẫu đủ, không bị SDK bỏ bớt.\n\nApplicationInsights.config không phải file chính của ASP.NET Core. Enable adaptive sampling lúc baseline làm dữ liệu thưa. MaxTelemetryItemsPerSecond giảm volume nhưng keys không chọn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ASP.NET Core\" + \"telemetry\" + \"baseline\" → add Application Insights telemetry + disable adaptive sampling.\n"
  },
  "97": {
    "stem": "Bạn có application App1 với custom domain app.contoso.com.\nBạn tạo test trong Azure Application Insights như exhibit.\nDùng drop-down hoàn thành mỗi câu theo thông tin trong hình.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: every five minutes per location; all the HTML JavaScripts and images of App1 load\n\nĐề đọc exhibit availability test của App1 (app.contoso.com).\n\nTest chạy mỗi năm phút tại mỗi location đã chọn. Khi Parse dependent requests bật, test pass nếu HTML, JavaScript và images load trong 30 giây.\n\nChỉ HTTP 200 cho document gốc thì thiếu dependent resources. Tần suất khác năm phút không khớp exhibit.\n\nKeywords phản xạ nhanh (AZ-400)\n\"availability test\" + \"30 seconds\" → every five minutes per location + HTML JavaScripts and images load.\n",
    "boxes": {
      "1": {
        "label": "Test sẽ execute [answer choice].",
        "answer": "every five minutes per location"
      },
      "2": {
        "label": "Test pass nếu [answer choice] trong 30 giây.",
        "answer": "all the HTML JavaScripts and images of App1 load"
      }
    },
    "answerText": "every five minutes per location, all the HTML JavaScripts and images of App1 load"
  },
  "98": {
    "options": {
      "A": "Đặt Flaky test detection = Off.",
      "B": "Bỏ chọn Flaky tests included in test pass percentage.",
      "C": "Bật Test Impact Analysis (TIA).",
      "D": "Đánh dấu thủ công test là flaky.",
      "E": "Bật test slicing."
    },
    "answerText": "B,D",
    "explanation": "Đáp án: Clear Flaky tests included in test pass percentage.; Manually mark the test as flaky\n\nĐề build thỉnh thoảng fail vì test đo response time API. Cần ngăn pipeline fail vì test đó.\n\nMark test là flaky. Clear tùy chọn đưa flaky tests vào test pass percentage để fail flaky không kéo sập pass rate và build.\n\nSet Flaky test detection Off mất khả năng quản lý flaky. Test Impact Analysis chỉ chọn test liên quan code. Test slicing chạy song song, vẫn fail nếu test fail.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prevent the build pipeline from failing\" + \"flaky\" → mark as flaky + exclude from pass percentage.\n"
  },
  "100": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario; không quay lại câu trước.\n\nBạn quản lý project trong Azure DevOps.\nBạn cần ngăn configuration của project thay đổi theo thời gian.\nGiải pháp: Thực hiện Subscription Health scan khi packages được tạo.\nGiải pháp này có đáp ứng mục tiêu không?",
    "explanation": "Đáp án: No\n\nĐề ngăn configuration của Azure DevOps project thay đổi theo thời gian. Solution: Subscription Health scan khi packages được tạo.\n\nSubscription Health scan kiểm tra sức khỏe subscription Azure (quota, service issues), không khóa project settings, pipelines hay permissions của Azure DevOps.\n\nĐể ổn định configuration project cần branch policies, permissions, audit hoặc IaC cho DevOps. Scan lúc tạo packages không meet goal.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prevent the configuration of the project from changing\" + \"Subscription Health scan\" → No.\n"
  },
  "101": {
    "stem": "Công ty dùng các resource sau:\n• Windows Server 2019 container images trong Azure Container Registry\n• Azure virtual machine chạy Ubuntu mới nhất\n• Azure Log Analytics workspace\n• Azure Active Directory (Azure AD)\n• Azure key vault\n\nHai resource nào nhận được vulnerability assessment trong Azure Security Center? Mỗi đáp án đúng là một phần.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "options": {
      "A": "Azure Log Analytics workspace",
      "B": "Azure key vault",
      "C": "Azure virtual machine chạy Ubuntu mới nhất",
      "D": "Azure Active Directory (Azure AD)",
      "E": "Windows Server 2019 container images trong Azure Container Registry"
    },
    "explanation": "Đáp án: C, E\n\nĐề bài hỏi hai tài nguyên nào nhận được vulnerability assessment từ Azure Security Center (Microsoft Defender for Cloud).\n\nC đúng vì Defender for Cloud đánh giá security posture của Azure virtual machines, gồm Ubuntu: lỗ hổng hệ điều hành, gói phần mềm và cấu hình, thường qua agent và CVE. E đúng vì Defender for Cloud quét container images trong Azure Container Registry trước khi deploy: base image, packages và application code.\n\nA sai vì Log Analytics workspace là nơi lưu và phân tích log, không phải đối tượng vulnerability assessment compute/container. B sai vì Key Vault quản lý secrets/keys, không nằm trong Vulnerability Assessment cho VM/container image. D sai vì Azure AD là identity service; Defender không quét Azure AD như quét VM hay ACR images.\n\nKeywords phản xạ nhanh (AZ-400)\n\"vulnerability assessments\" + \"Security Center\" → Ubuntu VMs + ACR container images.\n",
    "answerText": "C, E"
  },
  "102": {
    "stem": "Bạn dùng Azure Pipelines cho build, GitHub lưu source code, Dependabot quản lý dependencies.\nApp App1 có dependency cần update do Dependabot phát hiện.\nBước đầu tiên để apply update là gì?",
    "options": {
      "A": "Create a pull request.",
      "B": "Approve the pull request",
      "C": "Create a branch",
      "D": "Perform a commit"
    },
    "explanation": "Đáp án: B — Approve the pull request\n\nĐề bài: Dependabot đã phát hiện dependency trên App1 cần update. Hỏi việc đầu tiên để áp dụng update.\n\nDependabot tự tạo pull request chứa thay đổi version. Việc bạn làm trước tiên là review rồi approve PR đó để xác nhận update an toàn trước khi merge vào codebase.\n\nA sai vì Dependabot đã tạo PR; bạn không tạo PR thủ công. C sai vì Dependabot đã tạo branch cho PR. D sai vì commit đã nằm trong PR tự động; commit thêm không phải bước đầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Dependabot\" + \"dependency update\" → Approve the pull request (Dependabot already created it).\n",
    "answerText": "B"
  },
  "103": {
    "stem": "Bạn quản lý project trong Azure DevOps.\nBạn cần ngăn configuration của project thay đổi theo thời gian.\nGiải pháp: Thêm bước code coverage vào build pipelines.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề bài muốn ngăn configuration của Azure DevOps project thay đổi theo thời gian. Giải pháp đề xuất: thêm bước code coverage vào build pipelines.\n\nGiải pháp không đạt mục tiêu. Code coverage chỉ đo mức độ source code được test. Nó không khóa, version hay kiểm soát project configuration như build definitions, release pipelines, variable groups, service connections, permissions hay process customization.\n\nYes (A) sai vì thêm coverage không ngăn configuration drift. Để đạt mục tiêu cần Infrastructure as Code cho Azure DevOps, RBAC chặt, change management, approvals và audit logging.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prevent project configuration from changing\" + \"code coverage\" → No.\n",
    "answerText": "B"
  },
  "108": {
    "options": {
      "A": "Telegraf agent",
      "B": "Azure Log Analytics agent",
      "C": "Azure Network Watcher Agent for Windows",
      "D": "Dependency agent"
    },
    "answerText": "B, D",
    "explanation": "Đáp án: B, D\n\nĐề bài cần thu thập dữ liệu chi tiết về processes trong guest OS của Windows Server VM để monitor baseline metrics.\n\nAzure Log Analytics agent (Microsoft Monitoring Agent / Azure Monitor Agent theo thế hệ) thu thập events, performance counters và logs gửi Log Analytics workspace. Dependency agent khám phá processes, services và application dependencies, gắn Service Map / VM insights.\n\nA sai vì Telegraf không phải cặp agent native chính cho process-level trên Azure Monitor trong đề này. C sai vì Network Watcher Agent tập trung network capture và connectivity, không chi tiết processes trong guest OS.\n\nKeywords phản xạ nhanh (AZ-400)\n\"processes\" + \"guest OS\" + Windows VM → Log Analytics agent + Dependency agent.\n"
  },
  "114": {
    "stem": "Bạn có Azure subscription liên kết Azure AD Premium Plan 1 tenant.\nSecurity review cho thấy quá nhiều user có privileged access.\nBạn cần triển khai privileged access management với:\n• Giới hạn thời gian dùng privileged access\n• Yêu cầu approval khi kích hoạt privileged access\n• Tối thiểu chi phí\n\nBước đầu tiên nên làm gì?",
    "options": {
      "A": "Cấu hình notification khi privileged roles được kích hoạt",
      "B": "Cấu hình alert khi kích hoạt privileged roles",
      "C": "Bắt buộc Azure MFA khi kích hoạt role",
      "D": "Nâng cấp license Azure AD tenant."
    },
    "explanation": "Đáp án: D — Upgrade the license of the Azure AD tenant\n\nĐề bài: tenant Azure AD Premium P1, quá nhiều privileged access. Cần PAM: giới hạn thời gian, yêu cầu approval khi activate, và giảm chi phí. Hỏi việc làm trước.\n\nJust-In-Time access, approval và time-bound activation thuộc Privileged Identity Management. PIM nằm trong Azure AD Premium P2, không đủ trên P1. Bước đầu là nâng license tenant lên P2 rồi mới cấu hình PIM.\n\nA và B sai vì notifications và alerts chỉ hữu ích sau khi PIM đã có. C sai vì MFA khi activate role cũng là cấu hình trong PIM, chưa có trên P1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"PIM\" + \"time limits\" + \"approval\" + Premium P1 → Upgrade tenant to Premium P2 first.\n",
    "answerText": "D"
  },
  "115": {
    "stem": "Bạn có GitHub Enterprise account.\nBạn cần bật push protection cho secret scanning trên repository của account.\nBước đầu tiên nên làm gì?",
    "options": {
      "A": "Purchase a GitHub Advanced Security license.",
      "B": "Purchase Premium Plus support.",
      "C": "Enforce multi-factor authentication (MFA).",
      "D": "Create an access policy for secrets."
    },
    "explanation": "Đáp án: A — Purchase a GitHub Advanced Security license\n\nĐề bài: GitHub Enterprise account, cần bật push protection cho secret scanning. Hỏi việc làm trước.\n\nPush protection chặn secret ngay lúc git push. Tính năng này thuộc GitHub Advanced Security. Secret scanning cơ bản chỉ cảnh báo sau khi secret đã vào history. Phải mua GHAS trước khi bật push protection trên các repo của account.\n\nB sai vì Premium Plus support không mở security feature. C sai vì MFA tăng bảo mật đăng nhập, không bật push protection. D sai vì access policy không thay license GHAS.\n\nKeywords phản xạ nhanh (AZ-400)\n\"push protection\" + \"secret scanning\" + GitHub Enterprise → Purchase GitHub Advanced Security first.\n",
    "answerText": "A"
  },
  "122": {
    "stem": "Công ty dùng Azure DevOps cho build và deployment pipeline của project Java.\nBạn cần recommend strategy quản lý technical debt.\nAction nào nên có trong recommendation?",
    "options": {
      "A": "Cấu hình post-deployment approvals trong deployment pipeline.",
      "B": "Tích hợp Azure DevOps và SonarQube",
      "C": "Tích hợp Azure DevOps và Azure DevTest Labs."
    },
    "explanation": "Đáp án: B — Integrate Azure DevOps and SonarQube\n\nĐề bài: Java trên Azure DevOps; cần chiến lược quản lý technical debt.\n\nSonarQube continuous inspection phát hiện bugs, code smells và maintainability. Tích hợp vào build pipeline cho metric technical debt sớm, trước khi nợ tích lũy.\n\nA sai vì post-deployment approvals kiểm soát release, không đo chất lượng code. C sai vì DevTest Labs cung cấp môi trường test, không phân tích technical debt.\n\nKeywords phản xạ nhanh (AZ-400)\n\"technical debt\" + Azure DevOps → Integrate SonarQube.\n",
    "answerText": "B"
  },
  "123": {
    "stem": "Bạn có Azure subscription chứa các resource trong bảng (exhibit).\nBạn định tạo linked service trong DF1 kết nối SQL1 bằng Microsoft SQL Server authentication; password SQL login lưu trong KV1.\nBạn cần cấu hình DF1 lấy password khi data factory kết nối SQL1, theo least privilege.\nCấu hình DF1 thế nào? Chọn option trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: Secret, Access policy\n\nĐề bài: Data Factory DF1 kết nối SQL1 bằng SQL authentication; password nằm trong KV1; least privilege khi DF1 lấy password.\n\nPermission type là Secret: linked service reference secret trong Key Vault, không nhúng password. Access method là Access policy: cấp managed identity của Data Factory quyền Get trên secrets, đủ để đọc một secret.\n\nKhông chọn Key hay Certificate vì password là secret. Không cấp quyền vault rộng hơn Get secret. Các bước: lấy managed identity DF, grant Get, linked service Key Vault, rồi SQL linked service reference secret.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Data Factory\" + \"password in Key Vault\" + least privilege → Secret + Access policy (Get).\n",
    "boxes": {
      "1": {
        "label": "Permission type:",
        "answer": "Secret"
      },
      "2": {
        "label": "Access method:",
        "answer": "Access policy"
      }
    },
    "answerText": "Secret, Access policy"
  },
  "130": {
    "stem": "Đảm bảo Azure web app az400-123456789-main lấy secrets từ Azure key vault az400-123456789-kv1 bằng system managed identity.\nGiải pháp theo least privilege.\nHoàn thành task: đăng nhập Microsoft Azure portal.",
    "explanation": "Đáp án: Bật system-assigned managed identity trên web app; cấp quyền Get secrets trên Key Vault\n\nĐề bài: web app az400-123456789-main lấy secrets từ az400-123456789-kv1 bằng system managed identity, least privilege.\n\nTrên Azure portal mở web app, Settings → Identity → System assigned → On → Save. Trên Key Vault, Access policies hoặc RBAC, cấp identity của app quyền Get (secrets), không cấp List/Delete/vault admin nếu không cần.\n\nKhông dùng user-assigned trừ khi đề yêu cầu. Không paste secret vào app settings.\n\nKeywords phản xạ nhanh (AZ-400)\n\"web app\" + \"Key Vault\" + \"system managed identity\" → Identity On + Get secrets.\n",
    "answerText": "1. Azure portal → web app az400-123456789-main\n2. Settings → Managed identity → System assigned: On → Save\n3. Key vault: grant managed identity Get secret"
  },
  "132": {
    "stem": "Công ty có project Azure DevOps.\nBạn định tạo release pipeline deploy resource bằng ARM templates tham chiếu secrets trong Azure Key Vault.\nBạn cần recommend cách truy cập secrets lúc deploy, theo least privilege.\nKéo configuration phù hợp vào target.",
    "explanation": "Đáp án: A Key Vault advanced access policy; RBAC\n\nĐề bài: release pipeline deploy ARM templates reference secrets trong Key Vault; least privilege.\n\nEnable key vaults for template deployment bằng Key Vault advanced access policy (Azure Resource Manager for template deployment). Restrict access to secrets bằng RBAC, ví dụ Key Vault Secrets User cho identity deploy, thay vì access policy rộng.\n\nKhông để secret trong parameter file. Không cấp Contributor trên toàn subscription chỉ để đọc secret.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ARM templates\" + \"Key Vault secrets\" + least privilege → advanced access policy + RBAC.\n",
    "boxes": {
      "1": {
        "label": "Enable key vaults for template deployment by using:",
        "answer": "A Key Vault advanced access policy"
      },
      "2": {
        "label": "Restrict access to the secrets in Key Vault by using:",
        "answer": "RBAC"
      }
    },
    "answerText": "A Key Vault advanced access policy, RBAC"
  },
  "133": {
    "stem": "Cấu hình quyền truy cập Azure DevOps agent pools:\n• Dùng project agent pool khi author build/release pipeline\n• Xem agent pool và agents của organization\n• Least privilege\n\nRole membership nào cần ở organization và project? Kéo role vào target.",
    "boxes": {
      "1": {
        "label": "Organization:",
        "answer": "Reader"
      },
      "2": {
        "label": "Project:",
        "answer": "User"
      }
    },
    "answerText": "Reader, User",
    "explanation": "Đáp án: Organization Reader; Project User\n\nĐề bài: dùng project agent pool khi author pipelines; xem organization agent pool và agents; least privilege.\n\nỞ organization, Reader xem pool và agents để monitor, không quản trị pool. Ở project, User dùng project agent pool khi viết build hoặc release pipelines.\n\nKhông chọn Administrator ở organization vì vượt least privilege. Không chọn Reader ở project vì Reader không đủ để dùng pool khi author pipeline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"view org agent pool\" + \"use project pool in pipelines\" → Reader (org) + User (project).\n"
  },
  "136": {
    "stem": "Công ty triển khai compliance: mọi Azure web app phải backup mỗi năm giờ.\nBackup web app az400-123456789-main mỗi năm giờ vào Storage account trong resource group.\nHoàn thành task: đăng nhập Microsoft Azure portal.",
    "explanation": "Đáp án: App Service Backups, scheduled every five hours, lưu Azure Storage\n\nĐề bài: backup web app az400-123456789-main mỗi năm giờ vào storage account trong resource group.\n\nMở App Service → Settings → Backups → Configure. Chọn storage account, tạo private container, bật Scheduled Backup mỗi 5 hours, đặt retention, Save.\n\nKhông dùng VM backup. Không schedule khác 5 hours.\n\nKeywords phản xạ nhanh (AZ-400)\n\"web app\" + \"backed up every five hours\" → App Service Backups + schedule 5 hours.\n",
    "answerText": "1. App Service → Settings → Backups → Configure\n2. Chọn storage account và container\n3. Scheduled Backup: On, mỗi 5 giờ\n4. Save"
  },
  "137": {
    "stem": "Cấu hình virtual machine VM1 truy cập secrets trong Azure Key Vault az400-123456789-kv một cách an toàn.\nHoàn thành task: đăng nhập Microsoft Azure portal.",
    "explanation": "Đáp án: Bật system-assigned managed identity trên VM1; cấp quyền Key Vault\n\nĐề bài: VM1 truy cập secrets trong az400-123456789-kv an toàn.\n\nPortal → VM1 → Identity → System assigned → On. Trên Key Vault cấp identity quyền Get secrets.\n\nKhông nhúng secret vào custom script. Không dùng admin credential vault cho VM.\n\nKeywords phản xạ nhanh (AZ-400)\n\"VM\" + \"Key Vault secrets\" → system-assigned managed identity + Get.\n",
    "answerText": "1. Azure portal → VM1 → Identity\n2. System assigned: On\n3. Key Vault: grant Get secrets cho VM identity"
  },
  "138": {
    "stem": "Công ty có subscription Subscription1 gắn Azure AD tenant contoso.com.\nProvision AKS cluster trong Subscription1 và set permission cluster bằng RBAC roles tham chiếu identity trong contoso.com.\nBa object tạo theo thứ tự nào? Sắp xếp đúng thứ tự trong answer area.",
    "explanation": "Đáp án: application registration in contoso.com → a cluster → an RBAC binding\n\nĐề bài: provision AKS trên Subscription1 và set permissions bằng RBAC roles tham chiếu identities trong tenant contoso.com.\n\nTạo application registration (hoặc Azure AD integration identity) trong contoso.com. Tạo AKS cluster gắn Azure AD. Tạo RBAC binding để map identities tenant với Kubernetes roles.\n\nKhông tạo cluster trước khi có identity Azure AD cho tích hợp. Không bind RBAC trước khi cluster tồn tại.\n\nKeywords phản xạ nhanh (AZ-400)\n\"AKS\" + \"RBAC\" + \"identities in Azure AD\" → app registration → cluster → RBAC binding.\n",
    "boxes": {
      "1": {
        "answer": "an application registration in contoso.com"
      },
      "2": {
        "answer": "a cluster"
      },
      "3": {
        "answer": "an RBAC binding"
      }
    },
    "answerText": "an application registration in contoso.com, a cluster, an RBAC binding"
  },
  "139": {
    "stem": "Bạn quản lý build và release pipeline bằng Azure DevOps; môi trường nằm trên Azure.\nCấu hình service endpoint truy cập Azure Key Vault secrets:\n• Azure DevOps retrieve secrets\n• Không lưu credentials/token trong Azure DevOps\n\nCấu hình service endpoint thế nào? Chọn option trong answer area.",
    "explanation": "Đáp án: Team Foundation Server / Azure Pipelines service connection; Managed Service Identity Authentication\n\nĐề bài: service endpoint lấy Key Vault secrets; secrets do Azure DevOps lấy; không persist credentials và tokens trong Azure DevOps.\n\nLoại connection là Azure Pipelines / TFS service connection tới Azure. Authentication là Managed Service Identity để Azure AD cấp identity tự quản, authenticate tới Key Vault mà không lưu client secret trong DevOps.\n\nKhông chọn service principal với secret vì credential bị persist. Không chọn PAT cho Key Vault Azure-native.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Key Vault\" + \"service endpoint\" + \"avoid persisting credentials\" → Azure Pipelines connection + Managed Identity.\n",
    "boxes": {
      "1": {
        "label": "Service connection type:",
        "answer": "Team Foundation Server / Azure Pipelines service connection"
      },
      "2": {
        "label": "Authentication/authorization method for the connection:",
        "answer": "Managed Service Identity Authentication"
      }
    },
    "answerText": "Team Foundation Server / Azure Pipelines service connection, Managed Service Identity Authentication"
  },
  "140": {
    "options": {
      "A": "Cấu hình RBAC cho key vault",
      "B": "Sửa application để truy cập key vault",
      "C": "Cấu hình Key Vault access policy",
      "D": "Deploy Azure Desired State Configuration (DSC) extension",
      "E": "Deploy virtual machine dùng system-assigned managed identity"
    },
    "answerText": "B, C, E",
    "explanation": "Đáp án: B, C, E\n\nĐề bài: server app trên Server Core Windows Server 2019; dùng Key Vault bảo vệ API secrets cho third-party integrations.\n\nSửa application để gọi Key Vault thay vì hardcode. Cấu hình Key Vault access policy (Get secrets) cho identity của máy. Deploy VM với system-assigned managed identity để authenticate, không nhúng credentials.\n\nA không được chọn theo khóa: RBAC quản lý ai administer vault, không phải cơ chế app đọc secret trong lời giải đề. D sai vì DSC không phải bước trực tiếp lấy API secrets.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Key Vault\" + Server Core + API secrets → modify app + access policy + system-assigned MI.\n"
  },
  "141": {
    "stem": "Công ty tạo bộ ba mobile application.\nBạn cần kiểm soát quyền truy cập application builds; quản lý ở cấp organization.\nDùng gì? Chọn option trong answer area.",
    "explanation": "Đáp án: Microsoft Visual Studio App Center distribution groups; Shared\n\nĐề bài: bộ ba mobile apps; kiểm soát access tới application builds ở organization level.\n\nDistribution groups quản lý ai nhận release (QA, beta, staging rings). Shared group dùng chung nhiều app trong một organization, không tạo lại group từng app.\n\nKhông chọn group chỉ trong một app vì đề yêu cầu organization level. Không chọn public store distribution.\n\nKeywords phản xạ nhanh (AZ-400)\n\"mobile builds\" + \"organization level\" → App Center Shared distribution groups.\n",
    "boxes": {
      "1": {
        "label": "Groups to control the build access:",
        "answer": "Microsoft Visual Studio App Center distribution groups"
      },
      "2": {
        "label": "Group type:",
        "answer": "Shared"
      }
    },
    "answerText": "Microsoft Visual Studio App Center distribution groups, Shared"
  },
  "142": {
    "stem": "Bạn có Azure DevOps organization Contoso và project Project1.\nProvision Azure key vault Keyvault1.\nBạn cần reference secrets Keyvault1 trong build pipeline của Project1.\nBước đầu tiên nên làm gì?",
    "options": {
      "A": "Thêm secure file vào Project1",
      "B": "Tạo XAML build service",
      "C": "Tạo variable group trong Project1",
      "D": "Cấu hình security policy của Contoso"
    },
    "explanation": "Đáp án: C — Create a variable group in Project1\n\nĐề bài: reference secrets Keyvault1 trong build pipeline của Project1. Hỏi việc làm trước.\n\nVariable group link Azure Key Vault là cách chuẩn: pipeline dùng biến, giá trị lấy lúc runtime, không hardcode.\n\nA sai vì secure file không phải tích hợp Key Vault. B sai vì XAML build service lỗi thời và không liên quan Key Vault. D sai vì security policy organization không thay bước link vault vào pipeline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Key Vault secrets\" + \"build pipeline\" + first → Create a variable group.\n",
    "answerText": "C"
  },
  "146": {
    "stem": "Bạn dùng GitHub Enterprise Server làm source repository. Tạo Azure DevOps organization Contoso và project Project1.\nLink GitHub commits, pull requests và issues với work items của Project1; dùng OAuth authentication.\nBa action thực hiện theo thứ tự nào? Kéo action vào answer area và sắp xếp đúng thứ tự.",
    "explanation": "Đáp án: Register OAuth app on GitHub Enterprise Server → Add OAuth configuration in Azure DevOps Organization settings → Add GitHub connection in Project Settings\n\nĐề bài: GitHub Enterprise Server; link commits, PRs, issues với work items Project1; OAuth-based authentication.\n\nĐăng ký OAuth app trên GitHub Enterprise (Developer settings) để có client ID/secret. Đăng OAuth configuration ở Organization settings Azure DevOps. Ở Project Settings thêm GitHub connection dùng cấu hình OAuth đó.\n\nKhông thêm GitHub connection trước khi OAuth app và org configuration tồn tại. Không dùng PAT nếu đề bắt OAuth.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub Enterprise Server\" + \"OAuth\" + work items → GHES OAuth app → ADO OAuth config → project GitHub connection.\n",
    "boxes": {
      "1": {
        "answer": "From Developer settings in GitHub Enterprise Server, register a new OAuth app."
      },
      "2": {
        "answer": "From Organization settings in Azure DevOps, add an OAuth configuration."
      },
      "3": {
        "answer": "From Project Settings in Azure DevOps, add a GitHub connection."
      }
    },
    "answerText": "From Developer settings in GitHub Enterprise Server, register a new OAuth app., From Organization settings in Azure DevOps, add an OAuth configuration., From Project Settings in Azure DevOps, add a GitHub connection."
  },
  "147": {
    "stem": "Bạn cấu hình Azure DevOps deployment pipeline. App deployed sẽ authenticate web service bằng secret trong Azure key vault.\nBạn cần dùng secret trong deployment pipeline.\nBa action theo thứ tự nào? Kéo action vào answer area và sắp xếp đúng thứ tự.",
    "explanation": "Đáp án: Create a service principal in Azure AD → Configure an access policy in the key vault → Add an ARM service connection to the pipeline\n\nĐề bài: deployment pipeline; app authenticate web service bằng secret trong Key Vault; cần dùng secret trong pipeline.\n\nService principal là identity deploy. Access policy cấp Get secrets cho principal đó. ARM service connection gắn principal vào pipeline để lúc deploy lấy secret.\n\nKhông thêm service connection trước khi principal và quyền vault đã có. Không bỏ access policy vì connection không đọc được vault.\n\nKeywords phản xạ nhanh (AZ-400)\n\"pipeline\" + \"Key Vault secret\" → service principal → access policy → ARM service connection.\n",
    "boxes": {
      "1": {
        "answer": "Create a service principal in Azure Active Directory (Azure AD)."
      },
      "2": {
        "answer": "Configure an access policy in the key vault."
      },
      "3": {
        "answer": "Add an Azure Resource Manager service connection to the pipeline."
      }
    },
    "answerText": "Create a service principal in Azure Active Directory (Azure AD)., Configure an access policy in the key vault., Add an Azure Resource Manager service connection to the pipeline."
  },
  "148": {
    "stem": "Bạn có private project trong Azure DevOps và hai user User1, User2.\nCần thêm User1 và User2 vào groups để:\n• User1 có thể tạo code wiki.\n• User2 có thể edit wiki pages.\n• Giải pháp tuân thủ least privilege.\nThêm từng user vào group nào? Kéo group phù hợp vào từng user.",
    "explanation": "Đáp án: User1 Project Administrators; User2 Contributors\n\nĐề bài: private project; User1 tạo code wiki; User2 edit wiki pages; least privilege.\n\nPublish code as wiki cần Create Repository, mặc định thuộc Project Administrators. Contributors được add và edit wiki pages.\n\nKhông cho User2 Project Administrators vì vượt quyền edit wiki. Không cho User1 Contributors vì Contributors không đủ tạo code wiki.\n\nKeywords phản xạ nhanh (AZ-400)\n\"create a code wiki\" + \"edit wiki pages\" + least privilege → Project Administrators + Contributors.\n",
    "boxes": {
      "1": {
        "answer": "Project Administrators"
      },
      "2": {
        "answer": "Contributors"
      }
    },
    "answerText": "Project Administrators, Contributors"
  },
  "149": {
    "options": {
      "A": "Chạy npm install với flag --production.",
      "B": "Sửa WhiteSource Bolt policy, set action cho license của dev tools thành Reassign.",
      "C": "Sửa devDependencies trong Package.json của project.",
      "D": "Cấu hình WhiteSource Bolt chỉ scan thư mục node_modules"
    },
    "explanation": "Đáp án: A, D\n\nĐề bài: WhiteSource Bolt scan Node.js thấy nhiều libraries license không hợp lệ nhưng chỉ dùng lúc development, không vào production. Cần Bolt chỉ scan production dependencies.\n\nA đúng vì npm install --production chỉ cài dependencies, bỏ devDependencies, nên node_modules chỉ còn production packages. D đúng vì cấu hình Bolt scan thư mục node_modules; kết hợp A thì scan không đụng manifest chứa devDependencies.\n\nB sai vì Reassign license chỉ đổi cách xử lý license đã phát hiện, không loại dev tools khỏi scan. C sai theo khóa đáp án: sửa package.json một mình không bảo đảm scanner chỉ nhìn production install.\n\nKeywords phản xạ nhanh (AZ-400)\n\"WhiteSource Bolt\" + \"only production dependencies\" + Node.js → npm install --production + scan node_modules only.\n",
    "answerText": "A, C"
  },
  "150": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario; không quay lại câu trước.\n\nBạn định cập nhật Azure DevOps strategy của công ty.\nCần phát hiện khi phát sinh:\n• Licensing violations\n• Prohibited libraries\n\nGiải pháp: Triển khai continuous integration.\nGiải pháp này có đáp ứng mục tiêu không?",
    "explanation": "Đáp án: B — No\n\nĐề bài cần phát hiện licensing violations và prohibited libraries khi chúng xuất hiện. Giải pháp: implement continuous integration.\n\nCI tự động build và integrate code. CI không tự scan license hay cấm libraries trừ khi gắn thêm SCA. CI một mình không đạt goal.\n\nYes (A) sai vì thiếu công cụ composition analysis. Cần WhiteSource, Black Duck hoặc tương đương trong pipeline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"licensing violations\" + \"prohibited libraries\" + \"continuous integration\" → No.\n"
  },
  "158": {
    "explanation": "Đáp án: Create a YAML file → Run kubectl apply → Run helm init\n\nĐề bài: AKS bật RBAC; dùng Azure Container Instances làm hosted development environment chạy containers trong AKS (Virtual Kubelet / ACI connector).\n\nCluster RBAC cần service account và role binding cho Tiller. Tạo YAML (rbac-virtual-kubelet.yaml). kubectl apply áp dụng account và binding. helm init --service-account tiller rồi cài Virtual Kubelet.\n\nKhông helm init trước khi SA/RBAC tồn tại vì Tiller sẽ thiếu quyền. Không bỏ kubectl apply.\n\nKeywords phản xạ nhanh (AZ-400)\n\"AKS RBAC\" + ACI hosted environment → YAML RBAC → kubectl apply → helm init.\n",
    "boxes": {
      "1": {
        "answer": "Create a YAML file."
      },
      "2": {
        "answer": "Run kubectl apply."
      },
      "3": {
        "answer": "Run helm init."
      }
    },
    "answerText": "Create a YAML file., Run kubectl apply., Run helm init."
  },
  "161": {
    "stem": "Bạn quản trị Azure DevOps project có package feeds.\nCần developer có thể unlist và deprecate packages, theo least privilege.\nNên gán access level nào?",
    "options": {
      "A": "Collaborator",
      "B": "Contributor",
      "C": "Owner"
    },
    "explanation": "Đáp án: B — Contributor\n\nĐề bài: developers unlist và deprecate packages trên Azure Artifacts feeds; least privilege.\n\nContributor được push, consume, unlist và deprecate. Đủ việc dev cần.\n\nA sai vì Collaborator chủ yếu consume, không quản lý unlist/deprecate. C sai vì Owner được xóa feed và sửa permissions, vượt least privilege.\n\nKeywords phản xạ nhanh (AZ-400)\n\"unlist and deprecate packages\" + least privilege → Contributor (not Owner).\n",
    "answerText": "B"
  },
  "162": {
    "stem": "Bạn có project Azure DevOps với ba team (xem exhibit Teams).\n\nBạn tạo dashboard Dash1 và cấu hình permissions cho Contoso project (xem exhibit Permissions).\n\nCác permission khác giữ mặc định.\nVới mỗi phát biểu, chọn Yes nếu đúng, No nếu sai.",
    "explanation": "Đáp án: No; Yes; Yes\n\nĐề bài: dashboard Dash1 và permissions Contoso project; các statement Yes/No.\n\nWeb Team không xóa được Dash1: member mặc định edit dashboard của team, không có quyền delete trừ khi được cấp. Contoso Team xem được Dash1: project members mặc định View trừ khi Deny. Project administrators tạo được dashboard mới: nhóm này có quyền create/edit/manage dashboards.\n\nKhông đảo Yes/No. Không giả định Web Team là Project Administrators.\n\nKeywords phản xạ nhanh (AZ-400)\n\"dashboard permissions\" → team cannot delete; project can view; Project Administrators can create.\n",
    "statements": {
      "1": "Web Team có thể xóa Dash1.",
      "2": "Contoso Team có thể xem Dash1.",
      "3": "Project administrators có thể tạo dashboard mới."
    }
  },
  "164": {
    "stem": "Bạn triển khai package management cho Node.js app bằng Azure Artifacts.\nCần cấu hình dev environment kết nối package repository, giảm tối đa rò rỉ credentials.\nDùng file nào cho từng loại cấu hình? Kéo file vào connection tương ứng.",
    "explanation": "Đáp án: Feed registry → project .npmrc; Credentials → user home .npmrc\n\nĐề bài: Node.js với Azure Artifacts; cấu hình kết nối, giảm leak credentials.\n\nFile .npmrc trong project (cạnh package.json) chứa registry URL của feed, được commit, không chứa token. File .npmrc trong home folder ($HOME / %USERPROFILE%) chứa credentials; npm client lấy registry từ project rồi khớp credential ở home.\n\nKhông commit token trong project .npmrc. Không để registry-only trong home nếu team cần chia sẻ URL qua Git.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Artifacts\" + npm + \"credentials not leaked\" → project .npmrc (registry) + home .npmrc (credentials).\n",
    "boxes": {
      "1": {
        "label": "Feed registry information:",
        "answer": "The .npmrc file in the project"
      },
      "2": {
        "label": "Credentials:",
        "answer": "The .npmrc file in the user's home folder"
      }
    },
    "answerText": "The .npmrc file in the project, The .npmrc file in the user's home folder"
  },
  "169": {
    "stem": "Cần chuẩn bị NSG az400-123456789-nsg1 để host Azure DevOps pipeline agent. Chỉ cho phép outbound port bắt buộc tới Azure DevOps, deny mọi inbound/outbound Internet khác.\nHoàn thành trên Azure portal.",
    "explanation": "Đáp án: NSG outbound Allow TCP 8080; deny còn lại\n\nĐề bài: chuẩn bị NSG az400-123456789-nsg1 cho Azure DevOps pipeline agent; chỉ mở outbound port cần cho Azure DevOps; deny inbound và outbound Internet khác.\n\nTheo lời giải lab nguồn: portal → NSG → Outbound security rules → Add → Destination port 8080, Protocol TCP, Action Allow (Azure DevOps Server mặc định TCP 8080). Giữ hoặc thêm deny inbound/outbound Internet không cần thiết.\n\nKhông mở inbound 3389 hay 22 nếu đề không yêu cầu. Không Allow * outbound.\n\nKeywords phản xạ nhanh (AZ-400)\n\"NSG\" + \"pipeline agent\" + outbound Azure DevOps → Allow TCP 8080 (lab) / deny other Internet.\n"
  },
  "170": {
    "stem": "Project1 có Pipeline1 và Pipeline2. Cần Pipeline1 deploy lên web app webapp1, Pipeline2 không có quyền webapp1.\nBa actions theo thứ tự nào?",
    "explanation": "Đáp án: Create a service principal → In Project1, create a service connection → In Pipeline1, authorize the service connection\n\nĐề bài: Pipeline1 deploy được webapp1; Pipeline2 không có quyền webapp1.\n\nService principal là identity Azure. Service connection trong Project1 gắn principal. Authorize connection chỉ trên Pipeline1 nên Pipeline2 không dùng được connection, không deploy webapp1.\n\nKhông authorize ở project-wide cho mọi pipelines. Không dùng project permissions user/group thay cho pipeline authorization.\n\nKeywords phản xạ nhanh (AZ-400)\n\"only Pipeline1\" + \"web app\" → SP + service connection + authorize on Pipeline1 only.\n",
    "boxes": {
      "1": {
        "answer": "Create a service principal in Azure Active Directory."
      },
      "2": {
        "answer": "In Project1, create a service connection."
      },
      "3": {
        "answer": "In Pipeline1, authorize the service connection."
      }
    },
    "answerText": "Create a service principal in Azure Active Directory., In Project1, create a service connection., In Pipeline1, authorize the service connection."
  },
  "173": {
    "stem": "Bạn dùng NuGet package từ feed yêu cầu authentication trong Azure DevOps project.\nCần project restore package tự động.\nProject nên dùng gì để automate authentication?",
    "options": {
      "A": "an Azure Automation account",
      "B": "an Azure Artifacts Credential Provider",
      "C": "an Azure Active Directory (Azure AD) account that has multi-factor authentication (MFA) enabled",
      "D": "an Azure Active Directory (Azure AD) service principal"
    },
    "explanation": "Đáp án: B — an Azure Artifacts Credential Provider\n\nĐề bài: NuGet package nằm feed cần authentication; project phải restore tự động.\n\nAzure Artifacts Credential Provider lấy token cho nuget/dotnet/msbuild khi restore từ authenticated feed, không nhúng password.\n\nA sai vì Automation account không phải cơ chế NuGet restore. C sai vì Azure AD user bật MFA không hoàn thành challenge trong build tự động. D sai vì service principal phải tự quản lý secret, không phải provider chuẩn cho NuGet client.\n\nKeywords phản xạ nhanh (AZ-400)\n\"NuGet\" + \"authenticated feed\" + restore automatically → Azure Artifacts Credential Provider.\n",
    "answerText": "B"
  },
  "174": {
    "explanation": "Đáp án: A — Third-party application access via OAuth\n\nĐề bài: Azure Pipelines for Microsoft Teams thông báo legal team khi build sẵn sàng; cần bật gì trong Organization Settings.\n\nTích hợp Teams dùng OAuth. Organization phải cho phép Third-party application access via OAuth thì Azure Pipelines mới được ủy quyền post message lên Teams.\n\nB sai vì Conditional Access Policy Validation không bật connector Teams. C sai vì Alternate authentication credentials không dùng cho app Teams. D sai vì SSH authentication dành Git/SSH, không phải Teams notifications.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Pipelines for Microsoft Teams\" + Organization Settings → Third-party application access via OAuth.\n",
    "answerText": "A"
  },
  "176": {
    "stem": "Subscription có Azure Monitor và Log Analytics workspace. Bạn có encryption key.\nCần cấu hình Azure Monitor dùng key để encrypt log data.\nNăm actions theo thứ tự nào? (Có thể có nhiều thứ tự đúng.)",
    "explanation": "Đáp án: Create Key Vault and store the key → Create Azure Monitor Logs dedicated cluster with system-assigned MI → Grant MI Key permissions → Configure key vault properties on the cluster → Link Log Analytics workspace to the cluster\n\nĐề bài: Azure Monitor dùng encryption key của bạn để mã hóa log data.\n\nCustomer-managed key cần dedicated cluster. Tạo vault và key cùng region. Tạo cluster với system-assigned identity để wrap/unwrap. Cấp Get, Wrap Key, Unwrap Key. Gắn key vault properties cho cluster. Link workspace vào cluster để data dùng CMK.\n\nKhông link workspace trước khi cluster có key. Không dùng user account thay managed identity.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Monitor\" + \"encrypt log data\" + your key → KV + dedicated cluster MI + grant keys + configure cluster + link workspace.\n",
    "boxes": {
      "1": {
        "answer": "Create an Azure key vault and store the key"
      },
      "2": {
        "answer": "Create an Azure Monitor Logs dedicated cluster that has a system-assigned managed identity"
      },
      "3": {
        "answer": "Grant the system-assigned managed identity Key permissions for the key vault"
      },
      "4": {
        "answer": "Configure the key vault properties for the cluster"
      },
      "5": {
        "answer": "Link the Log Analytics workspace to the cluster"
      }
    },
    "answerText": "Create an Azure key vault and store the key, Create an Azure Monitor Logs dedicated cluster that has a system-assigned managed identity, Grant the system-assigned managed identity Key permissions for the key vault, Configure the key vault properties for the cluster, Link the Log Analytics workspace to the cluster"
  },
  "177": {
    "stem": "Key Vault có encryption key key1. Bạn định tạo Log Analytics workspace lưu logging data và encrypt bằng key1.\nBốn actions theo thứ tự nào?",
    "explanation": "Đáp án: Register subscription for cluster creation → Create a Log Analytics cluster → Grant permissions to the key vault → Link the workspace\n\nĐề bài: Key Vault đã có key1; tạo Log Analytics workspace mã hóa bằng key1.\n\nĐăng ký subscription cho phép tạo dedicated cluster. Tạo Log Analytics cluster với managed identity. Grant Get/Wrap/Unwrap cho identity trên vault chứa key1. Link workspace vào cluster.\n\nKhông bỏ register vì cluster creation có thể bị chặn. Không encrypt workspace trực tiếp không qua cluster.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Log Analytics\" + encrypt with Key Vault key → register → cluster → grant KV → link workspace.\n",
    "boxes": {
      "1": {
        "answer": "Register the Azure subscription to allow cluster creation."
      },
      "2": {
        "answer": "Create a Log Analytics cluster."
      },
      "3": {
        "answer": "Grant permissions to the key vault."
      },
      "4": {
        "answer": "Link the workspace."
      }
    },
    "answerText": "Register the Azure subscription to allow cluster creation., Create a Log Analytics cluster., Grant permissions to the key vault., Link the workspace."
  },
  "179": {
    "stem": "Triển khai project Azure DevOps mới với yêu cầu:\n• Lead developer: tạo repos, quản lý permissions/policies, contribute.\n• Developers: contribute, tạo branches, KHÔNG bypass policies khi push.\n• Project managers: chỉ xem repository.\n• Least privilege.\nMỗi team role nên thêm vào Azure DevOps group nào?",
    "explanation": "Đáp án: Project manager Readers; Lead developer Project Administrators; Developer Contributors\n\nĐề bài: lead tạo repo, quản lý permissions/policies và contribute; developers contribute và tạo branch, không bypass policies; project managers chỉ xem repo; least privilege. Mỗi role một team.\n\nReaders chỉ xem repository. Project Administrators đủ tạo repo và quản lý policies/permissions. Contributors contribute và tạo branch; branch policies vẫn chặn bypass.\n\nKhông cho developers Project Administrators. Không cho PMs Contributors. Không cho lead Contributors vì thiếu create repo và manage policies.\n\nKeywords phản xạ nhanh (AZ-400)\n\"view only\" + \"manage repos/policies\" + \"contribute no bypass\" → Readers + Project Administrators + Contributors.\n",
    "boxes": {
      "1": {
        "label": "Project manager:",
        "answer": "Readers"
      },
      "2": {
        "label": "Lead developer:",
        "answer": "Project Administrators"
      },
      "3": {
        "label": "Developer:",
        "answer": "Contributors"
      }
    },
    "answerText": "Readers, Project Administrators, Contributors"
  },
  "180": {
    "stem": "Subscription có project Azure DevOps Project1. Ba user Azure AD cần truy cập Project1 (xem bảng trong exhibit).\nGán mỗi user vào security group nào?",
    "explanation": "Đáp án: Readers; Project Administrators; Contributors\n\nĐề bài: ba user Azure AD cần quyền khác nhau trên Project1 (theo table/exhibit).\n\nReaders xem work items và dashboards, không sửa. Project Administrators kiểm soát settings, security và assets cấp project. Contributors tạo và sửa work items, quản lý dashboard team mình.\n\nKhông đảo thứ tự khóa. Không dùng Stakeholder thay Readers nếu khóa là Readers.\n\nKeywords phản xạ nhanh (AZ-400)\n\"view only\" + \"full project control\" + \"edit work items\" → Readers + Project Administrators + Contributors.\n",
    "boxes": {
      "1": {
        "answer": "Readers"
      },
      "2": {
        "answer": "Project Administrators"
      },
      "3": {
        "answer": "Contributors"
      }
    },
    "answerText": "Readers, Project Administrators, Contributors"
  },
  "187": {
    "stem": "Subscription có Key Vault Vault1, pipeline Pipeline1, SQL database DB1.\nPipeline1 deploy app authenticate DB1 bằng password.\nCần lưu password trong Vault1 và Pipeline1 truy cập được.\nChọn option phù hợp.",
    "explanation": "Đáp án: Secret; Access policies\n\nĐề bài: Pipeline1 deploy app authenticate DB1 bằng password; lưu password trong Vault1; Pipeline1 phải đọc được.\n\nPassword lưu là Secret. Cấp Pipeline1 (service principal hoặc managed identity của service connection) qua Access policies quyền Get secrets.\n\nKhông lưu password như Key hay Certificate. Không chỉ dựa portal IAM của SQL.\n\nKeywords phản xạ nhanh (AZ-400)\n\"pipeline password\" + Key Vault → Secret + Access policies.\n",
    "boxes": {
      "1": {
        "label": "Store the password as a: ",
        "answer": "Secret"
      },
      "2": {
        "label": "Grant Pipeline1 access to Vault1 by modifying the: ",
        "answer": "Access policies"
      }
    },
    "answerText": "Secret, Access policies"
  },
  "189": {
    "stem": "GitHub org có User1, User2, User3 và repository repo1. Cấu hình permissions:\n• User1 push code lên repo1.\n• User2 quản lý issues và pull requests.\n• User3 quản lý repo1 nhưng không truy cập sensitive data.\nGán role nào cho từng user?",
    "explanation": "Đáp án: User1 Write; User2 Triage; User3 Maintain\n\nĐề bài: User1 push repo1; User2 quản lý issues và pull requests; User3 quản lý repo1 nhưng không truy cập sensitive data.\n\nWrite cho phép push. Triage quản lý issues/PRs không cần write code. Maintain quản lý repo (settings, collaborators) nhưng không bằng Admin, hạn chế sensitive data so với Admin.\n\nKhông cho User1 Admin. Không cho User2 Write nếu chỉ cần issues/PRs. Không cho User3 Admin vì Admin xem được dữ liệu nhạy hơn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"push\" + \"manage issues/PRs\" + \"manage repo without sensitive data\" → Write + Triage + Maintain.\n",
    "boxes": {
      "1": {
        "label": "User1:",
        "answer": "Write"
      },
      "2": {
        "label": "User2:",
        "answer": "Triage"
      },
      "3": {
        "label": "User3:",
        "answer": "Maintain"
      }
    },
    "answerText": "Write, Triage, Maintain"
  },
  "194": {
    "stem": "Bạn quản lý code bằng GitHub và dùng Dependabot scan dependencies.\nCần xác định khi nào scan được trigger tự động.\nHai action nào trigger scan? (Chọn hai.)",
    "options": {
      "C": "A branch is forked.",
      "D": "Any commit is pushed.",
      "E": "A new advisory is added."
    },
    "explanation": "Đáp án: A, E\n\nĐề bài: Dependabot scan dependencies; hai hành động nào tự trigger scan.\n\nA đúng: dependency graph đổi (manifest/lockfile) thì Dependabot phải rescan. E đúng: advisory mới về dependency trong repo kích hoạt scan và có thể mở PR.\n\nB sai vì chỉ tạo pull request không phải trigger chuẩn của dependency scan. C sai vì fork không kích hoạt Dependabot trên repo gốc theo nghĩa đề. D sai vì không phải mọi commit đều trigger dependency scan, chỉ commit làm đổi graph.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Dependabot\" + \"scan triggered automatically\" → dependency graph changes + new advisory.\n",
    "answerText": "A,E"
  },
  "195": {
    "stem": "Tenant Entra có Group1, Group2, Group3. Tạo project Azure DevOps Project1.\nBảo mật service connections theo yêu cầu:\n• Group1: share/unshare service connection với project khác.\n• Group2: rename và update description service connection.\n• Group3: dùng service connection trong build/release pipelines.\n• Least privilege.\nGán permission nào cho từng group?",
    "explanation": "Đáp án: Group1 Organization-level Administrator; Group2 Project-level Administrator; Group3 User\n\nĐề bài: Group1 share/unshare service connection với project khác; Group2 rename và sửa description; Group3 dùng connection trong build/release; least privilege.\n\nOrganization-level Administrator mới share/unshare across projects. Project-level Administrator rename và update description trong project. User (Use) đủ để pipeline dùng connection.\n\nKhông cho Group3 Administrator. Không cho Group2 Organization-level. Không cho Group1 chỉ User.\n\nKeywords phản xạ nhanh (AZ-400)\n\"share/unshare service connection\" + rename + use in pipeline → Org Admin + Project Admin + User.\n",
    "boxes": {
      "1": {
        "label": "Group1:",
        "answer": "Organization-level Administrator"
      },
      "2": {
        "label": "Group2:",
        "answer": "Project-level Administrator"
      },
      "3": {
        "label": "Group3:",
        "answer": "User"
      }
    },
    "answerText": "Organization-level Administrator, Project-level Administrator, User"
  },
  "196": {
    "stem": "Azure Repos repository Repo1 cần cấu hình code scanning.\nPipeline thực hiện ba tasks theo thứ tự nào?",
    "explanation": "Đáp án: Advanced Security Initialize CodeQL → Advanced Security Dependency Scanning → Advanced Security Perform CodeQL Analysis\n\nĐề bài: cấu hình code scanning cho Repo1 trên Azure Repos; ba tasks theo thứ tự.\n\nInitialize CodeQL chuẩn bị database/môi trường. Dependency Scanning quét dependencies. Perform CodeQL Analysis chạy phân tích trên source rồi publish alerts.\n\nKhông Analyze trước Initialize. Không bỏ Dependency Scanning theo khóa.\n\nKeywords phản xạ nhanh (AZ-400)\n\"code scanning\" + Azure Repos → Initialize CodeQL + Dependency Scanning + Perform CodeQL Analysis.\n",
    "boxes": {
      "1": {
        "answer": "Advanced Security Initialize CodeQL"
      },
      "2": {
        "answer": "Advanced Security Dependency Scanning"
      },
      "3": {
        "answer": "Advanced Security Perform CodeQL Analysis"
      }
    },
    "answerText": "Advanced Security Initialize CodeQL, Advanced Security Dependency Scanning, Advanced Security Perform CodeQL Analysis"
  },
  "197": {
    "stem": "Tạo personal access token (PAT) Token1 chỉ có:\n• Read, write, manage code\n• Read and execute builds\n• Read releases\nToken1 hết hạn sau 60 ngày.",
    "explanation": "Đáp án: PAT Token1, hết hạn 60 ngày, scopes Code / Build / Release như đề\n\nĐề bài: tạo PAT tên Token1 chỉ có Read, write, and manage code; Read and execute builds; Read releases; hết hạn 60 ngày.\n\nĐăng nhập organization → User settings → Personal access tokens → New Token. Tên Token1, expiration 60 days. Scopes: Code (Read, write & manage), Build (Read & execute), Release (Read). Create. Không chọn Full access hay Packaging.\n\nKeywords phản xạ nhanh (AZ-400)\n\"PAT\" + Code + Build + Release + 60 days → New Token with those scopes only.\n"
  },
  "198": {
    "stem": "GitHub repo dùng GitHub Actions, lưu access keys bằng encrypted secrets.\nCập nhật secrets qua GitHub REST API — cần wrap secrets trước khi gọi API.\nDùng encryption library nào?",
    "options": {
      "A": "CryptoNet",
      "B": "BouncyCastle",
      "C": "libsodium",
      "D": "hashlib"
    },
    "explanation": "Đáp án: C — libsodium\n\nĐề bài: cập nhật GitHub encrypted secrets qua REST API; phải wrap secrets trước khi gọi API. Hỏi encryption library.\n\nGitHub yêu cầu encrypt bằng public key của repo theo libsodium sealed box (NaCl). Lấy public key GET .../actions/secrets/public-key rồi encrypt bằng libsodium trước PUT.\n\nA sai vì CryptoNet không phải thư viện GitHub document. B sai vì BouncyCastle không phải chuẩn GitHub cho secret API. D sai vì hashlib là hashing, không public-key wrap.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub REST API\" + \"wrap secrets\" → libsodium.\n",
    "answerText": "C"
  },
  "199": {
    "stem": "GitHub repo Repo1, app App1. Thực hiện:\n• Test1: ZAP spider App1 1 phút, chờ passive scan, KHÔNG active attack.\n• Test2: ZAP spider rồi chạy AJAX spider scan.\nDùng GitHub action nào cho mỗi test?",
    "explanation": "Đáp án: Test1 ZAP Baseline Scan; Test2 ZAP Full Scan\n\nĐề bài: Test1 spider App1 một phút, chờ passive scanning, không active attacks. Test2 spider rồi chạy AJAX spider scan.\n\nZAP Baseline Scan: spider ngắn và passive only, phù hợp CI, không active attack. ZAP Full Scan: spider đầy đủ, active scan và AJAX spider, coverage sâu hơn.\n\nKhông đảo hai action. Không dùng Baseline cho Test2 vì Baseline không phải full/AJAX theo yêu cầu Test2.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ZAP\" + \"no active attacks\" vs \"AJAX spider\" → Baseline Scan + Full Scan.\n",
    "boxes": {
      "1": {
        "label": "Test1:",
        "answer": "ZAP Baseline Scan"
      },
      "2": {
        "label": "Test2:",
        "answer": "ZAP Full Scan"
      }
    },
    "answerText": "ZAP Baseline Scan, ZAP Full Scan"
  },
  "201": {
    "stem": "Thiết kế quy trình phát triển cho công ty. Cần giải pháp continuous inspection codebase để tìm code patterns problematic đã biết. Nên đề xuất gì?",
    "options": {
      "A": "Microsoft Visual Studio test plans",
      "B": "Gradle wrapper scripts",
      "C": "SonarCloud analysis",
      "D": "the JavaScript task runner"
    },
    "explanation": "Đáp án: C — SonarCloud analysis\n\nĐề hỏi giải pháp continuous inspection trên codebase để phát hiện các code pattern đã biết là problematic.\n\nSonarCloud analysis đúng vì đây là dịch vụ cloud phân tích code quality và security, chạy tự động trong pipeline, so khớp source với rule set về bugs, code smells và vulnerabilities. Kết quả được theo dõi liên tục nên team phát hiện pattern xấu sớm trước khi vào production.\n\nMicrosoft Visual Studio test plans phục vụ test management và exploratory testing, không quét static pattern trên toàn bộ codebase. Gradle wrapper scripts chỉ chuẩn hóa cách gọi Gradle, không phải công cụ inspection. The JavaScript task runner (Grunt hoặc Gulp) tự động hóa task front-end, không cung cấp continuous inspection cho code quality.\n\nKeywords phản xạ nhanh (AZ-400)\n\"continuous inspection\" + \"common code patterns\" + \"problematic\" → SonarCloud analysis.\n",
    "answerText": "C"
  },
  "202": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario; không quay lại câu trước.\n\nLead developer báo thêm feature mất nhiều thời gian do technical debt tích lũy.\nGiải pháp: Giảm code coupling và dependency cycles.\nGiải pháp này có đáp ứng mục tiêu không?",
    "explanation": "Đáp án: A — Yes\n\nĐề nêu technical debt lớn làm chậm việc thêm feature, và giải pháp được đề xuất là giảm code coupling cùng dependency cycles.\n\nGiải pháp đáp ứng mục tiêu. Coupling cao khiến một thay đổi kéo theo nhiều module khác. Dependency cycles làm refactor và test khó hơn, tăng thời gian phát triển. Giảm coupling và phá cycle bằng abstraction, modularization giúp codebase dễ sửa, giảm chi phí bảo trì và từ đó giảm technical debt tích lũy.\n\nOption No sai vì giải pháp này trực tiếp xử lý nguyên nhân structural của debt, không phải thay đổi ngoài phạm vi mục tiêu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"technical debt\" + \"reduce code coupling\" + \"dependency cycles\" → Yes.\n",
    "answerText": "A"
  },
  "203": {
    "stem": "Công ty dùng Azure DevOps cho build/deployment Java. Cần chiến lược quản lý technical debt. Hai action nào nên có? (Chọn hai.)",
    "options": {
      "A": "Configure post-deployment approvals in the deployment pipeline.",
      "B": "Configure pre-deployment approvals in the deployment pipeline.",
      "C": "Integrate Azure DevOps and SonarQube.",
      "D": "Integrate Azure DevOps and Azure DevTest Labs."
    },
    "explanation": "Đáp án: B, C — Configure pre-deployment approvals; Integrate Azure DevOps and SonarQube\n\nĐề hỏi hai hành động để quản lý technical debt trên project Java dùng Azure DevOps pipelines.\n\nPre-deployment approvals tạo gate trước khi promote sang staging hoặc production. Reviewer có thể từ chối gói chứa debt mới trước khi ảnh hưởng môi trường quan trọng. Tích hợp Azure DevOps và SonarQube đưa static analysis vào build: bugs, code smells, vulnerabilities và debt metrics hiện ngay trong pipeline để team sửa sớm.\n\nConfigure post-deployment approvals xảy ra sau khi code đã deploy, không ngăn debt vào môi trường. Integrate Azure DevOps and Azure DevTest Labs tạo môi trường test, không đo hoặc quản lý technical debt trên source.\n\nKeywords phản xạ nhanh (AZ-400)\n\"manage technical debt\" + \"Java\" + \"Azure DevOps\" → pre-deployment approvals + SonarQube.\n",
    "answerText": "B,C"
  },
  "204": {
    "stem": "Công ty xây giải pháp Java mới, đang dùng SonarQube cho .NET. Cần phân tích và monitor code quality Java. Thêm task type nào vào build pipeline?",
    "options": {
      "A": "Gradle",
      "B": "CocoaPods",
      "C": "Grunt",
      "D": "Gulp"
    },
    "explanation": "Đáp án: A — Gradle\n\nĐề hỏi task type nào thêm vào build pipeline để SonarQube phân tích và theo dõi code quality của giải pháp Java, trong khi server hiện chỉ dùng cho .NET.\n\nGradle đúng vì đây là Java build tool: compile, resolve dependency, chạy test và xuất metadata. SonarQube scanner gắn vào Gradle lifecycle để nhận bytecode và project model rồi gửi metric lên server.\n\nCocoaPods là dependency manager cho Swift và Objective-C, không build Java. Grunt và Gulp là JavaScript task runner, phục vụ minification hoặc bundling front-end, không compile Java và không thay Gradle trong phân tích SonarQube.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Java solution\" + \"SonarQube\" + \"build pipeline task\" → Gradle.\n",
    "answerText": "A"
  },
  "205": {
    "stem": "Công ty dùng GitHub, lưu process documentation dạng Word (.bmp flowcharts). Cần tối ưu versioning:\n• Lưu plain text.\n• Tối thiểu số file.\n• Dễ sửa flowcharts.\nChọn format cho .docx và flowcharts.",
    "explanation": "Đáp án: Markdown (.md); Mermaid diagrams\n\nĐề cần tối ưu versioning cho process documentation đang là Word và flowchart .bmp: lưu plain text, ít file, dễ sửa, merge và tái sử dụng.\n\nConvert .docx sang Markdown (.md) vì GitHub diff, merge và review hoạt động tốt trên plain text. Convert flowchart sang Mermaid diagrams vì sơ đồ được viết bằng text trong cùng file Markdown, không cần file .bmp riêng, sửa và reuse bằng cách chỉnh code.\n\nGiữ Word hoặc .bmp làm tăng binary conflict, khó merge và tăng số file phải maintain. Các định dạng rich document khác không đáp ứng yêu cầu plain text và tối thiểu số file.\n\nKeywords phản xạ nhanh (AZ-400)\n\"plain text\" + \"flow charts\" + \"minimize files\" → Markdown (.md) + Mermaid diagrams.\n",
    "boxes": {
      "1": {
        "label": "Convert the .docx files to:",
        "answer": "Markdown (.md)"
      },
      "2": {
        "label": "Convert the flow charts to: ",
        "answer": "Mermaid diagrams"
      }
    },
    "answerText": "Markdown (.md), Mermaid diagrams"
  },
  "206": {
    "stem": "Công ty xây giải pháp Java, dùng SonarQube cho .NET. Cần phân tích code quality Java trong build pipeline. Thêm task type nào?",
    "options": {
      "A": "Grunt",
      "B": "Octopus",
      "C": "Maven",
      "D": "Gulp"
    },
    "explanation": "Đáp án: C — Maven\n\nĐề hỏi task type trong build pipeline để phân tích code quality Java bằng SonarQube server đang dùng cho .NET.\n\nMaven đúng vì đây là build automation chuẩn cho Java: compile, test, package và cung cấp classpath. Task Maven chạy SonarQube scanner plugin trong lifecycle rồi đẩy kết quả lên server để monitor.\n\nGrunt và Gulp xử lý JavaScript asset, không compile Java. Octopus là công cụ deployment, không thực hiện static analysis hay cung cấp input cho SonarQube.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Java\" + \"SonarQube\" + \"build pipeline\" → Maven.\n",
    "answerText": "C"
  },
  "207": {
    "stem": "Phát triển .NET Framework solution có unit tests. Cấu hình SonarQube validate chất lượng C# trong build pipeline. Bốn tasks theo thứ tự nào?",
    "explanation": "Đáp án: Prepare Analysis Configuration; Visual Studio Build; Visual Studio Test; Run Code Analysis\n\nĐề hỏi thứ tự bốn task để SonarQube kiểm tra chất lượng C# trên full .NET Framework solution có unit tests.\n\nPrepare Analysis Configuration phải chạy trước để gán project key, server và bắt begin step của scanner cho MSBuild. Visual Studio Build compile solution để scanner thu thập source và generated output. Visual Studio Test chạy unit test và coverage mà SonarQube cần. Run Code Analysis là end step, gửi kết quả lên SonarQube.\n\nĐảo thứ tự làm scanner thiếu begin/end hoặc thiếu coverage. Với .NET, không được bỏ Prepare Analysis Configuration hay Run Code Analysis như với Maven hoặc Gradle, vì scanner không tự gắn trong MSBuild nếu thiếu hai task đó.\n\nKeywords phản xạ nhanh (AZ-400)\n\"SonarQube\" + \".NET\" + \"C# pipeline\" → Prepare Analysis Configuration → Visual Studio Build → Visual Studio Test → Run Code Analysis.\n",
    "boxes": {
      "1": {
        "answer": "Prepare Analysis Configuration"
      },
      "2": {
        "answer": "Visual Studio Build"
      },
      "3": {
        "answer": "Visual Studio Test"
      },
      "4": {
        "answer": "Run Code Analysis"
      }
    },
    "answerText": "Prepare Analysis Configuration, Visual Studio Build, Visual Studio Test, Run Code Analysis"
  },
  "208": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario.\n\nLead developer báo technical debt làm chậm feature.\nGiải pháp: Tăng code duplication.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề cùng scenario technical debt làm chậm feature. Giải pháp đề xuất là tăng code duplication.\n\nGiải pháp không đáp ứng mục tiêu. Code duplication làm tăng technical debt: sửa bug phải lặp ở nhiều chỗ, feature mới phải chỉnh nhiều bản sao, rủi ro lệch logic tăng. Mục tiêu là giảm debt đã tích lũy, không phải thêm duplication.\n\nOption Yes sai vì tăng duplication đi ngược với giảm debt. Hướng đúng thường là giảm duplication, giảm complexity hoặc giảm coupling, không phải nhân bản code.\n\nKeywords phản xạ nhanh (AZ-400)\n\"technical debt\" + \"increasing the code duplication\" → No.\n",
    "answerText": "B"
  },
  "209": {
    "stem": "Cần tìm và tách shared code, duy trì qua packages. Ba actions theo thứ tự nào?",
    "explanation": "Đáp án: Create a dependency graph for the application; Group the related components; Assign ownership to each component group\n\nĐề hỏi ba bước theo thứ tự để tìm và tách shared code rồi maintain trong series of packages.\n\nDependency graph cho thấy module nào phụ thuộc nhau và đoạn code nào bị dùng chung. Group related components gom các phần shared thành nhóm ứng viên package. Assign ownership to each component group giao team chịu trách nhiệm versioning và breaking change cho từng package.\n\nLàm ownership trước khi hiểu dependency sẽ tách sai biên. Đóng gói ngay mà chưa group theo quan hệ dùng chung tạo package vụn hoặc circular dependency.\n\nKeywords phản xạ nhanh (AZ-400)\n\"isolate shared code\" + \"packages\" → dependency graph → group components → assign ownership.\n",
    "boxes": {
      "1": {
        "answer": "Create a dependency graph for the application."
      },
      "2": {
        "answer": "Group the related components."
      },
      "3": {
        "answer": "Assign ownership to each component group."
      }
    },
    "answerText": "Create a dependency graph for the application., Group the related components., Assign ownership to each component group."
  },
  "210": {
    "stem": "Tạo NuGet package, phân phối private cho dev team. Cần share và test package có thể consume. Bốn actions theo thứ tự nào?",
    "explanation": "Đáp án: Create a new Azure Artifacts feed; Publish a package; Connect to an Azure Artifacts feed; Install a package\n\nĐề hỏi bốn bước để chia sẻ NuGet package nội bộ và kiểm tra team có consume được.\n\nCreate a new Azure Artifacts feed tạo nơi lưu package riêng. Publish a package đưa nupkg lên feed. Connect to an Azure Artifacts feed cấu hình NuGet source trên máy hoặc Visual Studio. Install a package chứng minh consume thành công từ feed.\n\nInstall trước khi publish sẽ không có package. Connect trước khi có feed thì chưa có URL hợp lệ. Public nuget.org không đáp ứng phân phối private cho team.\n\nKeywords phản xạ nhanh (AZ-400)\n\"NuGet package\" + \"distribute privately\" + \"consumed\" → create feed → publish → connect → install.\n",
    "boxes": {
      "1": {
        "answer": "Create a new Azure Artifacts feed."
      },
      "2": {
        "answer": "Publish a package."
      },
      "3": {
        "answer": "Connect to an Azure Artifacts feed."
      },
      "4": {
        "answer": "Install a package."
      }
    },
    "answerText": "Create a new Azure Artifacts feed., Publish a package., Connect to an Azure Artifacts feed., Install a package."
  },
  "211": {
    "stem": "Cần đề xuất giải pháp cải thiện chất lượng code. Nên đề xuất gì?",
    "options": {
      "A": "In a Grunt build task, select Enabled from Control Options.",
      "B": "In a Maven build task, select Run PMD.",
      "C": "In a Xcode build task, select Use xcpretty from Advanced.",
      "D": "In a Gradle build task, select Run Checkstyle."
    },
    "explanation": "Đáp án: B — In a Maven build task, select Run PMD\n\nĐề hỏi khuyến nghị để cải thiện code quality trong pipeline.\n\nRun PMD trên Maven build task đúng vì PMD là static analysis cho Java, phát hiện unused variables, empty catch blocks và rule vi phạm khác ngay trong build. Bật Run PMD trên task Maven tích hợp sẵn Azure DevOps nên mỗi build đều chặn hoặc báo code kém chất lượng.\n\nIn a Grunt build task, select Enabled from Control Options chỉ bật task runner, không phân tích Java. In a Xcode build task, select Use xcpretty phục vụ format log iOS, không phải static analysis Java. In a Gradle build task, select Run Checkstyle là công cụ style khác; theo đáp án đề, lựa chọn khớp là Maven Run PMD.\n\nKeywords phản xạ nhanh (AZ-400)\n\"improve code quality\" + \"Maven\" + \"unused / empty catch\" → Run PMD.\n",
    "answerText": "B"
  },
  "212": {
    "stem": "Cần custom package available cho mọi developer: quản lý tập trung, latest version tự có trong Visual Studio. Ba actions nào? (Chọn ba.)",
    "options": {
      "A": "Publish the package to a feed",
      "B": "Create a new feed in Azure Artifacts.",
      "C": " Upload a package to a Git repository",
      "D": "Add the package URL to the Environment settings in Visual Studio",
      "E": "Add the package URL to the NuGet Package Manager settings in Visual Studio.",
      "F": "Create a Git repository in Azure Repos."
    },
    "explanation": "Đáp án: B, A, E — Create a new feed in Azure Artifacts; Publish the package to a feed; Add the package URL to the NuGet Package Manager settings in Visual Studio\n\nĐề cần đưa custom package cho mọi developer, quản lý tập trung, và Visual Studio tự thấy latest version.\n\nCreate a new feed in Azure Artifacts tạo kho trung tâm có quyền và retention. Publish the package to a feed đưa phiên bản lên kho đó. Add the package URL to the NuGet Package Manager settings in Visual Studio để IDE restore và cập nhật latest từ feed.\n\nUpload a package to a Git repository không phải package management tập trung và Visual Studio không tự consume như NuGet feed. Add the package URL to the Environment settings không phải chỗ cấu hình NuGet. Create a Git repository in Azure Repos lưu source, không phát hành package binary cho Package Manager.\n\nKeywords phản xạ nhanh (AZ-400)\n\"custom package\" + \"centrally\" + \"Visual Studio automatically\" → Azure Artifacts feed + publish + NuGet Package Manager URL.\n",
    "answerText": "B,A,E"
  },
  "213": {
    "stem": "Cần xóa file và toàn bộ history khỏi repository. Hai tool nào dùng được? (Chọn hai.)",
    "options": {
      "A": "the git filter-branch command",
      "B": "BFG Repo-Cleaner",
      "C": "the git rebase command",
      "D": "GitHub Desktop"
    },
    "explanation": "Đáp án: A, B — the git filter-branch command; BFG Repo-Cleaner\n\nĐề hỏi hai công cụ, mỗi cái là một giải pháp đủ, để xóa file và toàn bộ history khỏi repository.\n\nThe git filter-branch command viết lại mọi commit, có thể loại file khỏi từng snapshot nên history không còn chứa file. BFG Repo-Cleaner được thiết kế để xóa file lớn hoặc nhạy cảm trên toàn bộ history nhanh hơn filter-branch, rồi force-push bản đã làm sạch.\n\nThe git rebase command sắp xếp lại commit trên một nhánh, không phải công cụ chuẩn để tẩy file khỏi toàn bộ repo và mọi tag. GitHub Desktop không rewrite history để purge file đã commit.\n\nKeywords phản xạ nhanh (AZ-400)\n\"delete the file and its history\" → git filter-branch + BFG Repo-Cleaner.\n",
    "answerText": "A,B"
  },
  "214": {
    "stem": "GitHub source control, team code review. Tự động assign review:\n• Ưu tiên member có ít assignment đang mở nhất.\n• Mỗi member số review cân bằng trong 30 ngày.\n• Không assign team leader.\nHai action nào? (Chọn hai.)",
    "options": {
      "A": "Clear Never assign certain team members",
      "B": "Select If assigning team members, don't notify the entire team",
      "C": "Select Never assign certain team members.",
      "D": "Set Routing algorithm to Round robin.",
      "E": "Set Routing algorithm to Load balance"
    },
    "explanation": "Đáp án: C, E — Select Never assign certain team members; Set Routing algorithm to Load balance\n\nĐề cần tự động gán code review: ưu tiên người ít assignment đang mở, cân bằng số review trong 30 ngày, và không gán cho team leader.\n\nSelect Never assign certain team members loại team leader khỏi auto-assignment. Set Routing algorithm to Load balance phân phối theo workload hiện tại, nên người ít outstanding review được ưu tiên và theo thời gian mỗi người nhận số review tương đương.\n\nClear Never assign certain team members sẽ cho phép gán cả leader, trái yêu cầu. Select If assigning team members, don't notify the entire team chỉ đổi cách notify, không đổi thuật toán gán. Set Routing algorithm to Round robin xoay vòng cứng, không ưu tiên người ít việc đang mở như Load balance.\n\nKeywords phản xạ nhanh (AZ-400)\n\"fewest outstanding assignments\" + \"equal number\" + \"30-day\" + \"prevent team leader\" → Never assign certain team members + Load balance.\n",
    "answerText": "C,E"
  },
  "215": {
    "stem": "Có GitHub repository, tạo repository mới trong Azure DevOps. Cần quy trình clone/migrate từ GitHub sang Azure DevOps. Nên đề xuất gì?",
    "options": {
      "A": "Create a pull request.",
      "B": "Create a webhook.",
      "C": "Create a service connection for GitHub.",
      "D": "From Import a Git repository, click Import.",
      "E": "Create a personal access token in Azure DevOps."
    },
    "explanation": "Đáp án: D — From Import a Git repository, click Import\n\nĐề hỏi cách clone hoặc đưa GitHub repository sang repository mới trên Azure DevOps.\n\nFrom Import a Git repository, click Import là thao tác có sẵn trên Azure Repos: nhập URL GitHub, chuyển branches và history sang repo mới trong một bước.\n\nCreate a pull request dùng để review thay đổi giữa nhánh, không import repo. Create a webhook kích hoạt sự kiện, không sao chép history. Create a service connection for GitHub phục vụ pipeline hoặc board integration, không phải bước import. Create a personal access token in Azure DevOps tạo credential Azure DevOps; nếu cần PAT thì thường lấy từ GitHub để Azure DevOps đọc source, và PAT một mình không hoàn tất clone.\n\nKeywords phản xạ nhanh (AZ-400)\n\"clone\" + \"GitHub\" + \"Azure DevOps\" → Import a Git repository → Import.\n",
    "answerText": "D"
  },
  "216": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario.\n\nTechnical debt làm chậm feature.\nGiải pháp: Tăng code duplication.\nCó đáp ứng mục tiêu không?",
    "explanation": "Đáp án: B — No\n\nĐề cùng scenario giảm technical debt. Giải pháp: tăng code duplication.\n\nGiải pháp không đạt mục tiêu. Duplication nhân bản logic, làm bảo trì và thêm feature chậm hơn, tức là tăng debt chứ không giảm. Cần giảm duplication và cải thiện thiết kế, không tăng bản sao code.\n\nOption Yes sai vì hành động này đi ngược mục tiêu giảm accumulated technical debt.\n\nKeywords phản xạ nhanh (AZ-400)\n\"technical debt\" + \"increasing the code duplication\" → No.\n",
    "answerText": "B"
  },
  "217": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario.\n\nGiải pháp: Tăng test coverage.\nCó giảm technical debt hiện có không?",
    "explanation": "Đáp án: B — No\n\nĐề cùng scenario giảm technical debt đã tích lũy. Giải pháp: tăng test coverage.\n\nGiải pháp không đạt mục tiêu. Tăng test coverage giúp phát hiện hồi quy và hạn chế debt mới, nhưng không xóa shortcuts, complexity hay design kém đã có trong code. Debt hiện tại vẫn còn cho đến khi được refactor.\n\nOption Yes sai vì coverage là kiểm soát chất lượng về sau, không phải hành động giảm debt đã tích lũy như giảm complexity hoặc coupling.\n\nKeywords phản xạ nhanh (AZ-400)\n\"technical debt\" + \"increasing the test coverage\" → No.\n",
    "answerText": "B"
  },
  "218": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario.\n\nGiải pháp: Giảm code complexity.\nCó đáp ứng mục tiêu không?",
    "explanation": "Đáp án: A — Yes\n\nĐề cùng scenario giảm technical debt. Giải pháp: giảm code complexity.\n\nGiải pháp đạt mục tiêu. Code phức tạp khó hiểu, khó sửa và dễ lỗi, làm thêm feature chậm. Giảm complexity bằng tách hàm, đơn giản hóa điều kiện và refactor giúp bảo trì nhanh hơn, đó chính là giảm technical debt.\n\nOption No sai vì giảm complexity là một trong những cách trực tiếp để xử lý debt đã tích lũy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"technical debt\" + \"reducing the code complexity\" → Yes.\n",
    "answerText": "A"
  },
  "219": {
    "stem": "Cần phát hiện unused variables và empty catch blocks. Nên đề xuất gì?",
    "options": {
      "A": "In a Maven build task, select Run PMD.",
      "B": "In an Xcode build task, select Use xcpretty from Advanced.",
      "C": "In a Gulp build task, specify a custom condition expression.",
      "D": "In a Grunt build task, select Enabled from Control Options."
    },
    "explanation": "Đáp án: A — In a Maven build task, select Run PMD\n\nĐề hỏi cách phát hiện quality issues gồm unused variables và empty catch blocks.\n\nRun PMD trên Maven build task đúng vì PMD có rule đúng các lỗi đó trên Java và Azure DevOps Maven task có sẵn tùy chọn Run PMD, chạy mỗi build.\n\nIn an Xcode build task, select Use xcpretty chỉ làm đẹp log Xcode, không phân tích Java. In a Gulp build task, specify a custom condition expression điều khiển khi nào task chạy, không quét unused variable. In a Grunt build task, select Enabled from Control Options chỉ bật task, không phải static analysis PMD.\n\nKeywords phản xạ nhanh (AZ-400)\n\"unused variables\" + \"empty catch blocks\" → Maven Run PMD.\n",
    "answerText": "A"
  },
  "220": {
    "stem": "Cần một package available cho anonymous users ngoài organization, tối thiểu publication points. Nên làm gì?",
    "options": {
      "A": "Change the feed URL of the package",
      "B": "Create a new feed for the package",
      "C": "Promote the package to a release view.",
      "D": "Publish the package to a public NuGet repository."
    },
    "explanation": "Đáp án: D — Publish the package to a public NuGet repository\n\nĐề cần cho anonymous users ngoài tổ chức lấy một package, và giảm số publication points.\n\nPublish the package to a public NuGet repository (ví dụ nuget.org) cho phép tải không đăng nhập từ một điểm công khai duy nhất, không cần cấp quyền Azure DevOps.\n\nChange the feed URL of the package không tự mở anonymous access. Create a new feed for the package thêm publication point và vẫn phải quản lý quyền. Promote the package to a release view chỉ lọc phiên bản trên feed nội bộ, không biến package thành anonymous public.\n\nKeywords phản xạ nhanh (AZ-400)\n\"anonymous users\" + \"minimize publication points\" → public NuGet repository.\n",
    "answerText": "D"
  },
  "221": {
    "stem": "Cần chỉ nhận email notifications cho discussions bạn đã comment hoặc được mention. Hai Notifications settings nào nên tắt? (Chọn hai.)",
    "options": {
      "A": "Automatically watch teams",
      "B": "Participating",
      "C": "Automatically watch repositories",
      "D": "Watching"
    },
    "explanation": "Đáp án: B, D — Participating; Watching\n\nĐề hỏi hai Notifications settings cần clear để chỉ còn email khi bạn đã comment hoặc được mention trong discussion.\n\nClear Participating và Watching theo answer key để tắt luồng thông báo rộng trên discussion và repo bạn theo dõi. Sau khi tắt hai nhóm này, hộp thư không còn đầy activity mà bạn không được gọi tên hoặc không chủ động tham gia theo cách đề yêu cầu.\n\nAutomatically watch teams và Automatically watch repositories cũng có thể tạo thông báo nền, nhưng không phải hai lựa chọn được chọn trong key. Giữ Participating nếu đề chỉ muốn mail khi bạn đã comment; ở câu này key yêu cầu clear Participating cùng Watching.\n\nKeywords phản xạ nhanh (AZ-400)\n\"email only\" + \"commented\" + \"mentioned\" + \"clear\" → Participating + Watching.\n",
    "answerText": "B,D"
  },
  "222": {
    "stem": "Azure Automation account có runbook cấu hình infrastructure. Project1 Azure DevOps lưu code runbook. Mỗi commit phải tự cập nhật và publish runbook lên Automation. Cấu hình gì?",
    "options": {
      "A": "the Service hooks settings for Project1",
      "B": "the Connections settings for the Automation account",
      "C": "the Source control settings for the Automation account",
      "D": "the Service connections settings for Project1"
    },
    "explanation": "Đáp án: C — the Source control settings for the Automation account\n\nĐề cần mỗi commit trên repo Azure DevOps của runbook tự cập nhật và publish runbook lên Azure Automation.\n\nSource control settings của Automation account gắn repo, đồng bộ file runbook khi có commit và publish bản mới. Đây là liên kết trực tiếp giữa source và Automation, không cần pipeline riêng.\n\nThe Service hooks settings for Project1 chỉ bắn sự kiện ra ngoài, không publish runbook. The Connections settings for the Automation account lưu credential để runbook gọi hệ thống khác, không kéo source. The Service connections settings for Project1 phục vụ Azure Pipelines deploy, không phải cơ chế sync runbook native của Automation.\n\nKeywords phản xạ nhanh (AZ-400)\n\"runbook\" + \"every committed change\" + \"publish\" + \"Azure Automation\" → Source control settings.\n",
    "answerText": "C"
  },
  "223": {
    "stem": "Cần code scanning hoàn thành thành công cho pull request. Hai action nào? (Chọn hai.)",
    "options": {
      "A": "Add the name of the default branch to the on: push specification in the code scanning workflow",
      "B": "Add the name of the non-default branch to the on:push specification in the code scanning workflow.",
      "C": "Delete the pull request, and then raise the request again from the default branch.",
      "D": "Update the code in the pull request.",
      "E": "Add a new workflow for code scanning."
    },
    "explanation": "Đáp án: B, D — Add the name of the non-default branch to the on:push specification; Update the code in the pull request\n\nĐề cần code scanning hoàn tất thành công cho pull request (thường gặp lỗi Analysis not found từ nhánh không phải default).\n\nAdd the name of the non-default branch to the on:push specification để workflow GitHub Actions chạy khi đẩy lên nhánh nguồn của PR, tạo analysis mà check PR cần. Update the code in the pull request tạo commit mới, kích hoạt lại scan trên head hiện tại.\n\nAdd the name of the default branch to on:push không khắc phục nhánh feature thiếu scan. Delete the pull request and raise again from the default branch phá quy trình review trên feature branch. Add a new workflow for code scanning không bắt buộc nếu đã có workflow, chỉ cần sửa trigger và chạy lại.\n\nKeywords phản xạ nhanh (AZ-400)\n\"code scanning\" + \"pull request\" + \"non-default branch\" → on:push non-default branch + update the code.\n",
    "answerText": "B,D"
  },
  "224": {
    "stem": "GitHub repo repo1, app App1. Deploy workflow GitHub Actions:\n• Scan push lên main.\n• Scan PR vào main.\n• Scan PR vào branch prefix releases/.\n• Scan files trong src/**.\n• Loại trừ markdown.\nHoàn thành code thế nào?",
    "explanation": "Đáp án: 'releases/**'; 'src/**'; '**/*.md'\n\nĐề hoàn thiện GitHub Actions workflow: scan push và PR vào main, PR vào nhánh prefix releases/, quét file dưới src, loại markdown.\n\n'releases/**' đi vào danh sách branch của pull_request để khớp mọi nhánh releases/. 'src/**' trong paths giới hạn scan vào thư mục src và con. '**/*.md' trong paths-ignore loại mọi file Markdown.\n\nDùng 'releases/*' một cấp hoặc chỉ 'src' sẽ trượt nhánh lồng hoặc file sâu. Đưa '*.md' quá hẹp hoặc quên paths-ignore sẽ vẫn scan tài liệu. main đã được nêu riêng trong yêu cầu push/PR, không thay 'releases/**'.\n\nKeywords phản xạ nhanh (AZ-400)\n\"releases/\" + \"src directory\" + \"exclude markdown\" → 'releases/**' + 'src/**' + '**/*.md'.\n",
    "boxes": {
      "1": {
        "answer": "'releases/**'"
      },
      "2": {
        "answer": "'src/**'"
      },
      "3": {
        "answer": "'**/*.md'"
      }
    },
    "answerText": "'releases/**', 'src/**', '**/*.md'"
  },
  "225": {
    "stem": "GitHub repo chứa nhiều version Azure Pipelines template. Deploy nhiều pipeline dùng template — cần fixed version. Dùng gì để reference version template repo?",
    "options": {
      "A": "the serial",
      "B": "the SHA-based hashes",
      "C": "the runner",
      "D": "the branch"
    },
    "explanation": "Đáp án: D — the branch\n\nĐề cần reference một phiên bản cố định của Azure Pipelines template đang nằm trên GitHub khi nhiều pipeline dùng chung.\n\nThe branch cho phép pin template vào một nhánh cụ thể, ví dụ release/1.0, nên mọi pipeline lấy cùng snapshot có thể quản lý được và vẫn cập nhật có kiểm soát khi nhánh đó thay đổi.\n\nThe serial không phải cách version GitHub repo. The SHA-based hashes pin đúng một commit nhưng cực khó bảo trì khi phải sửa template trên nhiều pipeline. The runner là máy chạy job, không chọn phiên bản template.\n\nKeywords phản xạ nhanh (AZ-400)\n\"fixed version\" + \"template repository\" → the branch.\n",
    "answerText": "D"
  },
  "226": {
    "stem": "Migrate nội dung GitHub repository sang Azure Repos, Azure Repos chỉ chứa branches và history từ GitHub. Ba lệnh theo thứ tự nào?",
    "explanation": "Đáp án: git clone --bare; cd project1.git; git push --mirror\n\nĐề migrate nội dung GitHub sang Azure Repos và Azure Repos chỉ chứa branches cùng history từ GitHub.\n\ngit clone --bare lấy toàn bộ refs mà không có working tree. cd project1.git vào bare repo. git push --mirror đẩy mọi refs lên Azure Repos, thay thế remote cho khớp nguồn, không lẫn local-only branch.\n\nClone thường rồi push origin thiếu mirror có thể thiếu tags hoặc không overwrite đủ refs. Fetch từng nhánh thủ công dễ sót history. Không dùng --bare và --mirror thì repo đích có thể còn ref không thuộc GitHub.\n\nKeywords phản xạ nhanh (AZ-400)\n\"migrate GitHub\" + \"only branches and history\" → git clone --bare → git push --mirror.\n",
    "boxes": {
      "1": {
        "answer": "git clone --bare https://github.com/contoso/project1.git"
      },
      "2": {
        "answer": "cd project1.git"
      },
      "3": {
        "answer": "git push --mirror https://dev.azure.com/contoso/project1/_git/proj"
      }
    },
    "answerText": "git clone --bare https://github.com/contoso/project1.git, cd project1.git, git push --mirror https://dev.azure.com/contoso/project1/_git/proj"
  },
  "227": {
    "stem": "Migrate GitHub repository sang Azure Repos (xem bảng repositories). Azure Repos chỉ chứa branches/history từ GitHub. Hoàn thành lệnh git submodule?",
    "explanation": "Đáp án: submodule; add\n\nĐề cần giữ clone của repo thư viện afeed như subdirectory bên trong repo App1.\n\nCú pháp đúng là git submodule add <url>. Submodule ghi nhận commit của repo khác trong thư mục con, vẫn tách history, đúng yêu cầu giữ clone afeed trong App1.\n\nSubtree nhúng history khác đi. Clone thủ công rồi commit source sẽ mất liên kết update từ upstream. Không dùng add thì submodule chưa được đăng ký trong .gitmodules.\n\nKeywords phản xạ nhanh (AZ-400)\n\"clone\" + \"subdirectory\" + \"another repository\" → git submodule add.\n",
    "boxes": {
      "1": {
        "answer": "submodule"
      },
      "2": {
        "answer": "add"
      }
    },
    "answerText": "submodule, add"
  },
  "228": {
    "stem": "Dùng Git source control. Tối ưu performance repository:\n• Xóa vĩnh viễn mọi item chỉ còn trong reflog.\n• Xóa history không thuộc branch hiện tại.\nHoàn thành lệnh?",
    "explanation": "Đáp án: reflog; gc; now\n\nĐề tối ưu performance repo: xóa vĩnh viễn object chỉ còn trong reflog, và xóa history không thuộc nhánh hiện tại.\n\ngit reflog expire --expire-unreachable=now --all bỏ entry reflog, kể cả unreachable, ngay lập tức. git gc --prune=now chạy garbage collection và xóa object không reachable khỏi pack, tức history không còn trên branch nào.\n\nexpire không đi với gc ở vị trí thứ nhất. prune=now không thể thay bằng expire cũ vì object có thể bị giữ theo grace period. Các lệnh checkout hoặc reset không dọn dangling object trên toàn repo.\n\nKeywords phản xạ nhanh (AZ-400)\n\"remove reflog\" + \"history NOT in any current branch\" → git reflog expire --all + git gc --prune=now.\n",
    "boxes": {
      "1": {
        "answer": "reflog"
      },
      "2": {
        "answer": "gc"
      },
      "3": {
        "answer": "now"
      }
    },
    "answerText": "reflog, gc, now"
  },
  "229": {
    "stem": "Azure Repos Git repo repo1. Cần authenticate bằng SSH. Bốn actions theo thứ tự nào? (Nhiều thứ tự có thể đúng.)",
    "explanation": "Đáp án: Create SSH keys by using ssh-keygen; Sign in to Azure DevOps; Add the SSH public key; Clone repo1\n\nĐề hỏi bốn bước để authenticate Azure Repos repo1 bằng SSH.\n\nCreate SSH keys by using ssh-keygen tạo cặp khóa. Sign in to Azure DevOps để vào user SSH settings. Add the SSH public key đăng ký khóa với tài khoản. Clone repo1 bằng SSH URL để kiểm tra xác thực.\n\nClone trước khi add public key sẽ bị từ chối. Chỉ tạo key mà không upload public key thì server không nhận diện client. Không cần private key đưa lên Azure DevOps; chỉ public key được thêm.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Repos\" + \"authenticate\" + \"SSH\" → ssh-keygen → sign in → add public key → clone.\n",
    "boxes": {
      "1": {
        "answer": "Create SSH keys by using ssh-keygen"
      },
      "2": {
        "answer": "Sign in to Azure DevOps."
      },
      "3": {
        "answer": "Add the SSH public key."
      },
      "4": {
        "answer": "Clone repo1."
      }
    },
    "answerText": "Create SSH keys by using ssh-keygen, Sign in to Azure DevOps., Add the SSH public key., Clone repo1."
  },
  "230": {
    "stem": "Dùng Git, xóa file và commit, tiếp tục làm việc. Cần recover file đã xóa. Ba lệnh theo thứ tự nào?",
    "explanation": "Đáp án: git log; git checkout [hash]~1 --path/to/file; git commit -m 'undeleted the file'\n\nĐề đã xóa file, commit rồi tiếp tục làm việc, cần khôi phục file.\n\ngit log tìm commit chứa lần xóa. git checkout [hash]~1 --path/to/file lấy lại nội dung file từ commit ngay trước lần xóa. git commit -m 'undeleted the file' ghi file trở lại nhánh hiện tại mà không rewrite toàn bộ history.\n\nRevert cả commit có thể hoàn tác thay đổi khác trong cùng commit. Reset --hard mất việc đã làm sau đó. Checkout không chỉ định path có thể đưa cả working tree về trạng thái cũ.\n\nKeywords phản xạ nhanh (AZ-400)\n\"recover the deleted file\" + \"already committed\" → git log → git checkout [hash]~1 --path → git commit.\n",
    "boxes": {
      "1": {
        "answer": "git log"
      },
      "2": {
        "answer": "git checkout [hash]~1 --path/to/file"
      },
      "3": {
        "answer": "git commit -m 'undeleted the file'"
      }
    },
    "answerText": "git log, git checkout [hash]~1 --path/to/file, git commit -m 'undeleted the file'"
  },
  "231": {
    "stem": "Dùng Git, app App1. Trên main branch, restore revision thứ ba gần nhất của App.exe.config. Hoàn thành lệnh?",
    "explanation": "Đáp án: checkout; --source\n\nĐề trên main cần khôi phục revision thứ ba gần nhất của App.exe.config.\n\ngit checkout main đặt working tree trên main. git restore --source main~3 App.exe.config lấy đúng file từ commit main~3, tức ba revision trước HEAD của main.\n\nrestore không có --source sẽ lấy từ index hoặc HEAD hiện tại, không phải revision thứ ba. checkout một mình không chọn ancestor của file. main~2 hoặc HEAD không khớp \"third most recent\".\n\nKeywords phản xạ nhanh (AZ-400)\n\"third most recent revision\" + \"file\" → git restore --source main~3.\n",
    "boxes": {
      "1": {
        "answer": "checkout"
      },
      "2": {
        "answer": "--source"
      }
    },
    "answerText": "checkout, --source"
  },
  "232": {
    "stem": "Công ty dùng Git repository. Triển khai GitFlow. Branch type nào cho production code và preproduction code?",
    "explanation": "Đáp án: Main; Develop\n\nĐề triển khai GitFlow và hỏi branch type cho production code và preproduction code.\n\nProduction code nằm trên Main (main hoặc master): chỉ nhận release đã ổn định, hotfix có kiểm soát. Preproduction code nằm trên Develop: nhánh tích hợp dài hạn trước khi cắt release.\n\nFeature branch chỉ cho một thay đổi ngắn, không giữ production. Release branch là cửa cuối trước production, không phải nơi tích hợp preproduction thường xuyên. Hotfix không phải nhánh preproduction chính.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitFlow\" + \"production\" + \"preproduction\" → Main + Develop.\n",
    "boxes": {
      "1": {
        "label": "Production code: ",
        "answer": "Main"
      },
      "2": {
        "label": "Preproduction code: ",
        "answer": "Develop"
      }
    },
    "answerText": "Main, Develop"
  },
  "233": {
    "stem": "Azure Repos repo1. Clone chỉ thư mục src/web. Hoàn thành script?",
    "explanation": "Đáp án: https://dev.azure.com/organization/project/_git/repo1; repo1/src; web\n\nĐề clone Azure Repos repo1 nhưng chỉ lấy directory src/web.\n\nscalar clone với URL repo tải repo theo kiểu partial/scalar. cd repo1/src đưa working directory tới src. git sparse-checkout set web giới hạn tree còn thư mục web, tức src/web.\n\nClone full rồi xóa tay vẫn tải thừa data. sparse-checkout set src/web khi đang ở root có thể khác script đề cho (cd repo1/src rồi set web). Không dùng scalar thì chưa tối ưu lượng data ban đầu như đề hướng tới.\n\nKeywords phản xạ nhanh (AZ-400)\n\"clone only\" + \"src/web\" → scalar clone + git sparse-checkout set web.\n",
    "boxes": {
      "1": {
        "answer": "https://dev.azure.com/organization/project/_git/repo1"
      },
      "2": {
        "answer": "repo1/src"
      },
      "3": {
        "answer": "web"
      }
    },
    "answerText": "https://dev.azure.com/organization/project/_git/repo1, repo1/src, web"
  },
  "234": {
    "stem": "Cần gửi notification tới Teams channel cho mỗi commit, tối thiểu dev effort. Nên làm gì?",
    "options": {
      "A": "Use Azure Automation to connect to the GitHub Actions API and send a message to the Teams channel.",
      "B": "Use the Microsoft Teams for GitHub app and configure a subscription to receive notifications in the Teams channel.",
      "C": "Use GitHub Actions with a dispatch to send a message to the Teams channel by using the Teams API.",
      "D": "Use Azure Functions to connect to the GitHub REST API and send a message to the Teams channel."
    },
    "explanation": "Đáp án: B — Use the Microsoft Teams for GitHub app and configure a subscription\n\nĐề gửi thông báo vào Teams channel cho mỗi commit, giảm development effort.\n\nMicrosoft Teams for GitHub app là tích hợp sẵn: chọn repo, subscribe event commit, message vào channel, không viết code.\n\nUse Azure Automation to connect to the GitHub Actions API đòi hỏi runbook và auth. Use GitHub Actions with a dispatch to the Teams API phải viết workflow và gọi API. Use Azure Functions to connect to the GitHub REST API cũng là custom integration. Cả ba tốn công hơn app có sẵn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Teams channel\" + \"each commit\" + \"minimize development effort\" → Microsoft Teams for GitHub app.\n",
    "answerText": "B"
  },
  "235": {
    "stem": "Cần PowerShell script chạy tự động trước rebase operations. Dùng gì?",
    "options": {
      "A": "a package",
      "B": "GitHub Copilot",
      "C": "a webhook",
      "D": "a gist"
    },
    "explanation": "Đáp án: C — a webhook\n\nĐề cần PowerShell script chạy tự động trước các thao tác rebase.\n\nA webhook là cơ chế event-driven trong các lựa chọn: đăng ký sự kiện Git, gọi endpoint hoặc automation để chạy PowerShell khi rebase hoặc sự kiện tương đương được phát. Theo answer key, webhook là cách tự động hóa script gắn với thao tác đó.\n\nA package chỉ đóng gói thư viện, không kích hoạt trước rebase. GitHub Copilot gợi ý code, không chạy script theo sự kiện repo. A gist lưu snippet, không có trigger.\n\nKeywords phản xạ nhanh (AZ-400)\n\"PowerShell\" + \"automatically\" + \"before rebase\" → webhook.\n",
    "answerText": "C"
  },
  "236": {
    "stem": "repo1 GitHub migrate sang repo2 Azure Repos. Sau migration repo1 có thay đổi. Cần sync sang repo2. Hoàn thành script?",
    "explanation": "Đáp án: repo2 clone URL; repo2; repo1 clone URL\n\nĐề đã migrate GitHub repo1 sang Azure Repos repo2, sau đó repo1 vẫn đổi, cần sync sang repo2.\n\ngit clone --bare <repo2 clone URL> tạo bản bare của đích. cd repo2 vào bare repo. git remote add --mirror=fetch upstream <repo1 clone URL> rồi fetch/push để lấy thay đổi mới từ GitHub vào Azure Repos.\n\nĐảo URL sẽ đẩy nhầm chiều. Clone repo1 làm đích rồi add repo2 như upstream đảo vai trò source/target. Không dùng --mirror=fetch dễ thiếu refs khi sync.\n\nKeywords phản xạ nhanh (AZ-400)\n\"migrate\" + \"sync changes\" + \"repo1 to repo2\" → clone bare repo2 + remote upstream repo1.\n",
    "boxes": {
      "1": {
        "answer": "repo2 clone URL"
      },
      "2": {
        "answer": "repo2"
      },
      "3": {
        "answer": "repo1 clone URL"
      }
    },
    "answerText": "repo2 clone URL, repo2, repo1 clone URL"
  },
  "237": {
    "stem": "Azure Repos repo1, xóa branch features/feature11. Cần recover branch. Ba lệnh theo thứ tự?",
    "explanation": "Đáp án: git log; git checkout <SHA1>; git branch features/feature11\n\nĐề đã xóa branch features/feature11 trên Azure Repos và cần khôi phục.\n\ngit log (hoặc reflog trên máy đã từng checkout) tìm SHA1 tip của nhánh đã xóa. git checkout <SHA1> đưa HEAD tới commit đó. git branch features/feature11 tạo lại tên nhánh tại commit vừa tìm.\n\nTạo branch trước khi biết SHA sẽ trỏ nhầm tip. Chỉ checkout không đặt lại tên nhánh. Reset nhánh khác sang SHA có thể làm mất tip hiện tại của nhánh đó.\n\nKeywords phản xạ nhanh (AZ-400)\n\"recover the deleted branch\" → git log → git checkout SHA → git branch <name>.\n",
    "boxes": {
      "1": {
        "answer": "git log"
      },
      "2": {
        "answer": "git checkout  <SHA1>"
      },
      "3": {
        "answer": "git branch features/feature11"
      }
    },
    "answerText": "git log, git checkout  <SHA1>, git branch features/feature11"
  },
  "238": {
    "stem": "App1 version 11.2.0. Sửa bug từ version 10.5.1. Gán version number nào cho release?",
    "options": {
      "A": "10.5.1-PATCH",
      "B": "11.2.1",
      "C": "10.5.2",
      "D": "10.6.0"
    },
    "explanation": "Đáp án: B — 11.2.1\n\nĐề App1 đang là 11.2.0, sửa bug vốn xuất hiện từ 10.5.1, hỏi version của release hiện tại.\n\nSemantic Versioning dùng MAJOR.MINOR.PATCH. Sửa bug trên dòng 11.2.0 là patch, tăng PATCH thành 11.2.1.\n\n10.5.1-PATCH không phải SemVer ổn định cho release hiện tại. 10.5.2 chỉ đúng nếu phát hành trên dòng 10.5, không phải bản đang ship 11.2.0. 10.6.0 vừa tụt major/minor vừa gợi ý feature mới, không khớp bugfix trên 11.2.0.\n\nKeywords phản xạ nhanh (AZ-400)\n\"current version 11.2.0\" + \"bug fix\" → 11.2.1.\n",
    "answerText": "B"
  },
  "239": {
    "stem": "Azure Repos có file PSD lớn. Cấu hình Git LFS quản lý tất cả. Hoàn thành script?",
    "explanation": "Đáp án: git lfs track '*.psd'; git lfs migrate import --include='.psd' --everything; git push\n\nĐề cấu hình Git LFS cho mọi file PSD lớn đã có trong Azure Repos.\n\ngit lfs track '*.psd' đăng ký pattern cho commit mới. git lfs migrate import --include='.psd' --everything viết lại history để PSD cũ thành pointer LFS. git push đưa history đã migrate và object LFS lên remote.\n\nChỉ track thì file cũ trong history vẫn là blob Git. Migrate mà không push thì remote vẫn phình. Push trước migrate sẽ đẩy bản chưa LFS.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Git LFS\" + \"large PSD\" + \"all the files\" → lfs track → lfs migrate import --everything → git push.\n",
    "boxes": {
      "1": {
        "answer": "git lfs track &quot;*.psd&quot;"
      },
      "2": {
        "answer": "git lfs migrate import --include=&quot;.psd&quot; --everything"
      },
      "3": {
        "answer": "git push"
      }
    },
    "answerText": "git lfs track &quot;*.psd&quot;, git lfs migrate import --include=&quot;.psd&quot; --everything, git push"
  },
  "240": {
    "stem": "Quản lý code bằng GitHub. Cần owner được notify khi phát hiện vulnerable dependency hoặc malware trong repo. Nên làm gì?",
    "options": {
      "A": "Configure CodeQL scanning actions.",
      "B": "Configure Dependabot alerts.",
      "C": "Configure branch protection rules for each repository.",
      "D": "Subscribe all the repository owners to the GitHub Advisory Database."
    },
    "explanation": "Đáp án: B — Configure Dependabot alerts\n\nĐề cần repository owners được báo nếu xuất hiện vulnerable dependency hoặc malware trong repo GitHub.\n\nConfigure Dependabot alerts đúng vì Dependabot theo dependency graph, so với advisory và cảnh báo owner khi dependency yếu hoặc độc.\n\nConfigure CodeQL scanning actions quét source của bạn, không phải kênh chính cho vulnerable dependency. Configure branch protection rules kiểm soát merge, không phát hiện malware trong package. Subscribe owners to the GitHub Advisory Database đưa advisory chung, owner phải tự đối chiếu manifest, không tự động theo từng repo.\n\nKeywords phản xạ nhanh (AZ-400)\n\"vulnerable dependency\" + \"malware\" + \"notify owners\" → Dependabot alerts.\n",
    "answerText": "B"
  },
  "241": {
    "stem": "Public GitHub repo Public1. Commit chứa pattern khớp regex (secret scanning). Ai được notify đầu tiên?",
    "options": {
      "A": "the administrator of the GitHub organization",
      "B": "the committer",
      "C": "the owner of Public1",
      "D": "the secret scanning partner"
    },
    "explanation": "Đáp án: D — the secret scanning partner\n\nĐề repo public Public1 có commit khớp regular expression (thường là secret). Ai được notify trước?\n\nThe secret scanning partner được GitHub thông báo trước để partner thu hồi credential trên hệ thống của họ, giảm cửa sổ lạm dụng trên repo công khai.\n\nThe administrator of the GitHub organization, the committer và the owner of Public1 có thể nhận alert sau, nhưng không phải bên được gọi đầu tiên trong luồng partner secret scanning.\n\nKeywords phản xạ nhanh (AZ-400)\n\"public GitHub\" + \"commit\" + \"regular expression\" + \"notified first\" → secret scanning partner.\n",
    "answerText": "D"
  },
  "242": {
    "stem": "GitHub repository. Cần scan toàn bộ code tìm vulnerabilities. Dùng gì?",
    "options": {
      "A": "Dependabot alerts",
      "B": "branch protection rules",
      "C": "CodeQL actions",
      "D": "GitHub Advisory Database databases"
    },
    "explanation": "Đáp án: C — CodeQL actions\n\nĐề cần quét toàn bộ code trong GitHub repository để tìm vulnerabilities.\n\nCodeQL actions chạy static analysis ngữ nghĩa trên source trong GitHub Actions, đúng yêu cầu scan code của repo.\n\nDependabot alerts theo dõi dependency, không quét logic trong source. Branch protection rules bắt review hoặc status, không tự scan. GitHub Advisory Database lưu advisory đã biết, không quét repo.\n\nKeywords phản xạ nhanh (AZ-400)\n\"all the code\" + \"scanned for vulnerabilities\" → CodeQL actions.\n",
    "answerText": "C"
  },
  "243": {
    "stem": "Tạo Git repo Repo1 trong Azure Repos. Cấu hình:\n• Work items link với PR.\n• PR tối thiểu hai reviewers.\n• PR hoàn thành code review bằng third-party tool.\n• Tối thiểu admin effort.\nPolicy type nào cho từng yêu cầu?",
    "explanation": "Đáp án: Branch; Status; Branch\n\nĐề cấu hình Azure Repos Git: PR phải link work item, tối thiểu hai reviewer, và hoàn tất code review bằng third-party tool, giảm administrative effort.\n\nWork items must be linked dùng Branch policy (Check for linked work items). Third-party review dùng Status policy vì công cụ gửi status check qua API và PR bị chặn đến khi succeeded. Minimum of two reviewers cũng là Branch policy (Require a minimum number of reviewers).\n\nCheck-in policy chỉ cho TFVC, không dùng cho Git. Required reviewer từng người thủ công tốn admin hơn policy trên branch. Build policy không thay status từ tool ngoài nếu đề nhấn third-party review.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Git\" + \"linked work items\" + \"two reviewers\" → Branch policy. \"third-party tool\" → Status policy.\n",
    "boxes": {
      "1": {
        "label": "Work items must be linked to a pull request:",
        "answer": "Check-in"
      },
      "2": {
        "label": "Pull requests must complete a code review by a third party tool:",
        "answer": "Status"
      },
      "3": {
        "label": "Pull requests must have a minimum of two reviewers:",
        "answer": "Branch"
      }
    },
    "answerText": "Check-in, Status, Branch"
  },
  "244": {
    "stem": "Azure Repos repo1 1-TB. Clone repo với:\n• Search commit history thư mục /src.\n• Tối thiểu thời gian clone.\nChạy lệnh nào?",
    "options": {
      "A": "git clone –-depth-1 [email protected]:v3/org/Project1/repo1",
      "B": "git clone –-filter=blob:none [email protected]:v3/org/Project1/repo1",
      "C": "git clone [email protected]:v3/org/Project1/repo1",
      "D": "git clone –-filter=true:0 [email protected]:v3/org/Project1/repo1"
    },
    "explanation": "Đáp án: B — git clone --filter=blob:none\n\nĐề clone repo Azure Repos 1 TB, vẫn search được commit history của /src, và giảm thời gian clone.\n\ngit clone --filter=blob:none là partial clone: lấy commit và tree, bỏ blob nội dung file lúc đầu. History của /src vẫn tra được; blob tải khi cần, nên nhanh hơn full clone.\n\ngit clone --depth-1 là shallow clone, mất history cũ nên không search đủ commit của /src. git clone đầy đủ tải 1 TB, chậm. git clone --filter=true:0 không phải filter hợp lệ cho yêu cầu này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"1-TB\" + \"search commit history\" + \"minimize clone time\" → git clone --filter=blob:none.\n",
    "answerText": "B"
  },
  "245": {
    "stem": "GitHub source control. Đánh giá proxying private upstream MyGet feed vào MyGet feed. Hai lợi ích? (Chọn hai.)",
    "options": {
      "A": "minimizes the impact of upstream source availability issues",
      "B": "minimizes latency when accessing the package",
      "C": "provides automatic authentication",
      "D": "minimizes the impact on your storage quota"
    },
    "explanation": "Đáp án: A, C — minimizes the impact of upstream source availability issues; provides automatic authentication\n\nĐề hỏi hai lợi ích khi proxy private upstream MyGet feed vào MyGet feed của bạn.\n\nMinimizes the impact of upstream source availability issues vì feed proxy cache package; upstream chết tạm thời vẫn serve bản đã lấy. Provides automatic authentication vì credential upstream nằm trên MyGet, client chỉ auth với feed của bạn.\n\nMinimizes latency when accessing the package không luôn đúng: lần miss vẫn đi upstream, có thể chậm hơn hit trực tiếp. Minimizes the impact on your storage quota sai vì cache chiếm thêm storage trên MyGet.\n\nKeywords phản xạ nhanh (AZ-400)\n\"proxying\" + \"private upstream\" + \"MyGet\" → availability cache + automatic authentication.\n",
    "answerText": "A,C"
  },
  "246": {
    "stem": "GitHub, file lớn commit nhầm vào repo. Cần giảm kích thước repo và xóa file khỏi history. Dùng gì?",
    "options": {
      "A": "bfg",
      "B": "lfs",
      "C": "gvfs",
      "D": "init"
    },
    "explanation": "Đáp án: A — bfg\n\nĐề file lớn bị commit nhầm trên GitHub, cần giảm size repo và xóa file khỏi repository.\n\nBFG Repo-Cleaner (bfg) viết lại history, gỡ blob lớn khỏi mọi commit, nhanh hơn filter-branch cho đúng bài toán này.\n\nlfs (Git LFS) quản lý file lớn sắp tới, không tự tẩy blob đã nằm trong history. gvfs tối ưu working tree repo rất lớn, không xóa file khỏi history. init chỉ tạo repo mới, không dọn repo hiện tại.\n\nKeywords phản xạ nhanh (AZ-400)\n\"large file\" + \"reduce the size\" + \"remove the file\" → bfg.\n",
    "answerText": "A"
  },
  "247": {
    "stem": "GitHub repo, cấu hình Dependabot:\n• Tự mở PR resolve alert.\n• Tự mở PR khi dependency updated.\nEnable feature nào cho từng yêu cầu?",
    "explanation": "Đáp án: A dependency graph; Security updates\n\nĐề cấu hình Dependabot: tự mở pull request để giải alert, và tự mở pull request khi dependency được cập nhật.\n\nTheo answer key, enable A dependency graph cho yêu cầu tự mở PR khi cần xử lý alert, vì graph là nền Dependabot dùng để biết package và tạo ngữ cảnh cảnh báo. Enable Security updates cho yêu cầu tự mở PR khi dependency được cập nhật theo kênh bảo mật Dependabot.\n\nAlerts một mình chỉ thông báo, không mở PR. Version updates là tính năng Dependabot khác cho lịch nâng phiên bản thường; không phải box được chọn trong key. Branch protection không mở PR Dependabot.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Dependabot\" + \"PR to resolve an alert\" + \"PR when a dependency is updated\" → dependency graph + Security updates.\n",
    "boxes": {
      "1": {
        "label": "Automatically open a pull request to resolve an alert:",
        "answer": "A dependency graph"
      },
      "2": {
        "label": "Automatically open a pull request when a dependency is updated:",
        "answer": "Security updates"
      }
    },
    "answerText": "A dependency graph, Security updates"
  },
  "248": {
    "stem": "Repo1 lớn có directory1. Sẽ sửa files trong directory1. Clone Repo1, tối thiểu data transfer. Hoàn thành script?",
    "explanation": "Đáp án: scalar clone; git sparse-checkout\n\nĐề clone Repo1 lớn, chỉ làm việc trong directory1, giảm data chuyển.\n\nscalar clone tạo clone tối ưu cho repo lớn (partial/sparse mặc định). git sparse-checkout set directory1 giới hạn working tree còn thư mục cần sửa.\n\nClone đầy đủ tải thừa. Sparse-checkout không đi kèm scalar vẫn tải nhiều object hơn cách đề chọn. Filter sai hoặc depth-1 có thể mất context cần thiết khi sửa directory1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"large repository\" + \"minimize transferred data\" + \"directory\" → scalar clone + git sparse-checkout.\n",
    "boxes": {
      "1": {
        "answer": "git clone"
      },
      "2": {
        "answer": "git sparse-checkout"
      }
    },
    "answerText": "git clone, git sparse-checkout"
  },
  "249": {
    "stem": "Project Azure DevOps cần branching solution, mọi PR phải:\n• Có linked work items.\n• Pass build validation policies.\n• Tối thiểu ba reviewers.\nNên có gì trong solution?",
    "options": {
      "A": "branch policies",
      "B": "pull request templates",
      "C": "branch security",
      "D": "pull request permissions"
    },
    "explanation": "Đáp án: B — pull request templates\n\nĐề triển khai branching solution sao cho mọi pull request có linked work items, pass build validation policies, và ít nhất ba reviewers.\n\nTheo answer key, pull request templates là phần đưa vào giải pháp: template chuẩn hóa mô tả PR, nhắc link work item và checklist review trước khi gửi.\n\nBranch policies (A) thực ra là cơ chế enforce build validation và số reviewer trên Azure Repos, nhưng không phải lựa chọn được key ghi nhận. Branch security kiểm soát quyền tạo hoặc xóa nhánh, không validate PR. Pull request permissions chỉ ai được approve hoặc complete, không bắt ba reviewer hay build bắt buộc.\n\nKeywords phản xạ nhanh (AZ-400)\n\"linked work items\" + \"build validation\" + \"three reviewers\" → pull request templates.\n",
    "answerText": "B"
  },
  "250": {
    "stem": "Git source control. Commit file ZIP 3GB (VM test). Yêu cầu:\n• File được versioned.\n• Gắn với code commits tương ứng.\nHai action nào? (Chọn hai.)",
    "options": {
      "A": "Install the git-stash extension and associate the extension to ZIP files",
      "B": "Install the git-fat extension and associate the extension to ZIP files.",
      "C": "Use GZip to compress the file before committing the file",
      "D": "Store files in Azure Storage and enable blob versions",
      "E": "Install the Git LFS extension and associate the extension to ZIP files"
    },
    "explanation": "Đáp án: B, E — Install the git-fat extension and associate the extension to ZIP files; Install the Git LFS extension and associate the extension to ZIP files\n\nĐề commit file ZIP 3 GB chứa VM test: phải versioned và gắn với code commits tương ứng.\n\nInstall the git-fat extension and associate the extension to ZIP files dùng pointer cho binary lớn, nội dung nằm ngoài blob Git thông thường nhưng vẫn version theo commit. Install the Git LFS extension and associate the extension to ZIP files là cách Git chuẩn cho file lớn: pointer trong commit, object LFS theo từng phiên bản, đúng hai yêu cầu.\n\nInstall the git-stash extension không phục vụ lưu ZIP 3 GB. Use GZip to compress the file vẫn để binary lớn trong Git history. Store files in Azure Storage and enable blob versions lưu được phiên bản trên Azure nhưng tự nó không gắn ZIP vào commit Git như LFS hoặc git-fat.\n\nKeywords phản xạ nhanh (AZ-400)\n\"3-GB ZIP\" + \"versioned\" + \"associated with code commits\" → git-fat + Git LFS.\n",
    "answerText": "B,E"
  },
  "251": {
    "stem": "GitHub, file Data.txt sensitive bị push. Cần purge khỏi repository. Hai lệnh nào? (Chọn hai.)",
    "options": {
      "A": "git checkout > git reset -hard -pathspec data.txt",
      "B": "git checkout > git clean -d data.txt --force",
      "C": "bfg --delete-files data.txt > git push --force",
      "D": "git rm data.txt > git push --force",
      "E": "git filter-repo --invert-paths --path data.txt > git push origin --force --all",
      "F": "git revert -edit data.txt > git push -force"
    },
    "explanation": "Đáp án: C, E — bfg --delete-files data.txt rồi git push --force; git filter-repo --invert-paths --path data.txt rồi git push origin --force --all\n\nĐề user đã push Data.txt chứa dữ liệu nhạy cảm; cần purge file khỏi repository GitHub.\n\nbfg --delete-files data.txt viết lại history, xóa file trên mọi commit rồi force-push. git filter-repo --invert-paths --path data.txt là công cụ hiện đại thay filter-branch, bỏ path khỏi toàn bộ history rồi force-push mọi nhánh.\n\ngit checkout rồi git reset không tẩy file trên commit cũ. git clean chỉ xóa untracked. git rm rồi push chỉ bỏ file ở commit mới, history cũ vẫn còn. git revert tạo commit đảo, không xóa nội dung khỏi quá khứ.\n\nKeywords phản xạ nhanh (AZ-400)\n\"purge\" + \"sensitive\" + \"file from the repository\" → BFG + git filter-repo + force-push.\n",
    "answerText": "C,E"
  },
  "252": {
    "stem": "GitHub Enterprise, repos C#. Enable CodeQL scanning. Nên làm gì?",
    "options": {
      "A": "Enable Dependabot security updates.",
      "B": "Enable Dependabot alerts.",
      "C": "Configure a required GitHub Actions workflow for all the repositories.",
      "D": "Push a GitHub Actions workflow to all the repositories."
    },
    "explanation": "Đáp án: C — Configure a required GitHub Actions workflow for all the repositories\n\nĐề bật CodeQL scanning cho các repo C# trên GitHub Enterprise.\n\nConfigure a required GitHub Actions workflow for all the repositories bắt mọi repo chạy cùng workflow CodeQL, kể cả repo mới, nên scanning đồng nhất và không phụ thuộc từng team tự thêm file.\n\nEnable Dependabot security updates và Enable Dependabot alerts xử lý dependency, không bật CodeQL trên source C#. Push a GitHub Actions workflow to all the repositories làm được một lần nhưng dễ lệch, bị xóa, và không enforce repo mới.\n\nKeywords phản xạ nhanh (AZ-400)\n\"enable CodeQL\" + \"GitHub Enterprise\" + \"all the repositories\" → required GitHub Actions workflow.\n",
    "answerText": "C"
  },
  "253": {
    "stem": "GitHub repo có workflow WF1 build App1. Thêm build status badge vào README.md. Hoàn thành URL badge?",
    "explanation": "Đáp án: Repository owner; Repository name\n\nĐề thêm build status badge của workflow WF1 vào README.md.\n\nURL chuẩn là https://github.com/<owner>/<repo>/actions/workflows/WF1/badge.svg nên dropdown lần lượt là Repository owner rồi Repository name.\n\nWorkflow file name đứng sau /actions/workflows/, không thay owner hoặc repo. Organization URL hoặc project name Azure DevOps không xuất hiện trong badge GitHub Actions.\n\nKeywords phản xạ nhanh (AZ-400)\n\"build status badge\" + \"README\" + \"actions/workflows\" → Repository owner + Repository name.\n",
    "boxes": {
      "1": {
        "answer": "Repository owner"
      },
      "2": {
        "answer": "Repository name"
      }
    },
    "answerText": "Repository owner, Repository name"
  },
  "254": {
    "stem": "GitHub repository. Tạo tag v3.0.5 và đảm bảo tag có trên remote. Hai lệnh nào? (Chọn hai.)",
    "options": {
      "A": "git push -force",
      "B": "git push origin v3.0.5",
      "C": "git tag v3.0.5",
      "D": "git commit -m 'tag v3.0.5'",
      "E": "git add 'tag v3.0.5'"
    },
    "explanation": "Đáp án: B, C — git push origin v3.0.5; git tag v3.0.5\n\nĐề tạo tag v3.0.5 và bảo đảm tag có trên remote.\n\ngit tag v3.0.5 tạo tag local trỏ HEAD. git push origin v3.0.5 đẩy đúng tag đó lên GitHub.\n\ngit push -force không phải cách an toàn hay đủ để chỉ publish một tag. git commit -m 'tag v3.0.5' chỉ tạo commit, không tạo tag. git add 'tag v3.0.5' không tạo Git tag.\n\nKeywords phản xạ nhanh (AZ-400)\n\"create a tag\" + \"available in the remote\" → git tag + git push origin <tag>.\n",
    "answerText": "B,C"
  },
  "255": {
    "stem": "GitHub repository. Mọi thay đổi code phải được security department validate trước khi deploy main branch. Hai action nào? (Chọn hai.)",
    "options": {
      "A": "Require signed commits",
      "B": "Create a branch protection rule for the feature branches",
      "C": "Create a LICENSE file",
      "D": "Create a branch protection rule for the main branch.",
      "E": "Create a CODEOWNERS file."
    },
    "explanation": "Đáp án: D, E — Create a branch protection rule for the main branch; Create a CODEOWNERS file\n\nĐề mọi thay đổi code phải được security department validate trước khi main được deploy.\n\nCreate a CODEOWNERS file gán @security-team cho path cần review. Create a branch protection rule for the main branch bật required review, thường kèm Require review from Code Owners, chặn merge vào main khi security chưa approve.\n\nRequire signed commits chỉ xác thực chữ ký GPG, không bảo đảm security đã đọc code. Create a branch protection rule for the feature branches không bảo vệ cổng deploy trên main. Create a LICENSE file không liên quan review bảo mật.\n\nKeywords phản xạ nhanh (AZ-400)\n\"security department\" + \"before the main branch is deployed\" → CODEOWNERS + branch protection on main.\n",
    "answerText": "A,E"
  },
  "256": {
    "stem": ".NET app App1 upload lên GitHub Packages. Hoàn thành lệnh?",
    "explanation": "Đáp án: dotnet; nuget push\n\nĐề upload gói .NET App1 lên GitHub Packages.\n\nLệnh đủ là dotnet nuget push \"bin/Release/app1.1.0.0.nupkg\" --api-key PAT_TOKEN --source \"github\". dotnet là CLI; nuget push đẩy nupkg tới source GitHub đã cấu hình, auth bằng PAT.\n\nnuget.exe push không có prefix dotnet vẫn có thể dùng ngoài đề. dotnet pack chỉ tạo nupkg, chưa đưa lên GitHub Packages. source nuget.org không phải GitHub Packages.\n\nKeywords phản xạ nhanh (AZ-400)\n\".NET\" + \"GitHub Packages\" + \"nupkg\" → dotnet nuget push --source github.\n",
    "boxes": {
      "1": {
        "answer": "dotnet"
      },
      "2": {
        "answer": "nuget push"
      }
    },
    "answerText": "dotnet, nuget push"
  },
  "257": {
    "stem": "Khởi tạo main branch mặc định nếu chưa có. Trong project User1-12345678, implement approval process cho main branch — four-eyes principle, tối thiểu một approval mỗi iteration.",
    "explanation": "Đáp án: Simulation — branch policies trên main với four-eyes và approval mỗi iteration\n\nĐề yêu cầu trên project User1-12345678: khởi tạo main nếu chưa có, rồi bắt quy trình duyệt default main theo four-eyes, ít nhất một approval trên mọi iteration.\n\nTạo hoặc initialize repo để có default main. Vào Project settings, Repos, Branches, mở policy của main. Bật Require a minimum number of reviewers với hai reviewer để đạt four-eyes. Tắt Allow requestors to approve their own changes. Bật Reset code reviewer votes when there are new changes để mỗi iteration cần approval mới. Lưu policy.\n\nChỉ dùng pull request template hoặc quyền Contribute không tạo four-eyes. Một reviewer duy nhất không đủ bốn mắt. Không reset vote thì iteration sau có thể giữ approve cũ.\n\nKeywords phản xạ nhanh (AZ-400)\n\"four-eyes\" + \"approval on every iteration\" + \"main\" → 2 reviewers + reset votes on new push.\n"
  },
  "258": {
    "stem": "Khởi tạo main branch nếu chưa có. Project1: branch merging restrictions — squash merge cho mọi change merge vào main.",
    "explanation": "Đáp án: Simulation — chỉ cho squash merge vào main\n\nĐề trên Project1: khởi tạo main nếu cần, rồi hạn chế merge vào main sao cho mọi thay đổi dùng squash merge.\n\nInitialize default main. Vào Project settings, Repos, Repositories, chọn repo, phần Branch policies hoặc Cross-repo policies và Limit merge types cho main. Enable Squash merge. Disable Basic merge (no fast-forward) và Semi-linear / Rebase merge. Lưu để mọi PR vào main chỉ squash.\n\nGiữ nhiều merge type không đáp ứng \"squash merge for all changes\". Policy reviewer không thay giới hạn merge type. Chỉ hướng dẫn team squash mà không khóa UI vẫn cho merge thường.\n\nKeywords phản xạ nhanh (AZ-400)\n\"merging restrictions\" + \"squash merge\" + \"main\" → Limit merge types → Squash only.\n"
  },
  "259": {
    "stem": "GitHub repo repo1, Key Vault kv1. Workflow Workflow1 deploy DB server dùng credentials từ kv1. Ba actions để Workflow1 lấy credentials?",
    "explanation": "Đáp án: Create a service principal in Microsoft Entra ID; Grant secret permissions to kv1; Reference the credentials in Workflow1\n\nĐề GitHub Workflow1 phải lấy credential từ Azure Key Vault kv1.\n\nCreate a service principal in Microsoft Entra ID tạo identity mà GitHub Actions dùng (OIDC hoặc client secret). Grant secret permissions to kv1 gán Get/List secrets cho principal trên vault. Reference the credentials in Workflow1 đọc secret qua Azure login action hoặc Key Vault action.\n\nGọi vault trong workflow trước khi có identity sẽ thất bại auth. Cấp permission trên vault trước khi có principal thì chưa có object để gán. Lưu secret thuần trên GitHub Secrets bỏ qua yêu cầu lấy từ kv1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub workflow\" + \"Key Vault\" + \"credentials\" → Entra service principal → grant secrets → reference in workflow.\n",
    "boxes": {
      "1": {
        "answer": "Create a service principal in Microsoft Entra ID."
      },
      "2": {
        "answer": "Grant secret permissions to kv1."
      },
      "3": {
        "answer": "Reference the credentials in Workflow1."
      }
    },
    "answerText": "Create a service principal in Microsoft Entra ID., Grant secret permissions to kv1., Reference the credentials in Workflow1."
  },
  "260": {
    "stem": "60 developers, 4 team × 15. Agile methodology. Cấu trúc work để mỗi team sở hữu phần việc nhưng hướng tới mục tiêu chung. Phần taxonomy nào team tự quản?",
    "options": {
      "A": "Features and Tasks",
      "B": " Initiatives and Epics",
      "C": "Epics and Features",
      "D": "Stories and Tasks"
    },
    "explanation": "Đáp án: D — Stories and Tasks\n\nĐề bốn team Agile, mỗi team sở hữu việc của mình nhưng cùng mục tiêu chung. Hỏi phần nào trong taxonomy team được làm autonomously.\n\nStories and Tasks đúng vì đây là công việc sprint-level: team tự plan, chia task và deliver. Epic, Feature, Initiative giữ ở program hoặc portfolio để các team không lệch mục tiêu chung.\n\nFeatures and Tasks trao Feature cho từng team dễ lệch product. Initiatives and Epics quá cao, không phải việc team tự quyết hàng ngày. Epics and Features cũng thuộc lớp phối hợp đa team, không phải phạm vi tự trị đề hỏi.\n\nKeywords phản xạ nhanh (AZ-400)\n\"each team owns their work\" + \"common goal\" + \"taxonomy\" → Stories and Tasks.\n",
    "answerText": "D"
  },
  "261": {
    "stem": "Team Azure DevOps mới, sprint planning agile. Visualize flow of work bằng agile methodology. Dùng component nào?",
    "options": {
      "A": "Kanban boards",
      "B": "sprint planning",
      "C": "delivery plans",
      "D": "portfolio backlogs"
    },
    "explanation": "Đáp án: A — Kanban boards\n\nĐề team Azure DevOps mới, dùng sprint planning, cần visualize luồng work theo Agile.\n\nKanban boards trên Azure Boards thể hiện work item đi qua cột New, Active, Resolved, Closed, thấy WIP và bottleneck, đúng yêu cầu visualize flow.\n\nSprint planning là sự kiện chọn backlog, không phải bảng luồng liên tục. Delivery plans nhìn đa team theo thời gian, không phải board ngày thường. Portfolio backlogs tổ chức Epic và Feature, không visualize flow chi tiết.\n\nKeywords phản xạ nhanh (AZ-400)\n\"visualize the flow\" + \"agile\" + \"Azure DevOps\" → Kanban boards.\n",
    "answerText": "A"
  },
  "262": {
    "stem": "Agile methodology, retrospectives cuối sprint. Ba câu hỏi nào nên có? (Chọn ba.)",
    "options": {
      "A": "Who performed well?",
      "B": " Who should have performed better?",
      "C": "What could have gone better?",
      "D": "What went well?",
      "E": "What should we try next?"
    },
    "explanation": "Đáp án: C, D, E — What could have gone better?; What went well?; What should we try next?\n\nĐề chọn ba câu hỏi cho retrospective cuối sprint.\n\nWhat went well giữ việc tốt. What could have gone better tìm chỗ cải thiện quy trình. What should we try next biến insight thành thí nghiệm sprint sau. Ba câu này là cốt lõi retrospective Agile.\n\nWho performed well? và Who should have performed better? đổ sự chú ý vào cá nhân, tạo blame, không phải câu hỏi retrospective chuẩn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"retrospectives\" + \"end of each sprint\" → What went well + What could have gone better + What should we try next.\n",
    "answerText": "C,D,E"
  },
  "263": {
    "stem": "Đề xuất branching strategy Git:\n• Làm nhiều task độc lập song song.\n• Code checked-in luôn releasable.\n• Feature mới có thể abandon bất cứ lúc nào.\n• Khuyến khích thử nghiệm.\nNên đề xuất gì?",
    "options": {
      "A": "a single long-running branch without forking",
      "B": "multiple long-running branches",
      "C": "a single fork per team member",
      "D": "a single long-running branch with multiple short-lived feature branches"
    },
    "explanation": "Đáp án: D — a single long-running branch with multiple short-lived feature branches\n\nĐề branching strategy: làm song song nhiều task độc lập, code check-in luôn releasable, bỏ feature bất kỳ lúc nào, khuyến khích thí nghiệm.\n\nMột nhánh dài (main) giữ trạng thái releasable. Nhiều feature branch ngắn cho phép parallel work, thí nghiệm và xóa nhánh nếu bỏ feature mà không làm hỏng main.\n\nA single long-running branch without forking buộc mọi người commit chung, dễ phá releasable state và khó bỏ feature. Multiple long-running branches phân tán integration, khó luôn releasable. A single fork per team member làm tích hợp chậm, không phải trunk có kiểm soát.\n\nKeywords phản xạ nhanh (AZ-400)\n\"parallel\" + \"releasable state\" + \"abandon features\" + \"experimentation\" → long-running branch + short-lived feature branches.\n",
    "answerText": "D"
  },
  "264": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario.\n\nTích hợp Jenkins cloud và Azure DevOps deployment. Azure DevOps notify Jenkins khi developer commit lên Azure Repos branch.\n\nGiải pháp: service hook subscription dùng build completed event.\nCó đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề Azure DevOps phải báo Jenkins khi developer commit lên nhánh Azure Repos. Giải pháp: service hook dùng sự kiện build completed.\n\nGiải pháp không đạt. Build completed cháy sau khi build xong, không phải lúc code được push. Commit có thể chưa kích hoạt build, hoặc thông báo đến quá muộn so với yêu cầu.\n\nOption Yes sai vì event phải là Code pushed (hoặc tương đương), không phải build completed.\n\nKeywords phản xạ nhanh (AZ-400)\n\"notify Jenkins\" + \"commits changes\" + \"build completed\" → No.\n",
    "answerText": "B"
  },
  "265": {
    "stem": "Azure DevOps project có release pipeline. Tích hợp work item tracking + Agile PM:\n• Developer track commit có deploy production không.\n• Report deployment status.\n• Tối thiểu integration effort.\nDùng hệ thống nào?",
    "options": {
      "A": "Asana",
      "B": "Basecamp",
      "C": "Trello",
      "D": "Jira"
    },
    "explanation": "Đáp án: D — Jira\n\nĐề tích hợp work item tracking và Agile project management: developer theo dõi commit đã lên production, báo deployment status, giảm effort tích hợp với Azure DevOps release pipeline.\n\nJira có connector và marketplace integration với Azure DevOps: gắn commit, cập nhật issue khi release, báo trạng thái deploy với cấu hình ít tùy biến.\n\nAsana, Basecamp và Trello quản lý công việc chung nhưng tích hợp native với Azure DevOps release và commit deployment kém hơn Jira, tốn effort hơn để đạt cùng traceability.\n\nKeywords phản xạ nhanh (AZ-400)\n\"commits are deployed to production\" + \"deployment status\" + \"minimize integration\" → Jira.\n",
    "answerText": "D"
  },
  "266": {
    "stem": "Onboard 10 developers. Môi trường dev:\n• Tích hợp GitHub\n• Debug tools tích hợp\n• Remote/hot-desking\n• Browser, tablet, Chromebook\nNên đề xuất gì?",
    "options": {
      "A": "VS Code",
      "B": "Xamarin Studio",
      "C": "MonoDevelop",
      "D": "Github Codespaces"
    },
    "explanation": "Đáp án: D — Github Codespaces\n\nĐề môi trường cho 10 developer mới: tích hợp GitHub, debug tích hợp, remote và hot-desking, chạy trên browser, tablet và Chromebook.\n\nGitHub Codespaces là IDE cloud trong browser, gắn repo GitHub, có debugger, không cần cài máy local nên phù hợp hot-desk và thiết bị mỏng.\n\nVS Code cần cài trên máy, không đủ cho Chromebook và hot-desk thuần browser. Xamarin Studio và MonoDevelop là IDE cài local, tập trung mobile hoặc .NET, không đáp ứng remote browser.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub\" + \"remote\" + \"Chromebooks\" + \"browsers\" → GitHub Codespaces.\n",
    "answerText": "D"
  },
  "267": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario Jenkins + Azure DevOps.\n\nGiải pháp: email subscription notify Jenkins khi commit.\nCó đáp ứng mục tiêu không?",
    "explanation": "Đáp án: B — No\n\nĐề cùng scenario: Azure DevOps báo Jenkins khi commit Azure Repos. Giải pháp: email subscription tới Azure DevOps notification.\n\nGiải pháp không đạt. Email bất đồng bộ, Jenkins không listen inbox để start job một cách đáng tin. Đây không phải kênh tích hợp CI chuẩn.\n\nOption Yes sai. Cách đúng là service hook Code pushed (webhook) tới Jenkins.\n\nKeywords phản xạ nhanh (AZ-400)\n\"notify Jenkins\" + \"email subscription\" → No.\n",
    "answerText": "B"
  },
  "268": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario.\n\nGiải pháp: service hook subscription lắng nghe code pushed event Azure Repos.\nCó đáp ứng mục tiêu không?",
    "explanation": "Đáp án: A — Yes\n\nĐề cùng scenario báo Jenkins khi commit. Giải pháp: service hook subscription dùng sự kiện code pushed.\n\nGiải pháp đạt mục tiêu. Service hook Code pushed gửi HTTP tới Jenkins ngay khi developer push lên nhánh, Jenkins trigger job. Đây là tích hợp sự kiện đúng giữa Azure Repos và Jenkins.\n\nOption No sai vì code pushed chính là event khớp \"commits changes to a branch\".\n\nKeywords phản xạ nhanh (AZ-400)\n\"Jenkins\" + \"service hook\" + \"code pushed\" → Yes.\n",
    "answerText": "A"
  },
  "269": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario.\n\nGiải pháp: thêm trigger build pipeline Azure DevOps.\nCó notify Jenkins khi commit không?",
    "explanation": "Đáp án: B — No\n\nĐề cùng scenario báo Jenkins khi commit. Giải pháp: thêm trigger vào build pipeline Azure DevOps.\n\nGiải pháp không đạt. Trigger chỉ khởi động pipeline Azure Pipelines, không gửi thông báo tới Jenkins. Tự nó không phải cầu nối Azure Repos sang Jenkins.\n\nOption Yes sai. Cần service hook hoặc webhook tới Jenkins, không phải CI trigger nội bộ Azure DevOps.\n\nKeywords phản xạ nhanh (AZ-400)\n\"notify Jenkins\" + \"trigger to the build pipeline\" → No.\n",
    "answerText": "B"
  },
  "270": {
    "stem": "Tạo project Azure DevOps, nhiều developer, thường offline cần full project history offline. Dùng version control nào?",
    "options": {
      "A": " Team Foundation Version Control",
      "B": "Git",
      "C": "TortoiseSVN",
      "D": "Subversion"
    },
    "explanation": "Đáp án: B — Git\n\nĐề nhiều developer làm offline thường xuyên và cần full project history khi offline.\n\nGit là DVCS: mỗi clone chứa toàn bộ history, commit và branch local không cần mạng, rồi push khi online. Azure DevOps hỗ trợ Git repos cho đúng kịch bản này.\n\nTeam Foundation Version Control, Subversion và TortoiseSVN là centralized: history và nhiều thao tác cần server, không đáp ứng offline full history.\n\nKeywords phản xạ nhanh (AZ-400)\n\"work offline\" + \"full project history\" → Git.\n",
    "answerText": "B"
  },
  "271": {
    "stem": "Onboard 10 developers — yêu cầu giống câu trước (GitHub, debug, remote, browser/tablet). Đề xuất gì?",
    "options": {
      "A": "VS Code",
      "B": "Xamarin Studio",
      "C": "MonoDevelop",
      "D": "Visual Studio Codespaces"
    },
    "explanation": "Đáp án: D — Visual Studio Codespaces\n\nĐề giống yêu cầu môi trường cloud: GitHub, debug, remote, hot-desk, browser, tablet, Chromebook.\n\nVisual Studio Codespaces (nay là GitHub Codespaces) là môi trường dev trên cloud, mở bằng browser, gắn GitHub, có debugger, không phụ thuộc máy cài sẵn.\n\nVS Code local không đủ cho mọi thiết bị mỏng. Xamarin Studio và MonoDevelop cài desktop, không phải cloud IDE cho hot-desking.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub\" + \"Chromebooks\" + \"hot-desking\" → Visual Studio Codespaces.\n",
    "answerText": "D"
  },
  "272": {
    "stem": "Build pipeline Azure Pipelines, tích hợp Slack App. Gửi build notifications tới channel #Development. Làm gì trước?",
    "options": {
      "A": "Create a project-level notification.",
      "B": "Configure a service connection.",
      "C": "Create a global notification.",
      "D": "Creates a service hook subscription."
    },
    "explanation": "Đáp án: D — Creates a service hook subscription\n\nĐề đã có Slack App Integration, cần gửi build notification vào kênh #Development; hỏi việc làm trước.\n\nCreate a service hook subscription gắn sự kiện build của Azure Pipelines với Slack, chỉ định channel #Development. Đây là bước nối Azure DevOps với Slack sau khi app đã có.\n\nCreate a project-level notification hoặc global notification chỉ gửi cho user Azure DevOps, không vào Slack. Configure a service connection dùng để pipeline gọi Azure hoặc registry, không phải kênh notify Slack.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Slack\" + \"build notifications\" + \"first\" → service hook subscription.\n",
    "answerText": "D"
  },
  "273": {
    "stem": "Contoso Azure DevOps + subscription. App1 web app, Azure Monitor email alert khi server-side error. Cần notifications Microsoft Teams khi Azure Monitor alert. Hai action? (Chọn hai.)",
    "options": {
      "A": "Create an Azure Monitor workbook.",
      "B": "Create an Azure logic app that has an HTTP request trigger",
      "C": "Create an Azure logic app that has an Azure DevOps trigger.",
      "D": "Modify an action group in Azure Monitor",
      "E": "Modify the Diagnostics settings in Azure Monitor"
    },
    "explanation": "Đáp án: B, D — Create an Azure logic app that has an HTTP request trigger; Modify an action group in Azure Monitor\n\nĐề Azure Monitor đang mail khi App1 lỗi server-side; cần thêm thông báo Microsoft Teams.\n\nCreate an Azure logic app that has an HTTP request trigger tạo endpoint nhận webhook. Modify an action group in Azure Monitor thêm webhook hoặc Logic App action, POST khi alert cháy; Logic App rồi post vào Teams.\n\nCreate an Azure Monitor workbook chỉ visualize, không push Teams. Create an Azure logic app that has an Azure DevOps trigger lắng nghe Azure DevOps, không phải Azure Monitor alert. Modify the Diagnostics settings chỉ đổi log destination, không gửi Teams.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Monitor alert\" + \"Microsoft Teams\" → Logic App HTTP trigger + action group.\n",
    "answerText": "B,D"
  },
  "274": {
    "stem": "Azure DevOps Git, project Contoso App với repos core-api, core-spa, core-db. Developer nhận Slack notification khi có PR cho Contoso App. Chạy gì trong Slack?",
    "explanation": "Đáp án: subscribe; https://dev.azure.com/contoso/contoso-app\n\nĐề developer nhận Slack notification khi có pull request trên project Contoso App (nhiều repo).\n\nTrong Slack chạy /azrepos subscribe https://dev.azure.com/contoso/contoso-app. subscribe bắt đầu theo dõi. Project URL (không phải từng repo) bao phủ core-api, core-spa và core-db.\n\nsubscribe một repo URL chỉ cover một repo. unsubscribe tắt theo dõi. Dùng org URL có thể quá rộng hoặc sai cú pháp /azrepos subscribe.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Slack\" + \"pull requests\" + \"project\" → /azrepos subscribe <project URL>.\n",
    "boxes": {
      "1": {
        "answer": "subscribe"
      },
      "2": {
        "answer": "https://dev.azure.com/contoso/contoso-app"
      }
    },
    "answerText": "subscribe, https://dev.azure.com/contoso/contoso-app"
  },
  "275": {
    "stem": "Azure DevOps organization, project Project1. Tạo published wiki trong Project1. Làm gì trước?",
    "options": {
      "A": "Modify the Storage settings of Project1.",
      "B": "In Project1, create an Azure DevOps pipeline.",
      "C": "In Project1, create an Azure DevOps repository.",
      "D": "Modify the Team configuration settings of Project1."
    },
    "explanation": "Đáp án: C — In Project1, create an Azure DevOps repository\n\nĐề tạo published wiki trên Project1; hỏi việc làm trước.\n\nPublished wiki lưu trang trong Git repository riêng. Việc đầu tiên là tạo Azure DevOps repository để publish wiki vào đó.\n\nModify the Storage settings không tạo nền wiki. In Project1, create an Azure DevOps pipeline không phải chỗ chứa trang wiki. Modify the Team configuration settings chỉ area, iteration, không tạo published wiki.\n\nKeywords phản xạ nhanh (AZ-400)\n\"published wiki\" + \"first\" → create an Azure DevOps repository.\n",
    "answerText": "C"
  },
  "276": {
    "stem": "Agile software development, communication cho dev team toàn cầu:\n• Channels riêng theo team + lịch sử chat\n• Windows 10, macOS, iOS, Android\n• Tối thiểu số app\nNên đề xuất app nào?",
    "options": {
      "A": "Microsoft Project",
      "B": "Bamboo",
      "C": "Microsoft Lync",
      "D": "Microsoft Teams"
    },
    "explanation": "Đáp án: D — Microsoft Teams\n\nĐề app giao tiếp Agile toàn cầu: channel tách team và giữ history, Windows 10, Mac, iOS, Android, mời contractor, tích hợp trực tiếp Azure DevOps.\n\nMicrosoft Teams có channel và chat history, client đủ nền tảng, guest access, và app Azure DevOps sẵn.\n\nMicrosoft Project quản lý kế hoạch, không phải chat channel. Bamboo là CI server Atlassian. Microsoft Lync (Skype for Business) thiếu channel lịch sử và tích hợp Azure DevOps như Teams.\n\nKeywords phản xạ nhanh (AZ-400)\n\"channels\" + \"chat history\" + \"external contractors\" + \"Azure DevOps\" → Microsoft Teams.\n",
    "answerText": "D"
  },
  "277": {
    "stem": "Multi-tier app: App Service front end, Azure SQL back end, Azure Functions ghi Azure Storage. Gửi email Azure DevOps team khi front end không trả status 200. Dùng feature nào?",
    "options": {
      "A": "Service Map in Azure Log Analytics",
      "B": "availability tests in Azure Application Insights",
      "C": "Profiler in Azure Application Insights",
      "D": "Application Map in Azure Application Insights"
    },
    "explanation": "Đáp án: B — availability tests in Azure Application Insights\n\nĐề gửi email cho team Azure DevOps khi front-end App Service không trả status 200.\n\nAvailability tests định kỳ gọi URL, kiểm tra HTTP status, và alert khi khác 200, gửi email qua action group. Đúng yêu cầu theo dõi front-end.\n\nService Map in Azure Log Analytics vẽ dependency, không test status 200. Profiler in Azure Application Insights thu trace hiệu năng. Application Map in Azure Application Insights sơ đồ topology, không phải availability ping.\n\nKeywords phản xạ nhanh (AZ-400)\n\"front end\" + \"status code of 200\" + \"email\" → Application Insights availability tests.\n",
    "answerText": "B"
  },
  "278": {
    "stem": "Project1 có published wiki. Đổi thứ tự pages trong navigation pane trên Azure DevOps portal. Nên làm gì?",
    "options": {
      "A": "At the root of the wiki, create a file named .order that defines the page hierarchy",
      "B": "At the root of the wiki, create a file named wiki.md that defines the page hierarchy",
      "C": "Rename the pages in the navigation pane.",
      "D": "Drag and drop the pages in the navigation pane"
    },
    "explanation": "Đáp án: A — At the root of the wiki, create a file named .order that defines the page hierarchy\n\nĐề đổi thứ tự trang trên navigation pane của published wiki.\n\nFile .order ở root (và trong từng folder) liệt kê tên trang theo thứ tự hiển thị. Đây là cơ chế chính thức của Azure DevOps wiki.\n\nFile wiki.md là trang home, không định nghĩa toàn bộ hierarchy. Rename the pages in the navigation pane đổi tên, không sắp thứ tự ổn định và có thể gãy link. Drag and drop the pages in the navigation pane không phải cách được hỗ trợ để persist thứ tự published wiki như .order.\n\nKeywords phản xạ nhanh (AZ-400)\n\"order of pages\" + \"published wiki\" + \"navigation pane\" → .order file.\n",
    "answerText": "A"
  },
  "279": {
    "stem": "GitHub org org1, tenant Tenant1. Bật SSO Entra ID cho users org1. URI nào cho SAML config trong Entra ID?",
    "explanation": "Đáp án: https://github.com/orgs/org1; https://github.com/orgs/org1/saml/consume; https://github.com/orgs/org1/sso\n\nĐề điền URI SAML trên Azure AD để SSO cho GitHub organization org1.\n\nIdentifier (Entity ID) là https://github.com/orgs/org1. Reply URL (Assertion Consumer Service URL) là https://github.com/orgs/org1/saml/consume. Sign on URL là https://github.com/orgs/org1/sso.\n\nĐảo consume và sso làm ACS hoặc sign-on sai, SSO thất bại. Dùng github.com/org1 không có /orgs/ không khớp Entity ID GitHub Enterprise Cloud. Tenant Azure URL không dùng làm GitHub ACS.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub SSO\" + \"SAML\" + \"Azure AD\" → Entity ID /orgs/org1 + ACS /saml/consume + Sign on /sso.\n",
    "boxes": {
      "1": {
        "label": "Identifier (Entity ID):",
        "answer": "https://github.com/orgs/org1"
      },
      "2": {
        "label": "Reply URL (Assertion Consumer Service URL):",
        "answer": "https://github.com/orgs/org1/saml/consume"
      },
      "3": {
        "label": "Sign on URL:",
        "answer": "https://github.com/orgs/org1/sso"
      }
    },
    "answerText": "https://github.com/orgs/org1, https://github.com/orgs/org1/saml/consume, https://github.com/orgs/org1/sso"
  },
  "280": {
    "stem": "Agile development, communication team toàn cầu (channels, history, Windows/Mac/iOS/Android, tối thiểu apps). Đề xuất app?",
    "options": {
      "A": "Skype for Business",
      "B": "Bamboo",
      "C": "Octopus",
      "D": "Slack"
    },
    "explanation": "Đáp án: D — Slack\n\nĐề cùng yêu cầu giao tiếp Agile: channel tách biệt, history, đa OS, guest ngoài, tích hợp Azure DevOps. Các lựa chọn khác với câu Microsoft Teams.\n\nSlack có channel, lưu chat, app desktop và mobile, guest, và tích hợp Azure DevOps hoặc Azure Repos.\n\nSkype for Business thiếu mô hình channel và tích hợp Azure DevOps tương đương. Bamboo là CI. Octopus là deployment automation, không phải nền tảng chat team.\n\nKeywords phản xạ nhanh (AZ-400)\n\"channels\" + \"contractors\" + \"Azure DevOps\" + \"Slack options\" → Slack.\n",
    "answerText": "D"
  },
  "282": {
    "stem": "Pipeline Pipeline1 trong Azure Pipelines. Tạo service connection để Pipeline1 download public container image. Loại service connection nào?",
    "options": {
      "A": "a Docker host",
      "B": "a Docker registry",
      "C": "Azure Service Fabric",
      "D": "Azure Kubernetes Service (AKS)"
    },
    "explanation": "Đáp án: B — a Docker registry\n\nĐề tạo service connection để Pipeline1 tải public container image.\n\nA Docker registry service connection trỏ tới Docker Hub hoặc registry tương thích, cho phép task docker pull image, kể cả image public.\n\nA Docker host kết nối daemon để build hoặc chạy container, không phải nơi lưu image. Azure Service Fabric là nền tảng microservices. Azure Kubernetes Service (AKS) là cluster chạy workload, không phải connection để download image từ registry.\n\nKeywords phản xạ nhanh (AZ-400)\n\"download a public container image\" + \"service connection\" → Docker registry.\n",
    "answerText": "B"
  },
  "283": {
    "stem": "Project1 có Kanban Board1. Teams channel + Azure Boards app. User tạo work items trong Board1 từ Teams. Chạy lệnh nào?",
    "options": {
      "A": "@azure boards subscriptions",
      "B": "@azure boards create",
      "C": "@azure boards sign in",
      "D": "@azure boards link"
    },
    "explanation": "Đáp án: D — @azure boards link\n\nĐề channel Teams đã cài Azure Boards app; user phải tạo work item trên Board1 từ Teams.\n\n@azure boards link gắn channel với project và Kanban board. Sau khi link, lệnh create mới biết Board1.\n\n@azure boards subscriptions quản lý thông báo thay đổi work item. @azure boards create chưa link thì không có đích Board1. @azure boards sign in chỉ đăng nhập tài khoản, chưa chọn board.\n\nKeywords phản xạ nhanh (AZ-400)\n\"create work items\" + \"Microsoft Teams\" + \"Azure Boards\" → @azure boards link.\n",
    "answerText": "D"
  },
  "284": {
    "stem": "Bug work item ID 123. Set state Resolved qua commit message. Thêm gì vào commit message?",
    "options": {
      "A": "#123 completes",
      "B": "#123 Resolved",
      "C": "Completed #123",
      "D": "Fixes #123"
    },
    "explanation": "Đáp án: D — Fixes #123\n\nĐề commit message phải chuyển work item 123 sang Resolved.\n\nFixes #123 (cùng họ Fix, Fixed, Fixing) được Azure Boards hiểu là đóng vòng bug và chuyển trạng thái Resolved khi commit được nhận trên nhánh theo dõi.\n\n#123 completes đặt từ khóa sau ID, không phải cú pháp chuẩn Fixes. #123 Resolved không phải keyword được nhận. Completed #123 thường đưa item sang Completed hoặc Closed tùy process, không phải dạng Fixes để Resolved như key chọn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"set the work item state to Resolved\" + \"commit message\" → Fixes #123.\n",
    "answerText": "D"
  },
  "285": {
    "stem": "Subscription có storage account và 20 VM. Dùng LogRhythm aggregate/analyze VM logs. Cấu hình AzLog export logs push tới storage account. Export format nào?",
    "options": {
      "A": "JSON",
      "B": "EVTX",
      "C": "EVT",
      "D": "binary"
    },
    "explanation": "Đáp án: A — JSON\n\nĐề cấu hình AzLog xuất log máy ảo rồi đẩy vào storage account cho LogRhythm phân tích.\n\nJSON là format có cấu trúc, LogRhythm và pipeline Azure ingest dễ parse. AzLog xuất JSON vào blob phù hợp SIEM hiện đại.\n\nEVTX và EVT là format Event Log Windows, nặng hơn khi đẩy storage rồi parse bằng LogRhythm. Binary không phải dạng LogRhythm kỳ vọng cho aggregation thông thường.\n\nKeywords phản xạ nhanh (AZ-400)\n\"AzLog\" + \"export the logs\" + \"LogRhythm\" → JSON.\n",
    "answerText": "A"
  },
  "286": {
    "stem": "Bạn dùng Exabeam Fusion SIEM và nền tảng Azure.\nCần tích hợp Exabeam với Azure, dùng OAuth authentication.\nBa thao tác nào phải làm theo đúng thứ tự? Kéo các action phù hợp vào answer area và sắp xếp theo thứ tự.",
    "explanation": "Đáp án: Register an Exabeam application in Azure AD; Create a client secret; Configure the Exabeam Azure cloud connector\n\nĐề tích hợp Exabeam Fusion SIEM với Azure bằng OAuth.\n\nRegister an Exabeam application in Microsoft Azure Active Directory tạo app registration, có client ID. Create a client secret cấp credential OAuth cho app. Configure the Exabeam Azure cloud connector nhập tenant, client ID và secret để Exabeam lấy token và kéo dữ liệu Azure.\n\nCấu hình connector trước khi có app và secret sẽ không auth được. Dùng password user thay OAuth app không khớp yêu cầu OAuth. Bỏ client secret thì không có client credentials flow.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Exabeam\" + \"OAuth\" + \"Azure\" → register app → client secret → cloud connector.\n",
    "boxes": {
      "1": {
        "answer": "Register an Exabeam application in Microsoft Azure Active Directory (Azure AD), part of Microsoft Entra."
      },
      "2": {
        "answer": "Create a client secret."
      },
      "3": {
        "answer": "Configure the Exabeam Azure cloud connector."
      }
    },
    "answerText": "Register an Exabeam application in Microsoft Azure Active Directory (Azure AD), part of Microsoft Entra., Create a client secret., Configure the Exabeam Azure cloud connector."
  },
  "287": {
    "stem": "Bạn định tạo pull request trên GitHub.\nCần tự động link PR với một Azure Boards work item sẵn có bằng cú pháp AB#.\nCó thể thêm đoạn text đó vào hai thành phần nào? (Mỗi đáp án đúng là một cách làm đủ. Mỗi lựa chọn đúng được một điểm.)",
    "options": {
      "A": "milestone",
      "B": "label",
      "C": "title",
      "D": "comment",
      "E": "description"
    },
    "explanation": "Đáp án: C, E — title; description\n\nĐề tự động link pull request GitHub tới Azure Boards work item bằng chữ AB#.\n\nĐưa AB#<id> vào title hoặc description của pull request; Azure Boards quét hai trường này và tạo link.\n\nmilestone và label không được parse cho AB#. comment có thể thảo luận nhưng không phải hai vị trí được key chọn để tạo link lúc mở PR.\n\nKeywords phản xạ nhanh (AZ-400)\n\"AB#\" + \"link\" + \"pull request\" → title + description.\n",
    "answerText": "C,E"
  },
  "288": {
    "stem": "Bạn đang dùng Agile process trên Azure DevOps.\nCần deploy dashboard báo cáo tiến độ cho hai metric:\n• Thời gian từ lúc tạo work item đến lúc đóng.\n• Thời gian từ lúc bắt đầu làm đến lúc đóng work item.\nMỗi metric dùng widget loại nào? (Mỗi lựa chọn đúng được một điểm.)",
    "explanation": "Đáp án: Lead time; Cycle time\n\nĐề widget dashboard: thời gian từ lúc tạo work item đến lúc đóng, và thời gian từ lúc bắt đầu làm đến lúc đóng.\n\nLead time đo từ created đến closed. Cycle time đo từ khi work started (In Progress) đến closed.\n\nVelocity đo story point hoàn thành theo sprint, không phải khoảng thời gian một item. Cumulative flow thể hiện số item theo state, không phải hai khoảng thời gian đề hỏi.\n\nKeywords phản xạ nhanh (AZ-400)\n\"after it was created\" → Lead time. \"after the work was started\" → Cycle time.\n",
    "boxes": {
      "1": {
        "label": "Thời gian đóng work item sau khi được tạo:",
        "answer": "Lead time"
      },
      "2": {
        "label": "Thời gian đóng work item sau khi bắt đầu làm:",
        "answer": "Cycle time"
      }
    },
    "answerText": "Lead time, Cycle time"
  },
  "289": {
    "stem": "Bạn đang tích hợp Azure Boards project với GitHub repository.\nCần authenticate Azure Boards tới GitHub.\nHai phương thức authentication nào dùng được? (Mỗi đáp án đúng là một cách làm đủ. Mỗi lựa chọn đúng được một điểm.)",
    "options": {
      "A": "a publisher certificate",
      "B": "a trusted root certificate",
      "C": "Microsoft Azure Active Directory (Azure AD), part of Microsoft Entra",
      "D": "GitHub user credentials",
      "E": "a personal access token (PAT)"
    },
    "explanation": "Đáp án: D, E — GitHub user credentials; a personal access token (PAT)\n\nĐề hai cách authenticate Azure Boards tới GitHub.\n\nGitHub user credentials đăng nhập OAuth hoặc user khi kết nối Azure Boards. A personal access token (PAT) cấp quyền repo để Boards đọc commit, PR và tạo link.\n\nA publisher certificate và a trusted root certificate dùng cho code signing hoặc TLS trust, không phải cách kết nối Boards–GitHub. Microsoft Azure Active Directory xác thực Azure, không thay credential GitHub cho integration này theo các lựa chọn đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"authenticate Azure Boards to GitHub\" → GitHub user credentials + PAT.\n",
    "answerText": "D,E"
  },
  "290": {
    "stem": "Bạn có GitHub repository đã tích hợp Azure Boards. Work item số 715.\nCần khi commit source code trên GitHub thì work item được cập nhật tự động.\nNên ghi gì trong commit comments?",
    "options": {
      "A": "the URL of the work item",
      "B": "AB#715",
      "C": "@715",
      "D": "#715"
    },
    "explanation": "Đáp án: B — AB#715\n\nĐề repo GitHub đã nối Azure Boards, work item 715 phải cập nhật khi commit.\n\nAB#715 là syntax Azure Boards trên GitHub: tạo link commit hoặc PR tới work item 715 và cho phép cập nhật theo keyword đi kèm.\n\nThe URL of the work item không được parse như mention. @715 không phải syntax Boards. #715 trên GitHub là issue GitHub, không phải work item Azure Boards.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub\" + \"Azure Boards\" + \"commit\" + \"work item\" → AB#<id>.\n",
    "answerText": "B"
  },
  "291": {
    "stem": "Bạn đang tạo dashboard trong Azure Boards.\nCần visualize thời gian từ lúc bắt đầu làm một work item đến lúc work item được đóng.\nNên dùng widget loại nào?",
    "options": {
      "A": "cycle time",
      "B": "velocity",
      "C": "cumulative flow",
      "D": "lead time"
    },
    "explanation": "Đáp án: A — cycle time\n\nĐề visualize thời gian từ khi bắt đầu làm work item đến khi đóng.\n\nCycle time widget đúng định nghĩa: start work → closed.\n\nVelocity là throughput sprint. Cumulative flow là biểu đồ số lượng theo state. Lead time đo từ khi item được tạo, dài hơn khoảng \"when work starts\".\n\nKeywords phản xạ nhanh (AZ-400)\n\"when work starts\" + \"until the work item is closed\" → cycle time.\n",
    "answerText": "A"
  },
  "292": {
    "stem": "Bạn quản lý project bằng Azure Boards và quản lý code bằng GitHub.\nCó ba work item ID 456, 457, 458.\nCần tạo pull request link tới cả ba work item, đồng thời set state của work item 456 thành Done.\nNên thêm gì vào commit message?",
    "options": {
      "A": "Fixes #456, #457, #458",
      "B": "Fixes #AB456, #AB457, #AB458",
      "C": "#456, #457, #458 Completed #456",
      "D": "#AB456, #AB457, #AB458"
    },
    "explanation": "Đáp án: B — Fixes #AB456, #AB457, #AB458\n\nĐề PR GitHub gắn work item 456, 457, 458 và đặt 456 thành done.\n\nFixes #AB456, #AB457, #AB458 dùng prefix AB cho Azure Boards trên GitHub và keyword Fixes để chuyển 456 (cùng các ID được liệt kê theo cú pháp đó) sang trạng thái hoàn tất theo process.\n\nFixes #456, #457, #458 thiếu AB nên GitHub hiểu là issue GitHub. #456, #457, #458 Completed #456 thiếu prefix AB. #AB456, #AB457, #AB458 chỉ link, không có keyword chuyển state 456.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub\" + \"link all work items\" + \"set 456 to done\" → Fixes #AB456, #AB457, #AB458.\n",
    "answerText": "B"
  },
  "293": {
    "stem": "Bạn muốn mọi GitHub Actions đều được security team validate.\nBạn tạo branch protection rule yêu cầu code changes phải được code owners review.\nCần tạo file CODEOWNERS. Đặt file ở đâu?",
    "options": {
      "A": ".github/actions/",
      "B": ".github/",
      "C": ".git/",
      "D": ".github/workflows/"
    },
    "explanation": "Đáp án: B — .github/\n\nĐề có branch protection yêu cầu review của code owners; hỏi nơi tạo file CODEOWNERS.\n\n.github/CODEOWNERS là vị trí được GitHub nhận cho code owners, kết hợp required review.\n\n.github/actions/ chứa custom actions. .git/ là metadata Git local, không commit CODEOWNERS theo cách này. .github/workflows/ chứa YAML workflow, không phải chỗ CODEOWNERS.\n\nKeywords phản xạ nhanh (AZ-400)\n\"CODEOWNERS\" + \"code owners\" → .github/.\n",
    "answerText": "B"
  },
  "294": {
    "stem": "Bạn đang triển khai project mới trên Azure DevOps.\nCần đánh giá performance project theo hai metric:\n• Mất bao lâu để hoàn thành một work item\n• Tỷ lệ defect phát hiện trên production\nKéo KPI phù hợp vào từng metric. Mỗi KPI dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: Cycle time; Defect escape rate\n\nĐề KPI: thời gian hoàn thành work item, và phần trăm defect phát hiện ở production.\n\nCycle time đo hết một work item từ lúc làm đến xong. Defect escape rate là tỷ lệ lỗi lọt ra production so với lỗi tìm thấy trước đó.\n\nLead time gồm cả hàng đợi trước khi start, rộng hơn \"how long it takes to complete\" theo nghĩa cycle. Mean time to recover đo phục hồi sự cố, không phải tỷ lệ defect production. Velocity không nói chất lượng production.\n\nKeywords phản xạ nhanh (AZ-400)\n\"complete a work item\" → Cycle time. \"defects found in production\" → Defect escape rate.\n",
    "boxes": {
      "1": {
        "label": "Thời gian hoàn thành một work item:",
        "answer": "Cycle time"
      },
      "2": {
        "label": "Tỷ lệ defect phát hiện trên production:",
        "answer": "Defect escape rate"
      }
    },
    "answerText": "Cycle time, Defect escape rate"
  },
  "295": {
    "stem": "Bạn quản lý project bằng Azure Boards và quản lý code bằng GitHub.\nCó ba work item ID 456, 457, 458.\nCần tạo pull request link tới cả ba work item, đồng thời set state của work item 456 thành Done.\nNên thêm gì vào commit message?",
    "options": {
      "A": "Done #456, #457, #458",
      "B": "#AB456, #AB457, #AB458",
      "C": "#456, #457, #458 Completed #456",
      "D": "#AB456, #AB457, #AB458 Completed #AB456"
    },
    "explanation": "Đáp án: D — #AB456, #AB457, #AB458 Completed #AB456\n\nĐề PR GitHub link 456, 457, 458 và chuyển 456 sang done.\n\n#AB456, #AB457, #AB458 tạo link ba work item. Completed #AB456 là keyword đổi state 456 thành Done khi merge.\n\nDone #456, #457, #458 thiếu AB và dùng Done không chuẩn. #AB456, #AB457, #AB458 chỉ link. #456, #457, #458 Completed #456 thiếu AB nên không gắn Azure Boards.\n\nKeywords phản xạ nhanh (AZ-400)\n\"AB#\" + \"Completed\" + \"work item 456\" → #AB456, #AB457, #AB458 Completed #AB456.\n",
    "answerText": "D"
  },
  "296": {
    "stem": "Subscription có Azure Container Registry. Registry có ACR Tasks task tên Task1, chạy một lần mỗi năm ngày.\nCần trigger Task1 chạy ngay. Chạy lệnh nào?",
    "options": {
      "A": "az acr task run",
      "B": "az acr build",
      "C": "az acr taskrun",
      "D": "az acr run"
    },
    "explanation": "Đáp án: A — az acr task run\n\nĐề ACR Tasks task Task1 chạy mỗi năm ngày; cần trigger chạy ngay.\n\naz acr task run khởi động ngay một lần chạy của task đã định nghĩa, bất kể lịch.\n\naz acr build build image ad-hoc, không trigger Task1. az acr taskrun liệt kê lần chạy đã có. az acr run chạy lệnh quick task tạm, không phải Task1 đã schedule.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ACR Tasks\" + \"run immediately\" → az acr task run.\n",
    "answerText": "A"
  },
  "297": {
    "stem": "Bạn quản lý project bằng Azure Boards và quản lý code bằng GitHub.\nCó ba work item ID 456, 457, 458.\nCần tạo pull request link tới cả ba work item, đồng thời set state của work item 456 thành Done.\nNên thêm gì vào commit message?",
    "options": {
      "A": "#AB456, #AB457, #AB458 Completed #AB456",
      "B": "#456, #457, #458 Completed #456",
      "C": "Done #AB456, #AB457, #AB458",
      "D": "#AB456, #AB457, #AB458 Verifies #AB456"
    },
    "explanation": "Đáp án: A — #AB456, #AB457, #AB458 Completed #AB456\n\nĐề giống liên kết GitHub và Azure Boards: link 456, 457, 458 và done cho 456.\n\n#AB456, #AB457, #AB458 Completed #AB456 vừa mention đủ ID vừa hoàn tất 456.\n\n#456, #457, #458 Completed #456 thiếu AB. Done #AB456, #AB457, #AB458 không dùng keyword Completed trên đúng một item. #AB456, #AB457, #AB458 Verifies #AB456 dùng Verifies, không đặt Done như yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub\" + \"Azure Boards\" + \"456 to done\" → #AB... Completed #AB456.\n",
    "answerText": "A"
  },
  "298": {
    "stem": "Work item itemA đang phụ thuộc work item itemB.\nCần định nghĩa dependency cho itemA trên Azure DevOps web portal.\nBạn nên làm gì?",
    "options": {
      "A": "Add a Parent link to the user story of itemA.",
      "B": "From Backlogs, open the context menu, select Add link, and then select itemA. Set Link type to Successor and add the ID of itemB.",
      "C": "From itemA, open the Links tab, and then select Add link. Set Link type to References and add the ID of itemB.",
      "D": "From Backlogs, open he context menu, select Add link, and then select itemA. Set Link type to References and add the ID of itemB."
    },
    "explanation": "Đáp án: B — From Backlogs, Add link trên itemA, Link type Successor, ID của itemB\n\nĐề itemA phụ thuộc itemB; cần định nghĩa dependency trên Azure DevOps web portal.\n\nTừ Backlogs, context menu Add link, chọn itemA, Link type Successor, thêm ID itemB. Successor nói itemA đi sau itemB, tức itemA phụ thuộc hoàn tất itemB.\n\nAdd a Parent link to the user story of itemA tạo hierarchy, không phải dependency thứ tự. From itemA Links tab, Link type References chỉ tham chiếu lỏng. From Backlogs Add link với References cũng không diễn tả predecessor hoặc successor.\n\nKeywords phản xạ nhanh (AZ-400)\n\"dependant\" + \"itemA\" + \"itemB\" → Successor link from itemA to itemB.\n",
    "answerText": "B"
  },
  "299": {
    "stem": "Work item itemA đang phụ thuộc work item itemB.\nCần định nghĩa dependency cho itemA trên Azure DevOps web portal.\nBạn nên làm gì?",
    "options": {
      "A": "From itemA, open the Links tab, and then select Add link. Set Link type to Related and add the ID of itemB.",
      "B": "From Backlogs, open the context menu, select Add link, and then select itemA. Set Link type to Successor and add the ID of itemB.",
      "C": "From itemA, open the Links tab, and then select Add link. Set Link type to References and add the ID of itemB.",
      "D": "From Queries, open the context menu, select Add link, and then select Existing Item. Set Link type to Affected By and add the ID of itemB."
    },
    "explanation": "Đáp án: B — From Backlogs, Add link trên itemA, Link type Successor, ID của itemB\n\nĐề trùng dependency itemA phụ thuộc itemB trên portal.\n\nSuccessor từ itemA tới itemB là link type đúng cho phụ thuộc thứ tự trên backlog.\n\nFrom itemA Links tab, Related chỉ quan hệ hai chiều chung. References không chặn itemA theo itemB. From Queries, Affected By diễn tả impact, không phải predecessor hoặc successor chuẩn cho dependency làm việc.\n\nKeywords phản xạ nhanh (AZ-400)\n\"work item dependency\" + \"Successor\" → itemA Successor of itemB.\n",
    "answerText": "B"
  },
  "300": {
    "stem": "Bạn có các service như trong bảng (thường là Service1 dùng HTTPS và Service2 dùng HTTP).\nBạn quản lý project bằng Azure Boards.\nCần notify các service khi build status thay đổi.\nWebhook có thể notify service nào?",
    "options": {
      "A": "Service1 only",
      "B": "Service2 only",
      "C": "Service1 and Service2"
    },
    "explanation": "Đáp án: C — Service1 and Service2\n\nĐề có hai service (HTTPS và HTTP) và hỏi service nào nhận build status qua webhook Azure DevOps.\n\nWebhook service hook gửi HTTP POST JSON tới public URL. Microsoft khuyến nghị HTTPS, nhưng HTTP không bị chặn, nên cả Service1 và Service2 nhận được build status.\n\nService1 only bỏ sót endpoint HTTP hợp lệ. Service2 only bỏ sót HTTPS. Localhost hoặc địa chỉ đặc biệt mới bị loại, không phải HTTP công khai.\n\nKeywords phản xạ nhanh (AZ-400)\n\"webhook\" + \"build status\" + \"HTTP and HTTPS\" → Service1 and Service2.\n",
    "answerText": "C"
  },
  "301": {
    "stem": "Bạn đang dùng Agile process và Azure Boards trên Azure DevOps.\nBạn import các work item như trong bảng. Cần categorize từng item.\nGán state nào cho từng item? Kéo state phù hợp vào từng item. Mỗi state dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: Item1 = Resolved; Item2 = Proposed; Item3 = Completed\n\nĐề đang hỏi gán state category Agile trên Azure Boards cho từng work item vừa import.\n\nItem1 gán Resolved vì work đã được implement nhưng chưa verify/accept; category Resolved/In Progress vẫn hiện trên backlog. Item2 gán Proposed vì đây là trạng thái đầu, item còn là đề xuất và chưa start. Item3 gán Completed vì work đã xong, tested và accepted; category Completed/Done không còn trên backlog nhưng vẫn thấy trên board.\n\nKhông gán In Progress cho Item2 vì In Progress nghĩa là đã bắt đầu làm. Không gán Removed vì Removed là loại bỏ khỏi backlog, không phải Done. Không đảo Resolved và Completed: Completed là trạng thái cuối, Resolved vẫn chờ xác nhận.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Agile\" + \"categorize imported work items\" → Resolved / Proposed / Completed.\n",
    "boxes": {
      "1": {
        "answer": "Resolved"
      },
      "2": {
        "answer": "Proposed"
      },
      "3": {
        "answer": "Completed"
      }
    },
    "answerText": "Resolved, Proposed, Completed"
  },
  "302": {
    "stem": "Subscription có Azure Pipelines pipeline tên Pipeline1 và app tên App1. Pipeline1 tự động build App1.\nBạn có Slack channel App1chat với incoming webhook.\nCần khi build App1 thành công thì gửi notification tới App1chat qua webhook.\nBạn nên dùng gì?",
    "options": {
      "A": "a notification",
      "B": "an alert rule",
      "C": "a subscription",
      "D": "an action group"
    },
    "explanation": "Đáp án: C — a subscription\n\nĐề cần khi Pipeline1 build App1 thành công thì gửi tin tới Slack channel App1chat qua incoming webhook.\n\nTrong Azure DevOps, service hook subscription lắng nghe event (build succeeded) rồi POST payload tới URL webhook. Đây là cơ chế tích hợp event-driven với dịch vụ ngoài như Slack.\n\nA sai vì notification trong Azure DevOps chủ yếu báo cho user trong organization (work item, pull request), không POST tới Slack webhook. B sai vì alert rule thuộc Azure Monitor, theo dõi metric/log resource Azure chứ không phải event pipeline. D sai vì action group cũng thuộc Azure Monitor, gắn với alert chứ không subscribe build Azure Pipelines.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Slack incoming webhook\" + \"successful build\" → service hook subscription.\n",
    "answerText": "C"
  },
  "303": {
    "stem": "Bạn quản lý project bằng Azure Boards, quản lý code bằng GitHub.\nCó work item ID 123.\nCần link work item 123 với một pull request mới.\nHai cách nào đạt mục tiêu? (Mỗi đáp án đúng là một cách làm đủ. Mỗi lựa chọn đúng được một điểm.)",
    "options": {
      "A": "In the Development section for work item 123, select Add link, and then enter the URL of the pull request.",
      "B": "To the description of the pull request, add #AB123.",
      "C": "To work item 123 add a comment that includes the URL of the pull request",
      "D": "From work item 123, open the Links tab, select Add link, select Existing item, and then enter the URL of the commit."
    },
    "explanation": "Đáp án: A, B\n\nĐề cần link work item 123 trên Azure Boards với một pull request mới trên GitHub.\n\nA đúng vì Development → Add link rồi nhập URL pull request tạo liên kết chính thức, điều hướng được giữa work item và PR. B đúng vì #AB123 (hoặc AB#123) trong description pull request được Azure Boards–GitHub nhận và tự tạo link tới work item 123.\n\nC sai vì comment chứa URL trên work item không tạo Development link tự động. D sai vì Links → Existing item với URL commit nhắm nhầm artifact (commit, không phải pull request) và không phải cách chuẩn link PR.\n\nKeywords phản xạ nhanh (AZ-400)\n\"link work item\" + \"GitHub pull request\" → Development Add link URL PR + #AB123 in PR description.\n",
    "answerText": "A,B"
  },
  "304": {
    "stem": "Bạn định dùng Azure DevOps trong quy trình phát triển.\nCác vấn đề hiện tại:\n• Thường phát hiện bug trên production\n• Khách hàng phát hiện bug ngày càng nhiều\n• Sửa bug chậm, production phục hồi chậm\nCần KPI theo dõi từng vấn đề.\nKéo KPI phù hợp vào từng issue. Mỗi KPI dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: Defect escape rate; Bug report rates; Application failure rates\n\nĐề cần KPI theo dõi lần lượt: bug xuất hiện nhiều trên production, khách hàng phát hiện bug ngày càng nhiều, và sửa/phục hồi production chậm.\n\nFrequent discovery of bugs in production đo bằng Defect escape rate: tỷ lệ lỗi lọt khỏi test/QA ra production. Increasing detection by customers đo bằng Bug report rates: tần suất user/customer báo bug. Slow resolution and slow resumption of production được đề map sang Application failure rates: mức độ/ảnh hưởng failure trên ứng dụng khi production chưa ổn.\n\nKhông dùng Deployment failure rates cho các ô này vì metric đó đo lỗi deploy, không đo bug lọt production hay báo cáo từ khách hàng. Không đảo Defect escape rate với Bug report rates: escape rate là QA/test miss, bug report rates là tín hiệu từ customer.\n\nKeywords phản xạ nhanh (AZ-400)\n\"bugs in production\" + \"customers detect\" + \"slow resume production\" → Defect escape rate / Bug report rates / Application failure rates.\n",
    "boxes": {
      "1": {
        "label": "Thường phát hiện bug trên production:",
        "answer": "Defect escape rate"
      },
      "2": {
        "label": "Khách hàng phát hiện bug ngày càng nhiều:",
        "answer": "Bug report rates"
      },
      "3": {
        "label": "Sửa bug chậm, production phục hồi chậm:",
        "answer": "Application failure rates"
      }
    },
    "answerText": "Defect escape rate, Bug report rates, Application failure rates"
  },
  "305": {
    "stem": "Work item itemA đang phụ thuộc work item itemB.\nCần định nghĩa dependency cho itemA trên Azure DevOps web portal.\nBạn nên làm gì?",
    "options": {
      "A": "Add a Parent link to the user story of itemA.",
      "B": "From Backlogs, open the context menu, select Add link, and then select itemA. Set Link type to References and add the ID of itemB.",
      "C": "From itemA, open the Links tab, and then select Add link. Set Link type to References and add the ID of itemB.",
      "D": "From itemA, open the Links tab, and then select Add link. Set Link type to Successor and add the ID of itemB."
    },
    "explanation": "Đáp án: D\n\nĐề cần định nghĩa dependency: itemA phụ thuộc itemB trên Azure DevOps web portal.\n\nTừ itemA mở Links, Add link, Link type Successor, rồi thêm ID itemB. itemA là successor vì không thể hoàn thành trước itemB (predecessor).\n\nA sai vì Parent là quan hệ hierarchy (epic/story/task), không phải thứ tự phụ thuộc. B và C sai vì Link type References không diễn tả predecessor/successor. B còn thêm link từ Backlogs với References nên vẫn thiếu ngữ nghĩa dependency.\n\nKeywords phản xạ nhanh (AZ-400)\n\"itemA dependent on itemB\" + \"Links tab\" → Successor + ID of itemB.\n",
    "answerText": "D"
  },
  "306": {
    "stem": "Project App Project dùng để develop App1. Có Azure Boards team dashboard theo dõi tiến độ App1 và work items.\nCần theo dõi mất bao lâu để đóng work item sau khi bắt đầu làm.\nNên thêm widget loại nào?",
    "options": {
      "A": "sprint burndown",
      "B": "velocity",
      "C": "lead time",
      "D": "cycle time"
    },
    "explanation": "Đáp án: D — cycle time\n\nĐề cần widget đo thời gian từ lúc bắt đầu làm work item đến lúc đóng item.\n\nCycle time đúng vì đo elapsed time từ khi work chuyển sang In Progress/active đến khi closed.\n\nC sai vì lead time tính từ lúc tạo work item đến lúc đóng, gồm cả thời gian chờ chưa start. A sai vì sprint burndown chỉ remaining work trong sprint. B sai vì velocity đo lượng work hoàn thành theo sprint, không đo duration từng item.\n\nKeywords phản xạ nhanh (AZ-400)\n\"close a work item once work has commenced\" → cycle time (not lead time).\n",
    "answerText": "D"
  },
  "307": {
    "stem": "Bug work item ID 123. Cần set state Resolved qua commit message.\nNên thêm gì vào commit message?",
    "options": {
      "A": "#123 completes",
      "B": "Resolves #AB-123",
      "C": "Verifies #123",
      "D": "Fixes #123"
    },
    "explanation": "Đáp án: D — Fixes #123\n\nĐề cần commit message chuyển bug 123 sang state Resolved trên Azure Repos/Azure Boards.\n\nFixes #123 (cùng họ Fix/Fixed) là cú pháp Azure DevOps nhận: link commit và transition work item sang Resolved tùy process.\n\nA sai vì #123 completes thường đóng item (Closed/Done), không phải Resolved. B sai vì Resolves #AB-123 không phải cú pháp chuẩn Azure Repos; tiền tố AB- không đúng (GitHub–Boards dùng AB#123). C sai vì Verifies #123 không kích hoạt transition Resolved.\n\nKeywords phản xạ nhanh (AZ-400)\n\"commit message\" + \"state Resolved\" → Fixes #123.\n",
    "answerText": "D"
  },
  "308": {
    "stem": "Bạn quản lý project bằng Azure Boards, quản lý code bằng GitHub repositories.\nCó work item ID 123.\nCần link commit message trên GitHub với work item 123 trên board.\nHai cách nào đạt mục tiêu? (Mỗi đáp án đúng là một cách làm đủ. Mỗi lựa chọn đúng được một điểm.)",
    "options": {
      "A": "Add AB#123 to the text of the commit message.",
      "B": "From the Development settings of work item 123, select Add link, and then enter the URL of the commit.",
      "C": "Add GH-123 to the text of the commit message.",
      "D": "From the Links settings of work item 123, select Add link, select Existing item, and then enter the URL of the commit",
      "E": "To work item 123, add a comment that includes the URL of the commit."
    },
    "explanation": "Đáp án: A, B\n\nĐề cần link commit GitHub với work item 123 trên Azure Boards.\n\nA đúng vì AB#123 trong commit message được integration Boards–GitHub parse và tạo link. B đúng vì Development → Add link rồi nhập URL commit tạo Development link thủ công từ work item.\n\nC sai vì GH-123 là cú pháp GitHub issue, không link Azure Boards. D sai vì Links → Existing item không phải đường Development chuẩn cho commit GitHub. E sai vì comment chứa URL không tạo link Development tự động.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub commit\" + \"work item 123\" → AB#123 + Development Add link (commit URL).\n",
    "answerText": "A, B"
  },
  "309": {
    "stem": "Project Azure DevOps dùng Azure Boards và lưu code trên GitHub. Repo có README.md.\nCần README.md hiện status của work items trên board, giảm tối đa công sức quản trị.\nViệc đầu tiên nên làm gì?",
    "options": {
      "A": "Create a GitHub personal access token (PAT).",
      "B": "Enable GitHub annotations for the board.",
      "C": "Install the Azure Boards app for GitHub.",
      "D": "Select Allow anonymous users to access the status badge."
    },
    "explanation": "Đáp án: C — Install the Azure Boards app for GitHub\n\nĐề cần README.md hiện status work items trên board, ít administrative effort nhất, và hỏi bước đầu tiên.\n\nCài Azure Boards app for GitHub là bước tích hợp chuẩn: ủy quyền, link work items với repo, rồi mới nhúng status badge hoặc mention work item trên README với ít overhead.\n\nA sai vì tự tạo GitHub PAT rồi gọi API tốn công hơn, không phải bước first tối thiểu. B sai vì GitHub annotations không phải bước mở đầu để hiện board status trên README. D sai vì Allow anonymous users to access the status badge là setting badge sau khi đã kết nối.\n\nKeywords phản xạ nhanh (AZ-400)\n\"README.md\" + \"work item status\" + \"GitHub\" → Install Azure Boards app for GitHub first.\n",
    "answerText": "C"
  },
  "310": {
    "stem": "Bug work item ID 123. Cần set state Resolved qua commit message.\nNên thêm gì vào commit message?",
    "options": {
      "A": "#123 fixed",
      "B": "#123 Resolved",
      "C": "Verifies #123",
      "D": "Resolves #123"
    },
    "explanation": "Đáp án: D — Resolves #123\n\nĐề cần commit message đưa bug 123 sang Resolved.\n\nKeyword phải đứng trước #ID. Resolves #123 (cùng họ Fixes/Closes) được Azure DevOps nhận để transition sang Resolved.\n\nA và B sai vì #123 fixed và #123 Resolved đặt keyword sau ID nên parser không trigger state change. C sai vì Verifies không đổi state work item.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Resolved\" + \"commit message\" → Resolves #123 (keyword before #ID).\n",
    "answerText": "D"
  },
  "311": {
    "stem": "Work item itemA đang phụ thuộc work item itemB.\nCần định nghĩa dependency cho itemA trên Azure DevOps web portal.\nBạn nên làm gì?",
    "options": {
      "A": "Add a Parent link to the user story of itemA.",
      "B": "From Backlogs, open the context menu, select Add link, and then select itemA. Set Link type to Successor and add the ID of itemB.",
      "C": "From Backlogs, open the context menu, select Add link, and then select itemB. Set Link type to Related and add the ID of itemA.",
      "D": "From itemA, open the Links tab, and then select Add link. Set Link type to References and add the ID of itemB."
    },
    "explanation": "Đáp án: B\n\nĐề cần định nghĩa itemA phụ thuộc itemB trên web portal.\n\nTừ Backlogs, context menu trên itemA, Add link, Link type Successor, thêm ID itemB. itemA là successor của itemB.\n\nA sai vì Parent là hierarchy. C sai vì Related không phải dependency tuần tự, và thao tác xuất phát từ itemB nên chiều quan hệ không đúng. D sai vì References không diễn tả “dependent on”.\n\nKeywords phản xạ nhanh (AZ-400)\n\"itemA dependent on itemB\" + \"Backlogs Add link\" → Successor + ID of itemB.\n",
    "answerText": "B"
  },
  "312": {
    "stem": "Cần tạo team dashboard mới tên Dashboard1 cho default project team của Project1.\nDashboard phải hiển thị các thành viên của team.",
    "explanation": "Đáp án: Tạo team dashboard Dashboard1 cho default project team của Project1 rồi thêm widget Team Members\n\nĐề cần dashboard đội mặc định của Project1 và phải hiện danh sách member.\n\nMở Project1 → Overview/Boards → Dashboards → New dashboard, đặt tên Dashboard1, gán default project team, Create. Add widget Team Members rồi Save. Widget này liệt kê member của team gắn với dashboard.\n\nKhông tạo project dashboard chung nếu đề yêu cầu team dashboard. Không dùng widget Query/Charts thay Team Members vì chúng không liệt kê thành viên team.\n\nKeywords phản xạ nhanh (AZ-400)\n\"team dashboard\" + \"display the members\" → New dashboard + Team Members widget.\n",
    "answerText": "Tạo Dashboard1 cho default team của Project1, thêm widget Team Members."
  },
  "313": {
    "stem": "Với Project1, cần tạo project wiki tên Wiki1, dùng cú pháp Mermaid để render diagram.\nMẫu output mong muốn nằm ở C:\\Resources\\TCPHandshake.png.",
    "explanation": "Đáp án: Tạo project wiki Wiki1 rồi vẽ diagram bằng fence mermaid (TCP handshake)\n\nĐề cần project wiki tên Wiki1 trên Project1, render diagram bằng Mermaid, mẫu nằm ở TCPHandshake.png.\n\nTrong Project1 mở Overview → Wiki, tạo/publish project wiki Wiki1. Tạo page mới, dùng code fence mermaid với sequenceDiagram Client/Server SYN, SYN-ACK, ACK tương đương ảnh mẫu, rồi Save. Azure DevOps wiki hỗ trợ Mermaid trong markdown.\n\nKhông nhúng PNG thay mermaid vì đề bắt cú pháp Mermaid. Không dùng code wiki không có fence mermaid vì diagram sẽ không render.\n\nKeywords phản xạ nhanh (AZ-400)\n\"project wiki\" + \"Mermaid\" + \"TCPHandshake\" → Wiki1 + mermaid sequenceDiagram.\n",
    "answerText": "Tạo project wiki Wiki1 và thêm trang Mermaid (TCP handshake)."
  },
  "314": {
    "stem": "Project Azure DevOps dùng để build và test App1.\nCần troubleshoot:\n• Hầu hết bug do customer phát hiện và báo.\n• Phát hiện failure mất rất lâu.\nMetric nào nên xem cho từng issue? Chọn option trong answer area.",
    "explanation": "Đáp án: Bug report rates; Mean time to detection\n\nĐề cần metric cho hai vấn đề: hầu hết bug do khách hàng phát hiện/báo, và mất lâu mới phát hiện failure.\n\nBug report rates đo tần suất customer report, khớp nhánh “bugs detected and reported by customers”. Mean time to detection (MTTD) đo thời gian từ khi failure xảy ra đến khi được phát hiện, khớp “takes a long time to detect failures”.\n\nKhông chọn Defect escape rate cho ô customer vì đề chọn Bug report rates cho tín hiệu từ khách hàng. Không chọn Mean time to recovery (MTTR) cho ô thứ hai vì MTTR là thời gian sửa/phục hồi, không phải thời gian phát hiện.\n\nKeywords phản xạ nhanh (AZ-400)\n\"bugs reported by customers\" + \"long time to detect failures\" → Bug report rates / MTTD.\n",
    "boxes": {
      "1": {
        "label": "Hầu hết bug do customer phát hiện và báo:",
        "answer": "Bug report rates"
      },
      "2": {
        "label": "Phát hiện failure mất rất lâu:",
        "answer": "Mean time to detection"
      }
    },
    "answerText": "Bug report rates, Mean time to detection"
  },
  "315": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh, mỗi câu một giải pháp. Không quay lại được.\nCần recommend chiến lược tích hợp cho build Java app, thỏa:\n• Build phải truy cập on-premises dependency management system.\n• Build output lưu Server artifacts trên Azure DevOps.\n• Source code nằm Git repo trên Azure DevOps.\nGiải pháp: Cấu hình build pipeline dùng Microsoft-hosted agent pool image Windows Server 2019 with Visual Studio 2019. Thêm task Java Tool Installer.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề series yêu cầu build Java: truy cập on-premises dependency management, artifact lưu trên Azure DevOps, source trên Git Azure Repos. Solution dùng Microsoft-hosted Windows Server 2019 + Java Tool Installer.\n\nGiải pháp không đạt vì Microsoft-hosted agent chạy trên Azure, không có mạng tới dependency server on-premises. Java Tool Installer chỉ cài JDK, không mở connectivity. Artifact và Git trên Azure DevOps thì hosted agent làm được, nhưng thiếu đúng yêu cầu dependency on-prem.\n\nCần self-hosted agent trong mạng on-premises (hoặc hybrid connectivity). Không chọn Yes chỉ vì image có Visual Studio/Java.\n\nKeywords phản xạ nhanh (AZ-400)\n\"on-premises dependency\" + \"Microsoft-hosted agent\" → No (need self-hosted).\n",
    "answerText": "B"
  },
  "316": {
    "stem": "Bạn có YAML template Template1.yml:\nsteps:\n- script: npm install\n- script: yarn install\n- script: npm run compile\n\nPipeline File1.yml có parameters usersteps (NuGetCommand + echo Done).\nCần Template1.yml chạy trước File1.yml. Nên cập nhật File1.yml thế nào?",
    "options": {
      "A": "parameters: usersteps: extends: template: template1.yml - task: NuGetCommand@2 - script: echo Done",
      "B": "template: template1.yml parameters: usersteps: - task: NuGetCommand@2 - script: echo Done",
      "C": "extends: template: template1.yml parameters: usersteps: - task: NuGetCommand@2 - script: echo Done",
      "D": "parameters: usersteps: - template: template1.yml - task: NuGetCommand@2 - script: echo Done"
    },
    "explanation": "Đáp án: C — extends: template: Template1.yml rồi parameters.usersteps\n\nĐề cần Template1.yml (npm install, yarn install, npm run compile) chạy trước các step của File1.yml.\n\nextends ở root khiến File1 kế thừa pipeline/template cha; steps của Template1 chạy trước, usersteps được chèn sau theo tham số.\n\nA sai vì extends nằm trong parameters, sai cú pháp. B sai vì khai báo template: ở root không phải extends (include khác ngữ nghĩa inheritance). D sai vì - template: bên trong usersteps không biến Template1 thành parent chạy trước toàn bộ File1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"YAML template runs before\" + \"usersteps\" → extends: template + parameters.\n",
    "answerText": "C"
  },
  "317": {
    "stem": "Azure solution có build pipeline trên Azure Pipelines. Đôi khi pipeline bị delay trước khi start.\nCần giảm thời gian chờ start. Bạn nên làm gì?",
    "options": {
      "A": "Enable self-hosted build agents.",
      "B": "Create a new agent pool.",
      "C": "Split the build pipeline into multiple stages.",
      "D": "Purchase an additional parallel job."
    },
    "explanation": "Đáp án: A — Enable self-hosted build agents\n\nĐề cần giảm thời gian chờ trước khi build pipeline bắt đầu (intermittent delays).\n\nDelay start thường do queue Microsoft-hosted dùng chung. Self-hosted agent riêng nhận job ngay khi máy rảnh, rút thời gian start.\n\nB sai vì tạo agent pool mới mà không có agent sẵn thì không giảm wait. C sai vì tách nhiều stage không rút hàng đợi lúc start. D sai vì thêm parallel job giúp chạy đồng thời nhưng vẫn phụ thuộc hosted pool; đề chọn self-hosted để bỏ chờ shared pool.\n\nKeywords phản xạ nhanh (AZ-400)\n\"delays before the build pipeline starts\" → self-hosted build agents.\n",
    "answerText": "A"
  },
  "318": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh, mỗi câu một giải pháp. Không quay lại được.\nCần recommend chiến lược tích hợp build Java app: truy cập on-premises dependency; output là Server artifacts; source trên Git Azure DevOps.\nGiải pháp: Microsoft-hosted agent pool image Linux + Java Tool Installer.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng yêu cầu Java + on-premises dependency. Solution dùng Microsoft-hosted Linux + Java Tool Installer.\n\nHosted Linux agent không reach dependency management on-premises. Linux image và Java Tool Installer chỉ lo toolchain Java, không tạo tuyến mạng vào on-prem.\n\nCần self-hosted agent on-premises. Không chọn Yes chỉ vì Linux phù hợp Java.\n\nKeywords phản xạ nhanh (AZ-400)\n\"on-premises dependency\" + \"Microsoft-hosted Linux\" → No.\n",
    "answerText": "B"
  },
  "319": {
    "stem": "Source code nằm Git repository trên Azure Repos. Bạn dùng third-party CI tool điều khiển builds.\nAzure DevOps dùng gì để authenticate với tool đó?",
    "options": {
      "A": "certificate authentication",
      "B": "a personal access token (PAT)",
      "C": "a Shared Access Signature (SAS) token",
      "D": "NTLM authentication"
    },
    "explanation": "Đáp án: B — a personal access token (PAT)\n\nĐề hỏi Azure DevOps xác thực thế nào với third-party CI khi source nằm trên Azure Repos.\n\nThird-party CI clone/push Repos hoặc gọi REST API dùng PAT (scope Code) thay password cho automation.\n\nA và D sai vì certificate authentication và NTLM không phải cơ chế chuẩn Azure DevOps Services cho CI ngoài. C sai vì SAS token dùng Azure Storage, không phải Azure Repos.\n\nKeywords phản xạ nhanh (AZ-400)\n\"third-party CI\" + \"Azure Repos authenticate\" → personal access token (PAT).\n",
    "answerText": "B"
  },
  "320": {
    "stem": "Bạn đang cấu hình Azure Pipelines cho ba project như trong bảng.\nChọn version control / source phù hợp cho từng project.",
    "explanation": "Đáp án: Project1 = Git in Azure Repos; Project2 = GitHub Enterprise; Project3 = Assembla Subversion\n\nĐề map từng project trong bảng tới hệ thống source mà Azure Pipelines lấy code.\n\nProject1 dùng Git in Azure Repos vì repo Git native trên Azure DevOps, pipeline lấy source trực tiếp. Project2 dùng GitHub Enterprise vì đây là GitHub on-premises mà Azure Pipelines kết nối được. Project3 dùng Assembla Subversion vì yêu cầu SVN tập trung; Pipelines hỗ trợ Subversion qua Assembla/SVN.\n\nKhông chọn Bitbucket Cloud cho Project2/Project3 vì Bitbucket là Git hosted khác, không khớp GitHub Enterprise on-prem hay SVN.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Pipelines source\" + \"GHE / SVN\" → Azure Repos Git / GitHub Enterprise / Assembla Subversion.\n",
    "boxes": {
      "1": {
        "answer": "Git in Azure Repos"
      },
      "2": {
        "answer": "GitHub Enterprise"
      },
      "3": {
        "answer": "Assembla Subversion"
      }
    },
    "answerText": "Git in Azure Repos, GitHub Enterprise, Assembla Subversion"
  },
  "321": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh, mỗi câu một giải pháp. Không quay lại được.\nCần recommend chiến lược tích hợp build Java: truy cập on-premises dependency; Server artifacts; Git trên Azure DevOps.\nGiải pháp: Cài Octopus Tentacle trên máy on-premises. Dùng Package Application task trong build pipeline.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng yêu cầu Java + on-premises dependency. Solution: Octopus Tentacle on-prem + Package Application task.\n\nOctopus Tentacle phục vụ deploy, không phải build agent resolve Maven/NuGet on-prem lúc compile. Package Application đóng gói để deploy, không mở truy cập dependency management.\n\nCần self-hosted build agent trong mạng on-premises. Không chọn Yes vì Tentacle “ở on-prem”.\n\nKeywords phản xạ nhanh (AZ-400)\n\"on-premises dependency\" + \"Octopus Tentacle\" → No (need self-hosted build agent).\n",
    "answerText": "B"
  },
  "322": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh, mỗi câu một giải pháp. Không quay lại được.\nCần recommend chiến lược tích hợp build Java: truy cập on-premises dependency; Server artifacts; Git trên Azure DevOps.\nGiải pháp: Cài self-hosted build agent trên máy on-premises. Pipeline dùng Default agent pool. Thêm Java Tool Installer.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: A — Yes\n\nCùng yêu cầu Java + on-premises dependency. Solution: self-hosted build agent on-prem, Default agent pool, Java Tool Installer.\n\nSelf-hosted agent nằm cùng mạng với dependency management nên resolve được package. Default pool là nơi đăng ký agent đó. Java Tool Installer lo JDK. Publish artifacts lên Azure DevOps; source đã ở Git Azure Repos. Đây là giải pháp đúng của series.\n\nKhông cần Microsoft-hosted vì hosted không tới on-prem. Tentacle/Package Application không thay build agent.\n\nKeywords phản xạ nhanh (AZ-400)\n\"on-premises dependency\" + \"self-hosted agent\" + \"Default pool\" → Yes.\n",
    "answerText": "A"
  },
  "323": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh, mỗi câu một giải pháp. Không quay lại được.\nCần recommend chiến lược tích hợp build Java: truy cập on-premises dependency; Server artifacts; Git trên Azure DevOps.\nGiải pháp: Hosted VS 2019 agent pool + Java Tool Installer.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng yêu cầu. Solution: Hosted VS 2019 + Java Tool Installer.\n\nHosted VS2019 chạy trên hạ tầng Microsoft, không có tuyến tới on-premises dependency system. Java Tool Installer không bù connectivity.\n\nCần self-hosted on-premises. Không chọn Yes chỉ vì image Windows có Visual Studio.\n\nKeywords phản xạ nhanh (AZ-400)\n\"on-premises dependency\" + \"Hosted VS 2019\" → No.\n",
    "answerText": "B"
  },
  "324": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh, mỗi câu một giải pháp. Không quay lại được.\nCần recommend chiến lược tích hợp build Java: truy cập on-premises dependency; Server artifacts; Git trên Azure DevOps.\nGiải pháp: Hosted Ubuntu agent pool + Java Tool Installer.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng yêu cầu. Solution: Hosted Ubuntu + Java Tool Installer.\n\nHosted Ubuntu không reach on-premises dependency. Cần self-hosted agent on-premises.\n\nKhông chọn Yes chỉ vì Ubuntu phổ biến cho Java.\n\nKeywords phản xạ nhanh (AZ-400)\n\"on-premises dependency\" + \"Hosted Ubuntu\" → No.\n",
    "answerText": "B"
  },
  "325": {
    "stem": "Công ty dùng Git repository trên Azure Repos cho web app. Branch master được bảo vệ, không push trực tiếp. Developer làm feature trên topic branches.\nLịch sử thay đổi trên master khó theo dõi vì quá nhiều feature.\nCần enforce pull request merge strategy: gom commit history, merge thành một commit duy nhất.\nNên dùng merge strategy nào trong branch policy?",
    "options": {
      "A": "squash merge",
      "B": "fast-forward merge",
      "C": "Git fetch",
      "D": "no-fast-forward merge"
    },
    "explanation": "Đáp án: A — squash merge\n\nĐề cần branch policy merge: gom history và đưa thay đổi thành một commit trên master (topic branches nhiều, history khó đọc).\n\nSquash merge gộp toàn bộ commit topic branch thành một commit trên master, history ngắn và tuyến tính.\n\nB sai vì fast-forward chỉ dời pointer, giữ nguyên từng commit feature. C sai vì Git fetch không phải merge strategy. D sai vì no-fast-forward (merge commit) thêm merge commit và vẫn giữ lịch sử feature.\n\nKeywords phản xạ nhanh (AZ-400)\n\"consolidate commit histories\" + \"single commit\" → squash merge.\n",
    "answerText": "A"
  },
  "326": {
    "stem": "Công ty dùng cloud-hosted Jenkins để build.\nCần Jenkins lấy source từ Azure Repos.\nBa thao tác nào? (Mỗi lựa chọn đúng là một phần giải pháp. Mỗi lựa chọn đúng được một điểm.)",
    "options": {
      "A": "Create a webhook in Jenkins.",
      "B": "Add the Team Foundation Server (TFS) plug-in to Jenkins.",
      "C": "Add a personal access token to your Jenkins account.",
      "D": "Create a personal access token (PAT) in your Azure DevOps account.",
      "E": "Create a service hook in Azure DevOps."
    },
    "explanation": "Đáp án: B, D, E\n\nĐề cần Jenkins (cloud-hosted) lấy source từ Azure Repos.\n\nB đúng vì cài Team Foundation Server / Azure DevOps plug-in để Jenkins nói chuyện với Repos. D đúng vì tạo PAT trên Azure DevOps để Jenkins authenticate clone. E đúng vì service hook trên Azure DevOps trigger Jenkins khi có push/PR.\n\nA sai vì webhook tạo phía Jenkins không thay service hook Azure DevOps. C sai vì không gắn PAT vào “Jenkins account” như user Jenkins; PAT phải phát hành từ Azure DevOps.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Jenkins\" + \"Azure Repos\" → TFS plug-in + PAT in Azure DevOps + service hook.\n",
    "answerText": "B, D, E"
  },
  "327": {
    "stem": "Công ty có bốn project với yêu cầu version control như bảng.\nĐịnh dùng Azure Repos cho mọi project.\nHệ thống version control nào cho từng project? Kéo VCS phù hợp vào từng project.",
    "explanation": "Đáp án: Project1 = TFVC; Project2 = Git; Project3 = Subversion; Project4 = Git\n\nĐề chọn version control trên Azure Repos theo yêu cầu từng project.\n\nProject1 dùng Team Foundation Version Control vì cần restrict access xuống từng file/folder. Project2 dùng Git vì cần branch policies (nhiều reviewer, work item linked trước merge). Project3 dùng Subversion theo key đề (Xcode làm việc tốt với SVN). Project4 dùng Git vì kiểm soát quyền trên release branch bằng branch security.\n\nKhông dùng Perforce vì không phải hệ thống Azure Repos. Không dùng TFVC cho Project2/4 vì branch policy và branch security là mô hình Git.\n\nKeywords phản xạ nhanh (AZ-400)\n\"file-level permissions\" + \"reviewers/work item\" + \"Xcode\" + \"release branch\" → TFVC / Git / Subversion / Git.\n",
    "boxes": {
      "1": {
        "answer": "Team Foundation Version Control"
      },
      "2": {
        "answer": "Git"
      },
      "3": {
        "answer": "Subversion"
      },
      "4": {
        "answer": "Git"
      }
    },
    "answerText": "Team Foundation Version Control, Git, Subversion, Git"
  },
  "328": {
    "stem": "Bạn đang tự động hóa build cho ứng dụng Java trên Azure DevOps.\nCần thêm code coverage và publish kết quả lên pipeline.\nNên dùng gì?",
    "options": {
      "A": "Bullseye Coverage",
      "B": "JUnit",
      "C": "JaCoCo",
      "D": "MSTest"
    },
    "explanation": "Đáp án: C — JaCoCo\n\nĐề cần code coverage cho ứng dụng Java trên Azure Pipelines và publish kết quả.\n\nJaCoCo là công cụ coverage Java; task Publish Code Coverage Results đọc Cobertura/JaCoCo.\n\nA sai vì Bullseye Coverage chủ yếu C/C++. B sai vì JUnit là unit test runner, không phải coverage report. D sai vì MSTest là .NET.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Java\" + \"code coverage\" + \"publish\" → JaCoCo.\n",
    "answerText": "C"
  },
  "329": {
    "stem": "Công ty dùng Azure DevOps deploy infrastructure lên Azure. Pipeline viết bằng YAML.\nBạn chạy pipeline và thấy kết quả như exhibit trên Azure Pipelines web portal.\nDùng drop-down hoàn thành mỗi câu theo hình. Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: three stages; one job\n\nĐề đọc exhibit YAML pipeline trên Azure Pipelines.\n\nPipeline chứa three stages theo pipeline view. Stage Build_vm chứa one job do bạn định nghĩa; Finalize Job là job hệ thống append, không tính thêm job.\n\nKhông đếm Finalize Job thành job thứ hai. Không nhầm số stage với số task.\n\nKeywords phản xạ nhanh (AZ-400)\n\"pipeline exhibit\" + \"Build_vm\" → three stages / one job (ignore Finalize Job).\n",
    "boxes": {
      "1": {
        "label": "The pipeline contains:",
        "answer": "three stages"
      },
      "2": {
        "label": "Build_vm contains:",
        "answer": "one job"
      }
    },
    "answerText": "three stages, one job"
  },
  "330": {
    "stem": "Bạn đang cấu hình Azure DevOps build pipelines, định dùng hosted build agents.\nAgent pool nào để compile từng loại application? Kéo pool phù hợp. Mỗi pool dùng một lần, nhiều lần, hoặc không dùng. Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: iOS = Hosted macOS; IIS Docker = Hosted\n\nĐề chọn Microsoft-hosted pool cho từng loại app.\n\nỨng dụng iOS cần Hosted macOS vì Xcode và signing chỉ chạy trên macOS. IIS web app trong Docker cần pool Hosted (Microsoft-hosted Windows) để build/release Windows/IIS container.\n\nKhông dùng Default vì Default là self-hosted. Không dùng Hosted Linux cho iOS hay IIS Windows.\n\nKeywords phản xạ nhanh (AZ-400)\n\"iOS\" + \"IIS in Docker\" → Hosted macOS / Hosted (Windows).\n",
    "boxes": {
      "1": {
        "label": "An application that runs on iOS:",
        "answer": "Hosted macOS"
      },
      "2": {
        "label": "An Internet Information Services (IIS) web application that runs in Docker:",
        "answer": "Hosted"
      }
    },
    "answerText": "Hosted macOS, Hosted"
  },
  "331": {
    "stem": "Bạn đang tự động hóa build cho ứng dụng Java trên Azure DevOps.\nCần thêm code coverage và publish kết quả lên pipeline.\nNên dùng gì?",
    "options": {
      "A": "Cobertura",
      "B": "Bullseye Coverage",
      "C": "MSTest",
      "D": "Coverlet"
    },
    "explanation": "Đáp án: A — Cobertura\n\nĐề cần code coverage Java và publish trên pipeline.\n\nAzure Pipelines Publish Code Coverage hỗ trợ Cobertura và JaCoCo cho Java; Cobertura là format/tool phổ biến.\n\nB sai vì Bullseye là C/C++. C sai vì MSTest là .NET. D sai vì Coverlet là coverage .NET.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Java code coverage\" + \"publish outcomes\" → Cobertura.\n",
    "answerText": "A"
  },
  "332": {
    "stem": "Bạn có build pipeline sẵn trên Azure Pipelines.\nCần incremental builds, không purge environment giữa các lần chạy pipeline.\nNên dùng gì?",
    "options": {
      "A": "a self-hosted agent",
      "B": "Microsoft-hosted parallel jobs",
      "C": "a File Transform task"
    },
    "explanation": "Đáp án: A — a self-hosted agent\n\nĐề cần incremental builds, không purge environment giữa các lần chạy pipeline.\n\nMicrosoft-hosted agent ephemeral: mỗi job VM mới, workspace bị xóa. Self-hosted giữ disk/workspace nên cache và incremental compile được.\n\nB sai vì Microsoft-hosted parallel jobs không giữ state giữa run. C sai vì File Transform sửa config lúc deploy, không liên quan incremental build.\n\nKeywords phản xạ nhanh (AZ-400)\n\"incremental builds\" + \"without purging the environment\" → self-hosted agent.\n",
    "answerText": "A"
  },
  "333": {
    "stem": "Bạn đang thiết kế YAML Azure pipelines cho các app trong bảng. Cần strategy giảm downtime tối đa.\nGiá trị strategy nào cho từng app? Chọn trong answer area. Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: App1 = rolling; App2 = canary\n\nĐề chọn YAML strategy để giảm downtime cho từng app trong bảng.\n\nApp1 (thường VM, thay dần instance phiên bản cũ bằng phiên bản mới trên rolling set) dùng rolling. App2 (thường AKS, rollout ít replica để validate rồi mở rộng) dùng canary.\n\nKhông chọn runOnce vì runOnce chạy một vòng lifecycle, không rolling/canary và không tối ưu downtime theo kịch bản đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"YAML strategy\" + \"minimize downtime\" → rolling (VMs) / canary (AKS).\n",
    "boxes": {
      "1": {
        "answer": "rolling"
      },
      "2": {
        "answer": "canary"
      }
    },
    "answerText": "rolling, canary"
  },
  "334": {
    "stem": "Bạn có private project trên Azure DevOps. Cần project manager tạo custom work item queries để báo cáo tiến độ. Áp dụng least privilege.\nThêm project manager vào security group nào?",
    "options": {
      "A": "Reader",
      "B": "Project Collection Administrators",
      "C": "Project Administrators",
      "D": "Contributor"
    },
    "explanation": "Đáp án: D — Contributor\n\nĐề cần project manager tạo custom work item queries, least privilege, project private.\n\nContributor đủ quyền tạo/sửa work items và queries (private/shared tùy quyền team) mà không mở admin.\n\nA sai vì Reader chỉ xem. B và C sai vì Project Collection Administrators và Project Administrators thừa quyền (settings, security).\n\nKeywords phản xạ nhanh (AZ-400)\n\"create custom work item queries\" + \"least privilege\" → Contributor.\n",
    "answerText": "D"
  },
  "335": {
    "stem": "Công ty có project Azure DevOps cho app mới, deploy lên nhiều Windows Server 2019 VM.\nCần recommend chiến lược deploy: VM giữ cấu hình đồng nhất; giảm công sức cấu hình VM.\nNên gồm gì?",
    "options": {
      "A": "Azure Resource Manager templates and the PowerShell Desired State Configuration (DSC) extension for Windows",
      "B": "Deployment YAML and Azure pipeline deployment groups",
      "C": "Azure Resource Manager templates and the Custom Script Extension for Windows",
      "D": "Deployment YAML and Azure pipeline stage templates"
    },
    "explanation": "Đáp án: A — ARM templates + PowerShell DSC extension for Windows\n\nĐề deploy nhiều Windows Server 2019 VM: cấu hình nhất quán, ít administrative effort.\n\nARM templates tạo VM/infrastructure đồng nhất. PowerShell DSC extension enforce desired state (feature, service) và sửa drift theo thời gian, ít admin hơn script một lần.\n\nC sai vì Custom Script Extension chạy script, không duy trì state. B và D sai vì deployment groups / YAML stage templates phục vụ deploy app, không phải configuration management OS.\n\nKeywords phản xạ nhanh (AZ-400)\n\"consistent VM configuration\" + \"minimize admin\" → ARM templates + PowerShell DSC extension.\n",
    "answerText": "A"
  },
  "336": {
    "stem": "Project Azure DevOps có nhiều package feeds. Cần đơn giản hóa bằng một feed chứa package công ty tự produce và package lấy từ remote feeds. Phải hỗ trợ public feeds và authenticated feeds.\nNên bật gì trong DevOps?",
    "options": {
      "A": "Universal Packages",
      "B": "upstream sources",
      "C": "views in Azure Artifacts",
      "D": "a symbol server"
    },
    "explanation": "Đáp án: B — upstream sources\n\nĐề gộp một feed chứa package nội bộ và package từ remote feeds, gồm public và authenticated.\n\nUpstream sources trên Azure Artifacts cho phép một feed kéo NuGet.org/npmjs và feed authenticated khác, cache khi restore lần đầu.\n\nC sai vì views dùng promote @local/@prerelease/@release, không gộp remote feeds. A sai vì Universal Packages là loại package. D sai vì symbol server dành debug symbols.\n\nKeywords phản xạ nhanh (AZ-400)\n\"single feed\" + \"public and authenticated remote feeds\" → upstream sources.\n",
    "answerText": "B"
  },
  "337": {
    "stem": "Công ty có hai Linux VM trên third-party public cloud. Định dùng Azure Automation State Configuration để quản lý hai VM và phát hiện configuration drift.\nCần onboard Linux VM. Đã cài PowerShell DSC và chạy register.py.\nBa bước tiếp theo theo thứ tự? Kéo action vào answer area.",
    "explanation": "Đáp án: Create a DSC metaconfiguration → Copy the metaconfiguration to the VMs → Run setdsclocalconfigurationmanager.py\n\nĐề onboard hai Linux VM trên public cloud thứ ba vào Azure Automation State Configuration sau khi đã cài DSC và chạy register.py.\n\nTạo DSC metaconfiguration (LCM trỏ Registration URL/Key và mode). Copy metaconfiguration lên VM. Chạy setdsclocalconfigurationmanager.py để apply LCM.\n\nKhông chọn cài WMF 5.1 vì đó là Windows. Không thay bước LCM Linux bằng chỉ Add node trên portal sau register.py.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Linux\" + \"register.py\" + \"Azure Automation DSC\" → metaconfig → copy to VMs → setdsclocalconfigurationmanager.py.\n",
    "boxes": {
      "1": {
        "answer": "Create a DSC metaconfiguration"
      },
      "2": {
        "answer": "Copy the metaconfiguration to the virtual machines"
      },
      "3": {
        "answer": "From the virtual machines, run setdsclocalconfigurationmanager.py"
      }
    },
    "answerText": "Create a DSC metaconfiguration, Copy the metaconfiguration to the virtual machines, From the virtual machines, run setdsclocalconfigurationmanager.py"
  },
  "338": {
    "stem": "Bạn định deploy runbook tạo Azure AD user accounts.\nCần runbook chạy được Azure PowerShell cmdlets cho Azure Active Directory.\nHoàn thành task: đăng nhập Microsoft Azure portal.",
    "explanation": "Đáp án: Credential/identity có quyền Azure AD + module PowerShell Azure AD trong Automation Account\n\nĐề cần runbook tạo Azure AD user, nên runbook phải gọi được cmdlet Azure AD.\n\nXác định Azure AD tenant gắn subscription. Tạo user (hoặc app) được phép quản lý directory. Trong Automation Account import module AzureAD / Microsoft Graph. Tạo Credential asset (username/password) hoặc Managed Identity rồi dùng trong runbook.\n\nKhông chỉ bật runbook mà không có credential và module: cmdlet Azure AD sẽ fail. Không dùng Run As cổ điển nếu lab yêu cầu credential asset tường minh.\n\nKeywords phản xạ nhanh (AZ-400)\n\"runbook\" + \"Azure AD PowerShell cmdlets\" → Automation credential + Azure AD modules.\n",
    "answerText": "Cấu hình Automation credential/module để runbook gọi Azure AD PowerShell."
  },
  "339": {
    "stem": "Bạn đang tạo container cho ASP.NET Core app.\nCần Dockerfile sao cho image nhỏ nhất có thể.\nKéo value vào đúng chỗ.",
    "explanation": "Đáp án: FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env; RUN dotnet publish -c Release -o out; FROM mcr.microsoft.com/dotnet/aspnet:5.0\n\nĐề Dockerfile ASP.NET Core, image cuối phải nhỏ (multi-stage).\n\nStage build dùng SDK để restore/publish. RUN dotnet publish -c Release -o out tạo artifact. Stage cuối dùng aspnet runtime, không mang SDK.\n\nKhông dùng sdk cho FROM cuối vì image phình. Không chỉ RUN dotnet restore vì restore không ra output publish.\n\nKeywords phản xạ nhanh (AZ-400)\n\"minimize image size\" + \"ASP.NET Core Dockerfile\" → sdk build-env + publish + aspnet runtime.\n",
    "boxes": {
      "1": {
        "answer": "mcr.microsoft.com/dotnet/sdk:5.0"
      },
      "2": {
        "answer": "dotnet publish -c Release -o out"
      },
      "3": {
        "answer": "mcr.microsoft.com/dotnet/aspnet:5.0"
      }
    },
    "answerText": "mcr.microsoft.com/dotnet/sdk:5.0, dotnet publish -c Release -o out, mcr.microsoft.com/dotnet/aspnet:5.0"
  },
  "340": {
    "stem": "Bạn đang cấu hình Git repository mới trên Azure Repos.\nPull request phải thỏa trước khi merge:\n• Code đã commit phải compile thành công.\n• PR phải có Quality Gate status Passed trên SonarCloud.\nPolicy type nào cho từng yêu cầu? Kéo policy phù hợp.",
    "explanation": "Đáp án: A build policy; A status policy\n\nĐề branch policy: code phải compile thành công, và PR phải Quality Gate Passed trên SonarCloud.\n\nCompile thành công dùng build policy (build validation trên pull request). SonarCloud Quality Gate dùng status policy vì SonarCloud gửi status lên PR và policy yêu cầu status Passed.\n\nKhông dùng check-in policy vì đó là TFVC, không phải Git pull request.\n\nKeywords phản xạ nhanh (AZ-400)\n\"PR must compile\" + \"SonarCloud Quality Gate Passed\" → build policy / status policy.\n",
    "boxes": {
      "1": {
        "answer": "A build policy"
      },
      "2": {
        "answer": "A status policy"
      }
    },
    "answerText": "A build policy, A status policy"
  },
  "341": {
    "stem": "Cần change management:\n• Default branch được bảo vệ; change phải được build trên feature branch trước.\n• Ít nhất một release manager review/approve trước mỗi merge.\n• Đưa change vào default branch bằng pull requests.\nNên cấu hình gì trên Azure Repos?",
    "options": {
      "A": "branch policies of the default branch",
      "B": "Services in Project Settings",
      "C": "Deployment pools in Project Settings",
      "D": "branch security of the default branch"
    },
    "explanation": "Đáp án: A — branch policies of the default branch\n\nĐề change management: bảo vệ default branch, build trên feature trước, ít nhất một release manager approve, đưa thay đổi vào default bằng pull request.\n\nBranch policies trên default branch bật require pull request, minimum reviewers, và build validation — đủ cả ba yêu cầu.\n\nD sai vì branch security chỉ deny push/force, không bắt PR/review/build. B và C sai vì Services và Deployment pools không phải change management trên Git.\n\nKeywords phản xạ nhanh (AZ-400)\n\"protect default branch\" + \"PR + reviewers + build first\" → branch policies.\n",
    "answerText": "A"
  },
  "342": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh, mỗi câu một giải pháp. Không quay lại được.\nCông ty dùng Azure DevOps quản lý build/release. Source trên Git.\nCần pull request strategy giảm volume lịch sử trên master.\nGiải pháp: fast-forward merges.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề series: giảm history volume trên master bằng pull request strategy. Solution: fast-forward merges.\n\nFast-forward chỉ dời master tới tip feature branch; mọi commit lẻ trên feature vẫn nằm trên master nên không giảm volume.\n\nCần squash merge. Không chọn Yes vì history “linear” vẫn dài.\n\nKeywords phản xạ nhanh (AZ-400)\n\"reduce history volume\" + \"fast-forward merges\" → No.\n",
    "answerText": "B"
  },
  "343": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh, mỗi câu một giải pháp. Không quay lại được.\nCần pull request strategy giảm volume lịch sử trên master.\nGiải pháp: squash merges.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: A — Yes\n\nCùng mục tiêu giảm history trên master. Solution: squash merges.\n\nSquash gộp cả feature branch thành một commit trên master, history ngắn, đúng mục tiêu.\n\nFast-forward, explicit merge và three-way merge không đạt vì chúng giữ commit feature.\n\nKeywords phản xạ nhanh (AZ-400)\n\"reduce history volume\" + \"squash merges\" → Yes.\n",
    "answerText": "A"
  },
  "344": {
    "stem": "Cần pull request strategy giảm volume lịch sử trên master.\nGiải pháp: explicit merge.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng mục tiêu. Solution: explicit merge.\n\nExplicit merge (merge commit / no-fast-forward) giữ nguyên commit feature và thêm merge commit nên history dài hơn, không giảm volume.\n\nCần squash. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"reduce history volume\" + \"explicit merge\" → No.\n",
    "answerText": "B"
  },
  "345": {
    "stem": "Cần pull request strategy giảm volume lịch sử trên master.\nGiải pháp: three-way merge.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng mục tiêu. Solution: three-way merge.\n\nThree-way merge tạo merge commit và giữ lịch sử hai nhánh. Không squashing nên không giảm history trên master.\n\nCần squash merge. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"reduce history volume\" + \"three-way merge\" → No.\n",
    "answerText": "B"
  },
  "346": {
    "stem": "Cần recommend Docker container build strategy: image nhỏ nhất; giảm security surface của image cuối.\nNên gồm gì?",
    "options": {
      "A": "multi-stage builds",
      "B": "PowerShell Desired State Configuration (DSC)",
      "C": "Docker Swarm",
      "D": "single-stage builds"
    },
    "explanation": "Đáp án: A — multi-stage builds\n\nĐề Docker: image nhỏ và giảm security surface của image cuối.\n\nMulti-stage: compile bằng SDK rồi COPY artifact sang runtime/distroless — image nhỏ, ít tool/CVE.\n\nD sai vì single-stage giữ compiler trong image cuối. B và C sai vì PowerShell DSC và Docker Swarm không phải chiến lược thu nhỏ image.\n\nKeywords phản xạ nhanh (AZ-400)\n\"minimize image sizes\" + \"security surface\" → multi-stage builds.\n",
    "answerText": "A"
  },
  "347": {
    "stem": "Bạn định tạo image chứa .NET Core application. Dockerfile như trong hình (có số dòng).\nCần image nhỏ nhất khi build.\nNên sửa dòng nào?",
    "options": {
      "A": "1",
      "B": "3",
      "C": "4",
      "D": "7"
    },
    "explanation": "Đáp án: C — dòng 4\n\nĐề Dockerfile .NET Core, image phải nhỏ nhất; hỏi dòng nào cần sửa.\n\nDòng 4 đang FROM microsoft/dotnet:3.1-sdk cho final stage. Đổi sang runtime/aspnet (ví dụ 3.1-aspnetcore-runtime) để bỏ SDK khỏi image cuối.\n\nA (dòng 1) cần giữ SDK để publish. B và D (dòng 3/7) là publish và ENTRYPOINT, không phải nguyên nhân image to.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Dockerfile smallest image\" + \"line 4 FROM sdk\" → change final FROM to runtime.\n",
    "answerText": "C"
  },
  "348": {
    "stem": "Công ty có project Azure DevOps cho web app mới.\nCần khi check-in code thì build chạy tự động.\nGiải pháp: Trên Triggers của build pipeline, chọn Batch changes while a build is in progress.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề series: khi check-in thì build chạy tự động. Solution: Triggers tab, chọn Batch changes while a build is in progress.\n\nBatch changes chỉ gộp commit khi đã có build đang chạy. Không bật CI trigger nên check-in không chắc tạo build.\n\nCần Enable continuous integration trên Triggers của build pipeline. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"build on check-in\" + \"Batch changes\" → No (need Enable continuous integration).\n",
    "answerText": "B"
  },
  "349": {
    "stem": "Cần deploy AKS host application, thỏa:\n• Container chỉ publish internally.\n• AKS cluster phải tạo và quản lý containers trên Azure.\nDùng gì cho từng yêu cầu?",
    "explanation": "Đáp án: Azure Container Registry; An Azure service principal\n\nĐề AKS: container chỉ publish nội bộ, và cluster phải tạo/quản lý container trên Azure.\n\nPublish internal dùng Azure Container Registry (private registry, không đẩy Docker Hub public). AKS thao tác Azure/ACR dùng Azure service principal (hoặc identity tương đương) để pull và gọi Azure API.\n\nKhông dùng Docker Hub public cho “internally only”. Không bỏ service principal nếu cluster cần quyền tạo/quản lý container trên Azure.\n\nKeywords phản xạ nhanh (AZ-400)\n\"containers published internally\" + \"AKS manage containers in Azure\" → ACR / Azure service principal.\n",
    "boxes": {
      "1": {
        "label": "Containers must only be published internally:",
        "answer": "Azure Container Registry"
      },
      "2": {
        "label": "AKS clusters must be able to create and manage containers in Azure:",
        "answer": "An Azure service principal"
      }
    },
    "answerText": "Azure Container Registry, An Azure service principal"
  },
  "350": {
    "stem": "Bạn có 50 project Node.js scan bằng WhiteSource. Mỗi project có Package.json, Package-lock.json, Npm-shrinkwrap.json.\nCần WhiteSource chỉ report thư viện bạn reference rõ ràng, giảm số library trong report.\nBạn nên làm gì?",
    "options": {
      "A": "Configure the File System Agent plug-in.",
      "B": "Add a devDependencies section to Package-lock.json",
      "C": "Configure the Artifactory plug-in.",
      "D": "Delete Package-lock.json."
    },
    "explanation": "Đáp án: B — Add a devDependencies section to Package-lock.json\n\nĐề 50 project Node.js quét WhiteSource; cần report chỉ còn thư viện được reference rõ (explicit), tối thiểu số thư viện.\n\nTheo answer key, thêm/tách devDependencies trên Package-lock.json giúp WhiteSource không gom hết transitive/dev vào report production, thu hẹp về dependency được khai báo rõ.\n\nA và C sai vì File System Agent plug-in và Artifactory plug-in đổi cách scan, không thu hẹp “explicit reference”. D sai vì xóa Package-lock.json làm resolve kém ổn định và không phải cách đề chọn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"WhiteSource\" + \"only libraries you explicitly reference\" → add devDependencies (Package-lock.json).\n",
    "answerText": "B"
  },
  "351": {
    "stem": "Công ty deploy app trong Docker containers. Cần phát hiện known exploits trên image dùng để provision container.\nTích hợp image scanning vào application lifecycle, phát hiện càng sớm càng tốt.\nNên cấu hình gì?",
    "options": {
      "A": "a task executed in the continuous integration pipeline and a scheduled task that analyzes the image registry",
      "B": "manual tasks performed during the planning phase and the deployment phase",
      "C": "a task executed in the continuous deployment pipeline and a scheduled task against a running production container",
      "D": "a task executed in the continuous integration pipeline and a scheduled task that analyzes the production container"
    },
    "explanation": "Đáp án: A\n\nĐề phát hiện known exploits trên Docker images càng sớm càng tốt trong lifecycle.\n\nScan trong continuous integration (trước khi promote image) cộng scan định kỳ trên image registry bắt CVE mới trên image đã lưu — shift-left và phủ image đã publish.\n\nB sai vì manual ở planning/deployment không tự động và không sớm. C sai vì chỉ CD cộng production container thì muộn. D sai vì scheduled scan production container không thay scan registry và vẫn muộn hơn CI + registry.\n\nKeywords phản xạ nhanh (AZ-400)\n\"image scanning\" + \"as early as possible\" → CI task + scheduled registry scan.\n",
    "answerText": "A"
  },
  "352": {
    "stem": "Công ty hybrid cloud Azure và Azure Stack, CI/CD đầy đủ trên Azure DevOps. Một số app build bằng Erlang và Hack.\nCần Erlang và Hack được hỗ trợ trong build strategy trên toàn hybrid cloud, giảm management overhead.\nDùng gì để chạy build pipeline?",
    "options": {
      "A": "a Microsoft-hosted agent",
      "B": "Azure DevOps self-hosted agents on Azure DevTest Labs virtual machines.",
      "C": "Azure DevOps self-hosted agents on Hyper-V virtual machines",
      "D": "Azure DevOps self-hosted agents on virtual machines that run on Azure Stack"
    },
    "explanation": "Đáp án: D — self-hosted agents on VMs that run on Azure Stack\n\nĐề hybrid Azure + Azure Stack, CI/CD Azure DevOps, build Erlang và Hack, minimize management overhead.\n\nMicrosoft-hosted không có Erlang/Hack sẵn và không customize. Self-hosted trên VM Azure Stack chạy workload hybrid, cài toolchain một lần, gần Stack và vẫn phục vụ Azure.\n\nB và C sai vì DevTest Labs và Hyper-V on-prem thêm overhead hoặc không cover Azure Stack. A sai vì hosted không đáp ứng language lạ.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Erlang and Hack\" + \"Azure Stack hybrid\" → self-hosted agents on Azure Stack VMs.\n",
    "answerText": "D"
  },
  "353": {
    "stem": "Project Azure DevOps, source on-premises, build server on-premises. Định dùng self-hosted agent để Azure DevOps điều khiển build trên server đó.\nĐã download và cài agent trên build server.\nHai thao tác tiếp theo? (Mỗi đáp án đúng là một phần giải pháp.)",
    "options": {
      "A": "From Azure, create a shared access signature (SAS).",
      "B": "From the build server, create a certificate, and then upload the certificate to Azure Storage.",
      "C": "From the build server, create a certificate, and then upload the certificate to Azure Key Vault.",
      "D": "From DevOps, create a personal access token (PAT).",
      "E": "From the build server, run config.cmd."
    },
    "explanation": "Đáp án: D, E\n\nĐề đã cài self-hosted agent trên on-premises build server; hỏi hai bước tiếp theo.\n\nD đúng: tạo PAT trên Azure DevOps để agent authenticate với organization. E đúng: chạy config.cmd trên build server để đăng ký agent vào pool (Organization URL + PAT).\n\nA, B, C sai vì SAS và certificate đưa lên Storage/Key Vault không dùng cho agent registration.\n\nKeywords phản xạ nhanh (AZ-400)\n\"self-hosted agent\" + \"after install\" → create PAT + run config.cmd.\n",
    "answerText": "D,E"
  },
  "354": {
    "stem": "Bạn có Azure subscription chứa Azure Active Directory (Azure AD) tenant.\nBạn đang cấu hình build pipeline trên Azure Pipelines, trong đó có task tên Task1.\nTask1 sẽ authenticate bằng Azure AD service principal.\nBa giá trị nào cần cấu hình cho Task1? (Mỗi lựa chọn đúng là một phần giải pháp. Mỗi lựa chọn đúng được một điểm.)",
    "options": {
      "A": "the tenant ID",
      "B": "the subscription ID",
      "C": "the client secret",
      "D": "the app ID",
      "E": "the object ID"
    },
    "explanation": "Đáp án: A, C, D — tenant ID, client secret, app ID\n\nĐề Task1 authenticate bằng Azure AD service principal; hỏi ba giá trị cần cấu hình.\n\nOAuth client credentials cần tenant ID (directory cấp token), app ID / Application (client) ID, và client secret.\n\nB sai vì subscription ID chỉ scope tài nguyên Azure, không phải credential của service principal. E sai vì object ID là GUID object trên directory, task thường không dùng làm client credential.\n\nKeywords phản xạ nhanh (AZ-400)\n\"service principal authenticate\" → tenant ID + app ID + client secret.\n",
    "answerText": "A,C,D"
  },
  "355": {
    "stem": "Bạn đang deploy app mới trên Azure VM. Định dùng DSC extension trên các VM.\nCần VM luôn có cùng Windows feature.\nBa thao tác theo thứ tự? Kéo action vào answer area.",
    "explanation": "Đáp án: Create a PowerShell configuration file → Load the file to Azure Blob storage → Configure the DSC extension on the VMs\n\nĐề DSC extension trên Azure VM, luôn cài cùng một Windows feature.\n\nViết file configuration PowerShell mô tả WindowsFeature. Upload lên Azure Blob để extension tải được. Gắn DSC extension trên VM, trỏ blob URI.\n\nKhông dùng YAML làm DSC config. Không dùng Custom Script Extension hay Azure Files thay chuỗi DSC extension chuẩn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"DSC extension\" + \"same Windows feature\" → .ps1 → Blob → configure DSC extension.\n",
    "boxes": {
      "1": {
        "answer": "Create a PowerShell configuration file."
      },
      "2": {
        "answer": "Load the file to Azure Blob storage."
      },
      "3": {
        "answer": "Configure the DSC extension on the virtual machines."
      }
    },
    "answerText": "Create a PowerShell configuration file., Load the file to Azure Blob storage., Configure the DSC extension on the virtual machines."
  },
  "356": {
    "stem": "Cần inline testing cho Azure DevOps pipeline dùng mô hình Docker deployment. Kết quả test không được publish lên pipeline.\nNên dùng gì cho inline testing?",
    "options": {
      "A": "a single stage Dockerfile",
      "B": "an Azure Kubernetes Service (AKS) pod",
      "C": "a multi-stage Dockerfile",
      "D": "a Docker Compose file"
    },
    "explanation": "Đáp án: C — a multi-stage Dockerfile\n\nĐề inline testing pipeline Docker, không publish kết quả test lên pipeline.\n\nStage test chạy trong image tạm; final stage không COPY test result hay test tooling. Nếu không thêm Publish Test Results thì pipeline không công bố kết quả từ stage đó.\n\nA sai vì single-stage trộn test vào image cuối. B và D sai vì AKS pod và Docker Compose nặng, không phải inline test lúc build image.\n\nKeywords phản xạ nhanh (AZ-400)\n\"inline testing\" + \"Docker\" + \"do not publish results\" → multi-stage Dockerfile.\n",
    "answerText": "C"
  },
  "357": {
    "stem": "Bạn đang thiết kế Azure DevOps strategy. Nghi ngờ productivity thấp vì technical debt tích tụ.\nNên recommend metric nào để đánh giá lượng technical debt?",
    "options": {
      "A": "the number of code modules in an application",
      "B": "the number of unit test failures",
      "C": "the percentage of unit test failures",
      "D": "the percentage of overall time spent on rework"
    },
    "explanation": "Đáp án: D — the percentage of overall time spent on rework\n\nĐề metric đánh giá technical debt của team.\n\nTechnical debt thể hiện bằng công sức sửa/chắp vá so với deliver mới; phần trăm thời gian rework phản ánh trực tiếp.\n\nA sai vì số module không nói chất lượng. B và C sai vì unit test failure là defect hiện tại, không đo nợ kỹ thuật tích lũy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"assess technical debt\" → percentage of time spent on rework.\n",
    "answerText": "D"
  },
  "358": {
    "stem": "Bạn đang develop open source solution trên GitHub repository. Tạo public project mới trên Azure DevOps.\nĐịnh dùng Azure Pipelines cho continuous build, dùng GitHub Checks API.\nNên dùng authentication type nào?",
    "options": {
      "A": "OpenID",
      "B": "GitHub App",
      "C": "a personal access token (PAT)",
      "D": "SAML"
    },
    "explanation": "Đáp án: B — GitHub App\n\nĐề public Azure DevOps project, Azure Pipelines CI cho GitHub, dùng GitHub Checks API.\n\nGitHub Checks API thiết kế cho GitHub Apps (Azure Pipelines GitHub App): quyền granular, phù hợp public OSS.\n\nC sai vì PAT gắn user, rộng quyền, không phải cách khuyến nghị cho Checks. A và D sai vì OpenID và SAML không phải auth pipeline → Checks.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub Checks API\" + \"Azure Pipelines\" → GitHub App.\n",
    "answerText": "B"
  },
  "359": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nProject Azure DevOps cho web app mới. Cần khi check-in thì build chạy tự động.\nGiải pháp: Trong Continuous deployment trigger của release pipeline, bật Pull request trigger.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề series: check-in thì build chạy tự động. Solution: bật Pull request trigger trên Continuous deployment trigger của release pipeline.\n\nPR trigger trên release/CD không phải CI khi mọi commit được check-in. Nó phục vụ validate PR trước merge, không thay CI trên build pipeline.\n\nCần Enable continuous integration trên build pipeline. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"build on check-in\" + \"release PR trigger\" → No.\n",
    "answerText": "B"
  },
  "360": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nCần khi check-in thì build chạy tự động.\nGiải pháp: Pre-deployment conditions của release pipeline, chọn After stage.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng mục tiêu CI khi check-in. Solution: Pre-deployment conditions = After stage.\n\nAfter stage chỉ thứ tự deploy giữa các stage release, không trigger build khi commit.\n\nCần CI trigger trên build pipeline. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"build on check-in\" + \"After stage\" → No.\n",
    "answerText": "B"
  },
  "361": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nCần khi check-in thì build chạy tự động.\nGiải pháp: Pre-deployment conditions của release pipeline, chọn Batch changes while a build is in progress.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng mục tiêu. Solution: Pre-deployment conditions, Batch changes while a build is in progress.\n\nBatch trên release không khởi tạo build khi check-in.\n\nCần Enable continuous integration trên build pipeline. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"build on check-in\" + \"release Batch changes\" → No.\n",
    "answerText": "B"
  },
  "362": {
    "stem": "Bạn có Azure DevOps release pipeline như exhibit. Cần hoàn thiện pipeline để cấu hình OWASP ZAP cho security testing.\nNăm Azure CLI tasks nào theo thứ tự? Kéo task vào answer area.",
    "explanation": "Đáp án: Call the Baseline Scan → Download the file → Convert Report Format → Publish Test Results → Destroy OWASP Container\n\nĐề hoàn thiện release pipeline để chạy OWASP ZAP security testing bằng năm Azure CLI task theo thứ tự.\n\nGọi Baseline Scan để chạy ZAP. Download report từ container/storage. Convert về format pipeline hiểu (JUnit/NUnit). Publish Test Results để hiện trên Tests tab. Destroy OWASP Container để dọn ACI/container.\n\nKhông chèn Build machine image hay Docker CLI installer vào chuỗi ZAP này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"OWASP ZAP\" + \"five Azure CLI tasks\" → Baseline Scan → Download → Convert → Publish → Destroy.\n",
    "boxes": {
      "1": {
        "answer": "Call the Baseline Scan"
      },
      "2": {
        "answer": "Download the file"
      },
      "3": {
        "answer": "Convert Report Format"
      },
      "4": {
        "answer": "Publish Test Results"
      },
      "5": {
        "answer": "Destroy OWASP Container"
      }
    },
    "answerText": "Call the Baseline Scan, Download the file, Convert Report Format, Publish Test Results, Destroy OWASP Container"
  },
  "363": {
    "stem": "Công ty dùng Git source-code repository. Định implement GitFlow.\nNhánh nào chứa production code và preproduction code?\nChọn branch type cho từng loại.",
    "explanation": "Đáp án: Production = Master; Preproduction = Develop\n\nĐề GitFlow: nhánh nào chứa production code và preproduction code.\n\nProduction nằm trên Master (main/master: release đã ship). Preproduction nằm trên Develop (tích hợp feature trước khi release).\n\nKhông chọn Feature, Release hay Hotfix làm đáp án chính vì đó là supporting branches, không phải nơi “production code” hay nhánh preprod chính của GitFlow.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitFlow\" + \"production / preproduction\" → Master / Develop.\n",
    "boxes": {
      "1": {
        "label": "Production code:",
        "answer": "Master"
      },
      "2": {
        "label": "Preproduction code:",
        "answer": "Develop"
      }
    },
    "answerText": "Master, Develop"
  },
  "364": {
    "stem": "Build pipeline dùng các job khác nhau compile app cho 10 architecture. Pipeline mất khoảng một ngày.\nCần giảm thời gian chạy. Hai thao tác nào? (Mỗi lựa chọn đúng là một phần giải pháp. Mỗi lựa chọn đúng được một điểm.)",
    "options": {
      "A": "Move to a blue/green deployment pattern",
      "B": "Create a deployment group",
      "C": "Increase the number of parallel jobs",
      "D": "Reduce the size of the repository",
      "E": "Create an agent pool"
    },
    "explanation": "Đáp án: C, E\n\nĐề build 10 architecture bằng các job khác nhau, mất khoảng một ngày; cần rút thời gian execute.\n\nC đúng: tăng parallel jobs để các architecture chạy đồng thời. E đúng: tạo agent pool (thường self-hosted đủ máy) để parallel thật sự có agent.\n\nA và B sai vì blue/green và deployment group là deploy, không rút compile. D sai vì thu nhỏ repo giúp checkout, không phải bottleneck chính khi 10 job tuần tự.\n\nKeywords phản xạ nhanh (AZ-400)\n\"10 architectures\" + \"reduce build time\" → increase parallel jobs + create an agent pool.\n",
    "answerText": "C,E"
  },
  "365": {
    "stem": "Bạn đang tạo build pipeline trên Azure Pipelines. Một số test có thể fail vì third-party applications.\nCần pipeline vẫn succeed nếu third-party apps không available.\nBạn nên làm gì?",
    "options": {
      "A": "Configure the build pipeline to use parallel jobs",
      "B": "Configure flaky tests",
      "C": "Increase the test pass percentage",
      "D": "Add the Requirements quality widget to your dashboard"
    },
    "explanation": "Đáp án: B — Configure flaky tests\n\nĐề một số test có thể fail vì third-party app không sẵn; pipeline vẫn phải complete successfully.\n\nFlaky test detection trên Azure Test: test phụ thuộc ngoài đôi khi fail; đánh dấu flaky để retry / không fail cứng cả build.\n\nA sai vì parallel jobs không xử lý fail. C sai vì tăng test pass percentage vẫn fail khi test đỏ. D sai vì Requirements quality widget chỉ báo cáo trên dashboard.\n\nKeywords phản xạ nhanh (AZ-400)\n\"tests fail if third-party unavailable\" + \"pipeline succeeds\" → configure flaky tests.\n",
    "answerText": "B"
  },
  "366": {
    "stem": "Subscription có RG1: bốn Windows Server VM cài IIS, SQL Server trên VM, Azure Load Balancer.\nCần deploy app lên VM trong RG1 bằng Azure Pipelines.\nBốn thao tác theo thứ tự? Kéo action vào answer area.",
    "explanation": "Đáp án: Create a deployment group → Add the Azure Pipelines Agent extension to the VMs → Add and configure a deployment group job → Execute the pipeline\n\nĐề deploy app bằng Azure Pipelines lên VM IIS trong RG1 (kèm SQL VM và Load Balancer).\n\nTạo deployment group cho nhóm máy IIS. Cài Azure Pipelines Agent extension trên VM để nhận job. Thêm deployment group job vào pipeline rồi chạy pipeline.\n\nKhông dùng agent pool thường thay deployment group cho kịch bản IIS/VM classic. Không chèn Puppet vì đề không yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"deploy to IIS VMs\" + \"Azure Pipelines\" → deployment group + agent extension + DG job.\n",
    "boxes": {
      "1": {
        "answer": "Create a deployment group"
      },
      "2": {
        "answer": "Add the Azure Pipelines Agent extension to the virtual machines"
      },
      "3": {
        "answer": "Add and configure a deployment group job for the pipeline"
      },
      "4": {
        "answer": "Execute the pipeline"
      }
    },
    "answerText": "Create a deployment group, Add the Azure Pipelines Agent extension to the virtual machines, Add and configure a deployment group job for the pipeline, Execute the pipeline"
  },
  "367": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nProject Azure DevOps cho web app mới. Cần khi check-in thì build chạy tự động.\nGiải pháp: Triggers tab của build pipeline, chọn Enable continuous integration.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: A — Yes\n\nĐề series: check-in thì build tự chạy. Solution: Triggers tab của build pipeline, Enable continuous integration.\n\nCI trigger theo dõi branch; mỗi push/check-in khởi động build. Đây đúng mục tiêu.\n\nBatch changes, After stage, và PR trigger trên release không thay CI trên build.\n\nKeywords phản xạ nhanh (AZ-400)\n\"build on check-in\" + \"Enable continuous integration\" → Yes.\n",
    "answerText": "A"
  },
  "368": {
    "stem": "Organization Contoso, project Project1. Định dùng Microsoft-hosted agents để build container images host full Microsoft .NET Framework apps trong YAML pipeline.\nHai VM image nào dùng được cho Microsoft-hosted agent pool? (Mỗi đáp án đúng là một cách làm đủ. Mỗi lựa chọn đúng được một điểm.)",
    "options": {
      "A": "vs2017-win2016",
      "B": "ubuntu-16.04",
      "C": "win1803",
      "D": "macOS-10.13",
      "E": "vs.2015-win2012r2"
    },
    "explanation": "Đáp án: A, C — vs2017-win2016 và win1803\n\nĐề Microsoft-hosted agent build Windows container chứa full .NET Framework trong YAML.\n\nvs2017-win2016 là Windows Server 2016, có Visual Studio/.NET Framework SDK và Windows Containers. win1803 là Windows Server 1803, chạy Windows Containers cho .NET Framework.\n\nB sai vì ubuntu-16.04 là Linux, không build full .NET Framework hay Windows Containers. D sai vì macOS-10.13 không hỗ trợ Windows Containers/.NET Framework. E sai vì vs.2015-win2012r2 không phải image hosted phù hợp cho container .NET Framework hiện tại.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Microsoft-hosted\" + \"full .NET Framework containers\" → vs2017-win2016 + win1803.\n",
    "answerText": "A,B"
  },
  "369": {
    "stem": "Bạn đang dùng JIRA, Jenkins và Octopus trong DevOps.\nĐịnh thay bằng Azure DevOps.\nService nào thay từng tool? Chọn trong answer area.",
    "explanation": "Đáp án: JIRA = Boards; Jenkins = Build pipelines; Octopus = Release pipelines\n\nĐề thay JIRA, Jenkins, Octopus bằng dịch vụ Azure DevOps tương ứng.\n\nJIRA theo dõi work → Azure Boards. Jenkins CI/build → Build pipelines. Octopus CD/release → Release pipelines.\n\nKhông map sang Repos, Artifacts hay Test Plans vì chúng không thay ba tool này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"replace JIRA / Jenkins / Octopus\" → Boards / Build pipelines / Release pipelines.\n",
    "boxes": {
      "1": {
        "label": "JIRA:",
        "answer": "Boards"
      },
      "2": {
        "label": "Jenkins:",
        "answer": "Build pipelines"
      },
      "3": {
        "label": "Octopus:",
        "answer": "Release pipelines"
      }
    },
    "answerText": "Boards, Build pipelines, Release pipelines"
  },
  "370": {
    "stem": "Công ty có project Azure DevOps. Khi có nhiều build pending deployment, chỉ deploy build mới nhất.\nNên dùng gì?",
    "options": {
      "A": "deployment conditions",
      "B": "deployment queue settings",
      "C": "release gates",
      "D": "pull request triggers"
    },
    "explanation": "Đáp án: B — deployment queue settings\n\nĐề khi nhiều build đang pending deploy, chỉ deploy bản mới nhất.\n\nDeployment queue settings với Deploy latest and cancel others hủy bản cũ trong queue, chỉ chạy release mới nhất.\n\nA sai vì deployment conditions quyết định khi nào stage chạy, không lọc queue theo “latest only”. C sai vì release gates là approve/health check. D sai vì pull request triggers gắn PR, không quản lý hàng đợi deploy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"only the most recent build is deployed\" → deployment queue settings (deploy latest, cancel others).\n",
    "answerText": "B"
  },
  "371": {
    "stem": "Công ty phát triển client banking app xử lý lượng data lớn. Code quality đang xấu đi vì áp lực thời gian.\nCần implement static code analysis. Thực hiện ở phase nào?",
    "options": {
      "A": "integration testing",
      "B": "staging",
      "C": "production release",
      "D": "build"
    },
    "explanation": "Đáp án: D — build\n\nĐề triển khai static code analysis cho app banking; hỏi pha nào.\n\nSAST (SonarQube, Roslyn, …) chạy lúc compile/CI: shift-left, fail build khi rule vỡ, rẻ hơn sửa muộn.\n\nA, B, C sai vì integration testing, staging và production release đã muộn và tốn hơn; static analysis không cần chạy app.\n\nKeywords phản xạ nhanh (AZ-400)\n\"static code analysis\" + \"which phase\" → build.\n",
    "answerText": "D"
  },
  "372": {
    "stem": "Project Azure DevOps dùng package từ nhiều public feeds, một số feed không ổn định.\nCần gom package vào một feed.\nBa thao tác theo thứ tự?",
    "explanation": "Đáp án: Create an Azure Artifacts feed with upstream sources → Modify configuration files to reference the feed → Run an initial package restore\n\nĐề nhiều public feed không ổn định; cần gom package vào một feed.\n\nTạo Azure Artifacts feed bật upstream sources để cache public packages. Sửa nuget.config/npmrc trỏ feed đó. Restore lần đầu để ingest package vào feed (mới hiện trên UI).\n\nKhông bắt đầu bằng tạo NuGet/npm package hay Visual Studio project vì đó không phải bước gom feed.\n\nKeywords phản xạ nhanh (AZ-400)\n\"consolidate public feeds\" → Artifacts upstream → retarget config → initial restore.\n",
    "boxes": {
      "1": {
        "answer": "Create an Azure Artifacts feed that uses upstream sources."
      },
      "2": {
        "answer": "Modify the configuration files to reference the Azure Artifacts"
      },
      "3": {
        "answer": "Run an initial package restore."
      }
    },
    "answerText": "Create an Azure Artifacts feed that uses upstream sources., Modify the configuration files to reference the Azure Artifacts, Run an initial package restore."
  },
  "373": {
    "stem": "Bạn có Azure DevOps pipeline như exhibit.\nDùng drop-down hoàn thành mỗi câu theo hình.",
    "explanation": "Đáp án: 1 job; 4 tasks\n\nĐề đọc graphic pipeline Azure DevOps.\n\nPipeline có 1 job (Cloud agent job). Có 4 tasks: NuGet restore, Compile Application, Copy Files, Publish Artifact.\n\nKhông đếm stage thành job. Không gộp Publish Artifact thành job thứ hai.\n\nKeywords phản xạ nhanh (AZ-400)\n\"pipeline exhibit Cloud agent job\" → 1 job / 4 tasks.\n",
    "boxes": {
      "1": {
        "label": "The pipeline has [ ] job(s).",
        "answer": "1"
      },
      "2": {
        "label": "The pipeline has [ ] task(s).",
        "answer": "4"
      }
    },
    "answerText": "1, 4"
  },
  "374": {
    "stem": "SIMULATION — Bạn có Azure Function host trên App Service plan az400-123456789-func1.\nCần cấu hình function tự upgrade mỗi khi có commit mới trên master của https://github.com/Azure-Samples/functions-quickstart.\nĐăng nhập Microsoft Azure portal để hoàn thành.",
    "explanation": "Đáp án: Deployment Center của Function App trỏ GitHub Azure-Samples/functions-quickstart, branch master\n\nĐề Function App az400-123456789-func1 tự upgrade khi có commit mới trên master của repo mẫu.\n\nMở Azure portal → App Services → az400-123456789-func1 → Deployment Center. Chọn GitHub (hoặc Azure Pipelines nếu lab yêu cầu), Organization/Repository/Branch = functions-quickstart / master, Authorize rồi Finish. Mỗi push master sẽ build/deploy function.\n\nKhông cấu hình thủ công từng publish zip nếu đề yêu cầu continuous deploy từ GitHub. Không trỏ nhánh khác master.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Function App\" + \"upgrade when committed to master\" → Deployment Center + GitHub master CD.\n",
    "answerText": "Deployment Center: CD từ GitHub repo functions-quickstart, branch master."
  },
  "375": {
    "stem": "Cần dùng Azure Automation State Configuration để giữ VM configurations nhất quán theo thời gian.\nNăm thao tác theo thứ tự? Kéo action vào answer area.",
    "explanation": "Đáp án: Upload configuration → Compile node configuration → Onboard VMs → Assign node configuration → Check compliance\n\nĐề Azure Automation State Configuration duy trì consistency VM, năm bước theo thứ tự Microsoft.\n\nUpload configuration lên Azure Automation State Configuration. Compile thành node configuration. Onboard VM. Assign node configuration. Check compliance status của node.\n\nKhông chèn management group hay tags vào chuỗi DSC này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Automation State Configuration\" + \"five actions\" → Upload → Compile → Onboard → Assign → Check compliance.\n",
    "boxes": {
      "1": {
        "answer": "Upload a configuration to Azure Automation State Configuration."
      },
      "2": {
        "answer": "Compile a configuration into a node configuration."
      },
      "3": {
        "answer": "Onboard the virtual machines to Azure Automation State Configuration."
      },
      "4": {
        "answer": "Assign the node configuration."
      },
      "5": {
        "answer": "Check the compliance status of the node."
      }
    },
    "answerText": "Upload a configuration to Azure Automation State Configuration., Compile a configuration into a node configuration., Onboard the virtual machines to Azure Automation State Configuration., Assign the node configuration., Check the compliance status of the node."
  },
  "376": {
    "stem": "Application source có nhiều branch. Bạn sửa nhiều trên branch thí nghiệm.\nCần cập nhật main để lấy thay đổi đó và override lịch sử Git repository.\nNên dùng Git option nào?",
    "options": {
      "A": "Rebase",
      "B": "Fetch",
      "C": "Merge",
      "D": "Push"
    },
    "explanation": "Đáp án: A — Rebase\n\nĐề đưa thay đổi từ experimentation branch vào main và override history Git.\n\nRebase replay commit lên tip khác, viết lại history tuyến tính — đúng yêu cầu override history theo đề.\n\nB sai vì Fetch chỉ tải remote, không tích hợp. C sai vì Merge thêm merge commit, giữ song song history. D sai vì Push đẩy ref, không tự override history trên main.\n\nKeywords phản xạ nhanh (AZ-400)\n\"update main\" + \"override the history\" → Rebase.\n",
    "answerText": "A"
  },
  "377": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nAzure Pipelines build/test React.js, một job. npm install mất khoảng năm phút mỗi lần chạy.\nCần giảm thời gian pipeline.\nGiải pháp: Định nghĩa container job dùng custom container đã preinstall JavaScript packages.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề React.js, một job, npm install mất khoảng năm phút mỗi run. Solution: container job dùng custom image đã preinstall packages.\n\nImage tùy biến giúp một phần nhưng dependency đổi thì phải rebuild image; pipeline vẫn thường chạy npm install theo package.json. Đây không phải cache chuẩn giữa các run. Series chấp nhận pipeline caching, không chấp nhận preinstalled container.\n\nKhông chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"npm takes five minutes\" + \"custom image preinstalled packages\" → No.\n",
    "answerText": "B"
  },
  "378": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nAzure Pipelines build/test React.js, npm install ~5 phút mỗi run.\nCần giảm thời gian pipeline.\nGiải pháp: Enable pipeline caching.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: A — Yes\n\nCùng mục tiêu rút thời gian npm. Solution: enable pipeline caching.\n\nCache@2 (pipeline caching) lưu node_modules / npm cache theo key package-lock.json. Lần sau cache hit, bỏ phần lớn thời gian npm install.\n\nContainer preinstall và parallel jobs không đạt trong series này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"npm takes five minutes\" + \"pipeline caching\" → Yes.\n",
    "answerText": "A"
  },
  "379": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nAzure Pipelines build/test React.js, npm install ~5 phút mỗi run.\nCần giảm thời gian pipeline.\nGiải pháp: Enable parallel jobs cho pipeline.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng mục tiêu. Solution: enable parallel jobs.\n\nPipeline chỉ một job; npm install vẫn khoảng năm phút trong job đó. Parallel không rút bước tuần tự npm.\n\nCần pipeline caching. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"npm takes five minutes\" + \"parallel jobs\" + \"single job\" → No.\n",
    "answerText": "B"
  },
  "380": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nĐịnh tạo release pipeline deploy Azure bằng ARM templates:\n• Hai resource groups\n• Bốn VM trong một RG\n• Hai Azure SQL databases trong RG kia\nCần recommend cách deploy.\nGiải pháp: Tạo hai standalone templates, mỗi template deploy resource trong RG của nó.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: A — Yes\n\nĐề release pipeline ARM: hai resource group, VM ở một RG, Azure SQL ở RG kia. Solution: hai template độc lập, mỗi template scope một resource group.\n\nHai standalone template, pipeline gọi hai deployment — đúng mô hình ARM multi-RG. Microsoft chấp nhận cách này.\n\nMột standalone/nested nhồi cả hai RG thì series đánh No; linked templates cũng Yes ở câu khác.\n\nKeywords phản xạ nhanh (AZ-400)\n\"two resource groups\" + \"two ARM templates (one per RG)\" → Yes.\n",
    "answerText": "A"
  },
  "381": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nCùng yêu cầu deploy hai RG (VM + SQL).\nGiải pháp: Một standalone template deploy tất cả resources.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng mục tiêu hai RG. Solution: một standalone ARM template chứa resource cho cả hai resource group.\n\nMột template khó/không sạch khi tạo và nhồi resource vào hai RG khác nhau; kém modular. Đề không chấp nhận single standalone template.\n\nDùng hai template hoặc main + two linked templates. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"two resource groups\" + \"single standalone ARM template\" → No.\n",
    "answerText": "B"
  },
  "382": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nProject Azure DevOps. Build tạo nhiều artifacts. Cần deploy artifacts lên on-premises servers.\nGiải pháp: Deploy Kubernetes cluster on-premises, deploy Helm agent, thêm Download Build Artifacts task.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề series: build tạo nhiều artifact, cần copy/cài lên Windows và Linux server on-premises. Solution: Kubernetes on-prem + Helm agent + Download Build Artifacts.\n\nK8s + Helm deploy container/chart, không phải cách chuẩn copy artifact tùy ý lên Windows/Linux server. Download artifacts lên cluster không đồng nghĩa cài lên server đích.\n\nCần deployment group hoặc copy files tới máy đích. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"copy artifacts to on-prem servers\" + \"Kubernetes + Helm\" → No.\n",
    "answerText": "B"
  },
  "383": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nCần deploy artifacts lên on-premises servers.\nGiải pháp: Deploy một Docker build lên on-premises server. Thêm Download Build Artifacts task.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng mục tiêu. Solution: Docker build trên on-prem server + Download Build Artifacts.\n\nDocker build không deploy mọi loại artifact. Download trên pipeline agent không tự cài lên các server on-prem.\n\nKhông chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"copy artifacts to on-prem servers\" + \"Docker build + Download Artifacts\" → No.\n",
    "answerText": "B"
  },
  "384": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nCần deploy artifacts lên on-premises servers.\nGiải pháp: Deploy Azure self-hosted agent lên on-premises server. Thêm Copy and Publish Build Artifacts task vào deployment pipeline.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng mục tiêu. Solution: Azure self-hosted agent on-prem + Copy and Publish Build Artifacts.\n\nSelf-hosted agent on-prem là nền đúng, nhưng Copy and Publish Build Artifacts là task publish artifact của build, không copy/cài lên máy đích. Cần Copy Files, Windows Machine File Copy hoặc deployment group.\n\nĐề không chấp nhận combo này. Không chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"on-prem servers\" + \"Copy and Publish Build Artifacts\" → No (wrong task).\n",
    "answerText": "B"
  },
  "385": {
    "stem": "Project1 có pipeline build container image Image1 rồi push lên ACR1. Image1 dùng base image trên Docker Hub.\nCần Image1 tự update mỗi khi base image được update.\nBạn nên làm gì?",
    "options": {
      "A": "Enable the Azure Event Grid resource provider and subscribe to registry events.",
      "B": "Add a Docker Hub service connection to Azure Pipelines.",
      "C": "Create and run an Azure Container Registry task.",
      "D": "Create a service hook in Project1."
    },
    "explanation": "Đáp án: C — Create and run an Azure Container Registry task\n\nĐề Image1 trên ACR1 dùng base image Docker Hub; cần Image1 tự cập nhật khi base đổi.\n\nACR Task với trigger base image tự rebuild/push Image1 khi Docker Hub cập nhật base — đúng tính năng ACR Tasks.\n\nA và D sai vì Event Grid/service hook cần tự orchestration thêm. B sai vì Docker Hub service connection chỉ auth pull lúc pipeline, không auto-rebuild khi Hub update.\n\nKeywords phản xạ nhanh (AZ-400)\n\"update image when base image updates\" → ACR Task (base image trigger).\n",
    "answerText": "C"
  },
  "386": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nCần deploy artifacts lên on-premises servers.\nGiải pháp: Deploy Octopus Deploy server, polled Tentacle trên on-premises server, thêm Octopus task vào deployment pipeline.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng mục tiêu artifact lên on-prem servers. Solution: Octopus Deploy + polled Tentacle + Octopus task.\n\nChỉ thêm Octopus task và Tentacle chưa đảm bảo lấy artifact Azure DevOps và cài đúng mọi server theo yêu cầu series. Series này không chấp nhận Octopus như giải pháp đủ.\n\nKhông chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"copy artifacts to on-prem servers\" + \"Octopus Tentacle\" → No.\n",
    "answerText": "B"
  },
  "387": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nCùng yêu cầu ARM: hai RG, VM và SQL tách RG.\nGiải pháp: Main template deploy resource một RG và nested template deploy RG kia.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề hai RG ARM. Solution: một nested template chứa resource cho cả hai resource group.\n\nNested template chạy trong cùng deployment context với parent, kém phù hợp hai RG độc lập. Series chấp nhận hai standalone hoặc main + two linked templates, không chấp nhận một nested gom cả hai RG.\n\nKhông chọn Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"two resource groups\" + \"single nested template\" → No.\n",
    "answerText": "B"
  },
  "388": {
    "stem": "Lưu ý: Câu thuộc nhóm cùng bối cảnh. Không quay lại được.\nCùng yêu cầu ARM hai RG.\nGiải pháp: Main template có hai linked templates, mỗi cái deploy resource trong RG của nó.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: A — Yes\n\nCùng mục tiêu hai RG. Solution: main template với hai linked templates, mỗi linked deploy một resource group.\n\nLinked templates: main orchestrate, mỗi linked deploy VM hoặc SQL vào đúng RG. Modular, đúng pattern Microsoft cho multi-RG.\n\nNested single template và một standalone nhồi hai RG thì No.\n\nKeywords phản xạ nhanh (AZ-400)\n\"two resource groups\" + \"main + two linked templates\" → Yes.\n",
    "answerText": "A"
  },
  "389": {
    "stem": "Bạn đang build application với các asset:\n• Source code\n• Logs từ automated tests và builds\n• Binary lớn, cập nhật thường xuyên\n• Common library dùng cho nhiều applications\nLưu từng asset ở đâu? Kéo Azure service vào từng asset. Mỗi service dùng một lần.",
    "explanation": "Đáp án: Source code = Azure Repos; Common library = Azure Artifacts; Logs = Azure Pipelines; Large binaries = Azure Storage\n\nĐề kéo đúng dịch vụ Azure cho từng loại asset.\n\nSource code lưu Azure Repos. Common library dùng nhiều app lưu Azure Artifacts (package feed). Logs từ automated tests và builds nằm trên Azure Pipelines (kết quả run). Binary lớn, cập nhật thường xuyên lưu Azure Storage, không nhét Git.\n\nKhông dùng Test Plans cho log CI hay binary. Không đưa common library vào Repos như source chính.\n\nKeywords phản xạ nhanh (AZ-400)\n\"source / library / test logs / large binaries\" → Repos / Artifacts / Pipelines / Storage.\n",
    "boxes": {
      "1": {
        "answer": "Azure Repos"
      },
      "2": {
        "answer": "Azure Artifacts"
      },
      "3": {
        "answer": "Azure Pipelines"
      },
      "4": {
        "answer": "Azure Storage"
      }
    },
    "answerText": "Azure Repos, Azure Artifacts, Azure Pipelines, Azure Storage"
  },
  "390": {
    "stem": "Bạn định share packages đã write/test/validate/deploy bằng Azure Artifacts.\nCần release nhiều builds của mỗi package trên một feed, hạn chế phát package đang development.\nNên dùng gì?",
    "options": {
      "A": "local symbols",
      "B": "views",
      "C": "global symbols",
      "D": "upstream sources"
    },
    "explanation": "Đáp án: B — views\n\nĐề một feed Azure Artifacts phát nhiều build của cùng package, hạn chế phát package đang development.\n\nViews @local / @prerelease / @release trên cùng feed: consumer mặc định chỉ thấy view release; package đang dev ở view khác.\n\nD sai vì upstream sources kéo feed ngoài. A và C sai vì local/global symbols là PDB/debug, không kiểm soát release package.\n\nKeywords phản xạ nhanh (AZ-400)\n\"single feed\" + \"limit packages in development\" → views (@prerelease/@release).\n",
    "answerText": "B"
  },
  "391": {
    "stem": "Project1 có Pipe1 build App1, dùng Pool1 (Windows Server 2019 self-hosted agent).\nSẽ có Project2 / Pipe2 / App2. App1 và App2 conflict dependencies.\nCần giảm khả năng hai pipeline đụng nhau, giảm chi phí infrastructure.\nBạn nên làm gì?",
    "options": {
      "A": "Add another self-hosted agent.",
      "B": "Add a Docker Compose task to the build pipelines.",
      "C": "Change the self-hosted agent to use Red Hat Enterprise Linux (RHEL) 8.",
      "D": "Create two container jobs."
    },
    "explanation": "Đáp án: D — Create two container jobs\n\nĐề Pipe1 và Pipe2 dùng chung Pool1 (Windows Server 2019 self-hosted); App1 và App2 conflict dependencies; giảm khả năng hai pipeline ảnh hưởng nhau.\n\nMỗi pipeline chạy container job riêng (dependency isolated) trên cùng agent, không conflict, không mua thêm máy.\n\nA sai vì thêm agent tốn kém hơn. C sai vì đổi RHEL không tách hai bộ dependency Windows. B sai vì Docker Compose không phải isolation build job chuẩn trên agent.\n\nKeywords phản xạ nhanh (AZ-400)\n\"conflicting dependencies\" + \"same self-hosted agent\" → two container jobs.\n",
    "answerText": "D"
  },
  "392": {
    "stem": "Bạn định lưu signed images trên Azure Container Registry az4009940427acr1.\nCần đổi SKU của registry để hỗ trợ signed images, chi phí thấp nhất.\nĐăng nhập Microsoft Azure portal để hoàn thành.",
    "explanation": "Đáp án: Đổi SKU az4009940427acr1 lên Premium\n\nĐề lưu signed images trên ACR, minimize cost.\n\nContent trust / signed images trên Azure Container Registry cần SKU Premium. Basic và Standard không hỗ trợ content trust. Premium là bậc thấp nhất đáp ứng yêu cầu.\n\nPortal: Container registries → az4009940427acr1 → Pricing tier → Premium → Save. Không để Basic/Standard. Không chọn thêm option đắt hơn Premium.\n\nKeywords phản xạ nhanh (AZ-400)\n\"signed images\" + \"ACR SKU\" + \"minimize costs\" → Premium.\n",
    "answerText": "Đổi ACR SKU lên Premium (content trust / signed images)."
  },
  "393": {
    "stem": "Công ty có 500 developers, liên tục thêm người mới. Cần automate quản lý users và licenses tối đa.\nTask nào vẫn phải làm thủ công?",
    "options": {
      "A": "modifying group memberships",
      "B": "adding users",
      "C": "assigning entitlements",
      "D": "procuring licenses"
    },
    "explanation": "Đáp án: D — procuring licenses\n\nĐề 500 developer, thêm người liên tục; tự động hóa user và license tối đa; hỏi việc nào phải làm thủ công.\n\nMua/gia hạn license (billing, EA) là bước thương mại, không tự hết trong Azure DevOps.\n\nA, B, C sai vì modifying group memberships, adding users và assigning entitlements tự động hóa được qua Azure AD group và group rules.\n\nKeywords phản xạ nhanh (AZ-400)\n\"automate users and licenses\" + \"must perform manually\" → procuring licenses.\n",
    "answerText": "D"
  },
  "394": {
    "stem": "Công ty dùng TFS 2013, định migrate lên Azure DevOps.\nCần strategy:\n• Giữ changeset dates của TFVC\n• Giữ changed dates của work item revisions\n• Giảm effort migrate\n• Migrate mọi TFS artifacts\nRecommend gì? Chọn trong answer area.",
    "explanation": "Đáp án: Upgrade TFS to the most recent RTW release; Use the TFS Database Import Service\n\nĐề migrate TFS 2013 sang Azure DevOps: giữ changeset dates, work item revision dates, minimize effort, migrate all artifacts.\n\nTrên TFS server phải upgrade lên RTW mới nhất vì Database Import Service chỉ nhận version TFS hiện hỗ trợ. Cách migrate là TFS Database Import Service (Azure DevOps migration) để import full collection và giữ dates.\n\nKhông dùng TFS Integration Tools hay clone Git vì mất date/work item history và không migrate hết artifact.\n\nKeywords phản xạ nhanh (AZ-400)\n\"TFS 2013 migrate\" + \"preserve dates / all artifacts\" → upgrade to latest RTW + Database Import Service.\n",
    "boxes": {
      "1": {
        "label": "On the TFS server:",
        "answer": "Upgrade TFS to the most recent RTW release."
      },
      "2": {
        "label": "To perform the migration:",
        "answer": "Use the TFS Database Import Service."
      }
    },
    "answerText": "Upgrade TFS to the most recent RTW release., Use the TFS Database Import Service."
  },
  "395": {
    "stem": "Công ty đang build solution Java. Hiện dùng SonarQube cho code .NET.\nCần analyze/monitor code quality solution Java.\nNên thêm task type nào vào build pipeline?",
    "options": {
      "A": "Octopus",
      "B": "Chef",
      "C": "CocoaPods",
      "D": "Gradle"
    },
    "explanation": "Đáp án: D — Gradle\n\nĐề Java mới, đã có SonarQube cho .NET; cần analyze/monitor Java trên build pipeline.\n\nGradle task cộng SonarScanner for Gradle đẩy analysis Java lên SonarQube sẵn có.\n\nA sai vì Octopus là deploy. B sai vì Chef là config management. C sai vì CocoaPods là iOS.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Java\" + \"SonarQube\" + \"which task\" → Gradle.\n",
    "answerText": "D"
  },
  "396": {
    "stem": "Công ty đang build solution Java. Hiện dùng SonarQube cho code .NET.\nCần analyze/monitor code quality solution Java.\nNên thêm task type nào vào build pipeline?",
    "options": {
      "A": "Maven",
      "B": "CocoaPods",
      "C": "Xcode",
      "D": "Gulp"
    },
    "explanation": "Đáp án: A — Maven\n\nCùng kịch bản Java + SonarQube sẵn có. Ở biến thể này đáp án là Maven.\n\nMaven + sonar-maven-plugin / Prepare Analysis Configuration là đường chuẩn Java–SonarQube trên Azure Pipelines.\n\nB và C sai vì CocoaPods và Xcode dành Apple. D sai vì Gulp dành JavaScript.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Java\" + \"SonarQube\" + \"task types\" → Maven.\n",
    "answerText": "A"
  },
  "397": {
    "stem": "Subscription1 có custom Azure policy Policy1 (audit naming convention). Pipeline1 deploy ARM resources lên Subscription1.\nCần resource do Pipeline1 deploy tuân Policy1.\nNên thêm gì vào Pipeline1?",
    "options": {
      "A": "a pre-deployment task that runs a security and compliance assessment",
      "B": "a post-deployment task that runs a security and compliance assessment",
      "C": "an ARM template deployment task to assign Policy1 to Subscription1",
      "D": "an ARM template deployment task to deploy Policy1 to Subscription1"
    },
    "explanation": "Đáp án: A — a pre-deployment task that runs a security and compliance assessment\n\nĐề Pipeline1 deploy ARM lên Subscription1 đã có Policy1 (audit naming). Cần resource do pipeline deploy tuân Policy1.\n\nWhat-if / security and compliance assessment trước deploy (shift-left) chặn resource sai naming trước khi tạo. Policy1 đã gán trên subscription; không cần assign/deploy lại policy.\n\nB sai vì post-deployment chỉ audit sau khi resource sai đã được tạo. C và D sai vì assign/deploy Policy1 không đảm bảo từng lần Pipeline1 được kiểm trước khi apply template.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ARM pipeline\" + \"comply with Azure Policy\" → pre-deployment security and compliance assessment.\n",
    "answerText": "A"
  },
  "398": {
    "stem": "Định dùng DSC giữ configuration Windows Server VM:\n• Cài IIS\n• Cập nhật default home page của IIS\nCấu hình DSC configuration file thế nào? Chọn trong answer area.",
    "explanation": "Đáp án: WindowsFeature; File\n\nĐề DSC cho Windows Server: cài IIS và cập nhật default home page.\n\nCài IIS dùng resource WindowsFeature (Name = Web-Server, Ensure = Present). Default home page dùng resource File (Ensure Present, DestinationPath wwwroot, Contents hoặc SourcePath).\n\nKhông dùng Registry hay Service thay WindowsFeature + File cho hai yêu cầu này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"DSC\" + \"install IIS\" + \"default home page\" → WindowsFeature / File.\n",
    "boxes": {
      "1": {
        "answer": "Windows Feature"
      },
      "2": {
        "answer": "File"
      }
    },
    "answerText": "Windows Feature, File"
  },
  "399": {
    "stem": "Project Azure DevOps. Cần đẩy notification về pull requests vào Microsoft Teams channel, giảm development effort.\nBạn nên làm gì?",
    "options": {
      "A": "Install the Azure Pipelines app for Teams and configure a subscription to receive notifications in the channel.",
      "B": "Use Azure Automation to connect to the Azure DevOps REST API and send messages to Teams.",
      "C": "Install the Azure Repos app for Teams and configure a subscription to receive notifications in the channel.",
      "D": "Use an Azure function to connect to the Azure DevOps REST API and send messages to Teams."
    },
    "explanation": "Đáp án: C — Install the Azure Repos app for Teams and configure a subscription\n\nĐề push notification pull request sang Microsoft Teams channel, minimize development effort.\n\nAzure Repos app for Teams subscribe event PR (created, completed, …) với gần như zero code.\n\nA sai vì Azure Pipelines app là build/release, không phải PR. B và D sai vì Azure Automation và Azure Function tự viết REST tốn nhiều effort.\n\nKeywords phản xạ nhanh (AZ-400)\n\"pull request notifications\" + \"Microsoft Teams\" + \"minimize effort\" → Azure Repos app for Teams.\n",
    "answerText": "C"
  },
  "400": {
    "stem": "Bạn đang viết YAML Azure pipeline deploy Azure Data Factory, yêu cầu:\n• Nếu Data Factory đã tồn tại thì overwrite.\n• Không ảnh hưởng resource khác trong resource group Fabrikam.\nHoàn thành code. Chọn option trong answer area.",
    "explanation": "Đáp án: Create Or Update Resource Group + Incremental\n\nĐề bài cần pipeline YAML vừa ghi đè Azure Data Factory nếu instance đã có, vừa không đụng resource khác trong resource group Fabrikam.\n\nÔ Action chọn Create Or Update Resource Group (hoặc tương đương create-or-update). Lệnh này tạo Data Factory nếu chưa có, hoặc overwrite instance cũ nếu đã có — đúng yêu cầu ghi đè.\n\nÔ Mode chọn Incremental. Incremental chỉ thêm hoặc cập nhật resource nằm trong template. Resource khác trong Fabrikam (không có trong template) được giữ nguyên.\n\nKhông chọn Complete: mode Complete xóa mọi resource trong resource group mà template không khai báo, trái yêu cầu “không ảnh hưởng resource khác”.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Data Factory\" + \"overwrite\" + \"no other resources affected\" → Create Or Update + Incremental (not Complete).\n",
    "boxes": {
      "1": {
        "answer": "'Create Or Update Resource Group'"
      },
      "2": {
        "answer": "'Incremental'"
      }
    },
    "answerText": "'Create Or Update Resource Group', 'Incremental'"
  },
  "401": {
    "stem": "Project Azure DevOps produce npm packages, nhiều project consume. Cần Azure Artifacts có cả latest và pre-release.\nBạn nên làm gì?",
    "options": {
      "A": "Create two feed views named @prerelease and @release, Set @release as the default view. Configure a release pipeline that tags the packages as release after successful testing.",
      "B": "Create a feed view named @prerelease. Configure a release pipeline that tags the packages as release after successful testing.",
      "C": "Create two feed views named @prerelease and @default. Configure a release pipeline that promotes a package to the @default view after successful testing.",
      "D": "Create two feed views named @prerelease and @release. Set @release as the default view. Configure a release pipeline that promotes a package to the @release view after successful testing."
    },
    "explanation": "Đáp án: D\n\nĐề bài: project phát npm packages, nhiều project khác consume. Azure Artifacts phải có cả bản latest ổn định và bản pre-release.\n\nCách chuẩn là tạo hai feed views: @prerelease (bản đang thử) và @release (bản đã test). Đặt @release làm default view để consumer không chỉ định view sẽ chỉ nhận bản ổn định, không lấy nhầm bản dev.\n\nSau khi test xong, release pipeline phải promote package lên view @release. Promote mới đổi visibility; chỉ gắn tag “release” không tách được hai nhóm consumer.\n\nA sai vì chỉ tag, không promote. B thiếu view @release và cũng chỉ tag. C dùng tên @default — không phải view bạn tạo theo convention; default view chuẩn cho bản ổn định là @release.\n\nKeywords phản xạ nhanh (AZ-400)\n\"npm\" + \"latest and pre-release\" + Artifacts → @prerelease + @release (default @release) + promote (not tag).\n",
    "answerText": "D"
  },
  "402": {
    "stem": "Project publish npm lên Feed1, nhiều project consume Feed1.\nChỉ package đã test mới được consume, giảm development effort.\nBạn nên làm gì?",
    "options": {
      "A": "Create a feed view named @release and set @release as the default view. After the npm packages test successfully, configure a release pipeline that promotes a package to the @release view.",
      "B": "Create a feed view named @release and set @release as the default view. After the npm packages test successfully, configure a release pipeline that tags the packages as release.",
      "C": "Create a feed view named @default. After the npm packages test successfully, configure a release pipeline that tags the packages as release.",
      "D": "Create a feed view named @default. After the npm packages test successfully, configure a release pipeline that promotes a package to the @default view."
    },
    "explanation": "Đáp án: A\n\nĐề bài: npm publish lên Feed1, nhiều project consume. Chỉ package đã test mới được lấy, và phải ít tốn công phát triển.\n\nTạo view @release rồi đặt làm default view. Restore/npm không chỉ định view thì chỉ thấy package đã được promote lên @release. Pipeline, sau khi test pass, promote package lên view đó — đúng cơ chế có sẵn của Azure Artifacts, không cần code thêm.\n\nB sai: tag không ẩn package khỏi default view; consumer vẫn có thể lấy bản chưa test. C và D tự tạo view tên @default; feed đã có @local mặc định, và tag/promote lên @default không phải cách chuẩn để chỉ phát hành bản đã test.\n\nKeywords phản xạ nhanh (AZ-400)\n\"only tested packages\" + minimize effort → default view @release + promote after test.\n",
    "answerText": "A"
  },
  "403": {
    "stem": "Công ty có Azure DevOps project produce npm packages, nhiều project consume.\nCần giảm disk space của package cũ trên Azure Artifacts.\nNên sửa gì?",
    "options": {
      "A": "the retention settings of the project’s release",
      "B": "the retention settings of the project’s pipeline",
      "C": "the retention settings of the project’s tests",
      "D": "the retention settings of the company pipeline"
    },
    "explanation": "Đáp án: B — retention settings of the project’s pipeline\n\nĐề bài muốn giảm dung lượng package cũ trên Azure Artifacts.\n\nPackage thường được publish từ pipeline run. Retention của pipeline quyết định run (và artifact gắn với run) được giữ bao lâu. Rút thời gian giữ thì run cũ bị xóa, chỗ occupied bởi package/old build giảm theo.\n\nA (release retention) giữ bản release, không phải chỗ đề chọn để dọn Artifacts. C (tests) không quản lý vòng đời package. D không có mục “company pipeline” retention chuẩn trên Azure DevOps.\n\nKeywords phản xạ nhanh (AZ-400)\n\"minimize disk space\" + \"older packages\" + Azure Artifacts → pipeline retention settings.\n",
    "answerText": "B"
  },
  "404": {
    "stem": "Azure DevOps pipeline deploy Node.js app. Cần cache dependencies giữa các builds.\nCấu hình deployment YAML thế nào? Kéo value vào đúng chỗ.",
    "explanation": "Đáp án: build.sh + ne(variables.CACHE_RESTORED, 'true')\n\nĐề bài: pipeline deploy Node.js, cần cache dependencies giữa các build để lần sau không cài lại từ đầu.\n\nKhi cache hit, bước cài dependency bị bỏ. Khi cache miss phải chạy script cài/build. Theo exhibit, script đó là build.sh (không phải integrationtest.sh — test không khôi phục node_modules).\n\nĐiều kiện chạy bước cài: ne(variables.CACHE_RESTORED, 'true') — chỉ chạy khi cache không được restore. always() chạy mọi lúc (thừa). eq(..., 'true') chạy khi đã có cache — ngược yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"cache dependencies\" + Node.js YAML → build.sh when ne(CACHE_RESTORED, true).\n",
    "boxes": {
      "1": {
        "answer": "build.sh"
      },
      "2": {
        "answer": "ne (variables.CACHE_RESTORED, 'true')"
      }
    },
    "answerText": "build.sh, ne (variables.CACHE_RESTORED, 'true')"
  },
  "405": {
    "stem": "Bạn quản lý Git repository cho enterprise app lớn. Cần giảm data size của repository.\nHoàn thành commands. Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: --aggressive + prune\n\nĐề bài: Git repo enterprise lớn, cần giảm data size trên máy local.\n\ngit gc --aggressive nén và pack lại object database mạnh hơn gc mặc định, giảm kích thước repo.\n\ngit prune xóa object không còn reach được từ commit nào (rác sau rebase, amend, reset).\n\nChỉ gc nhẹ, fetch, merge hay rebase không đủ để “minimize data size” như đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"minimize repository data size\" + Git → git gc --aggressive + git prune.\n",
    "boxes": {
      "1": {
        "answer": "--aggressive"
      },
      "2": {
        "answer": "prune"
      }
    },
    "answerText": "--aggressive, prune"
  },
  "406": {
    "stem": "SIMULATION — Định deploy template D:\\Deploy.json lên resource group Deploy-lod123456789.\nCần sửa template rồi deploy:\n• Address space chỉ còn 256 IP.\n• Subnet address space chỉ còn 64 IP.\nĐăng nhập Microsoft Azure portal.",
    "explanation": "Đề bài: sửa template D:\\Deploy.json rồi deploy vào resource group Deploy-lod123456789. Address space chỉ còn 256 IP; subnet chỉ còn 64 IP.\n\n256 địa chỉ = prefix /24 (ví dụ 10.0.0.0/24). 64 địa chỉ = prefix /26 (ví dụ 10.0.0.0/26).\n\nCác bước trên portal: mở resource group Deploy-lod123456789, Deploy a custom template (hoặc sửa Deploy.json rồi upload). Đổi addressSpace.addressPrefixes thành 10.0.0.0/24, đổi subnet addressPrefix thành 10.0.0.0/26. Save rồi Review + create vào đúng resource group.\n\nKeywords phản xạ nhanh (AZ-400)\n\"256 IP\" + \"64 IP\" + ARM/VNet → address space /24 + subnet /26.\n",
    "answerText": "Sửa VNet /24 và subnet /26 rồi deploy template vào Deploy-lod123456789."
  },
  "407": {
    "stem": "SIMULATION — Cấu hình Azure web app az400-123456789-main có biến môi trường MAX_ITEMS = 50.\nĐăng nhập Microsoft Azure portal.",
    "explanation": "Đề bài: web app az400-123456789-main phải có biến môi trường MAX_ITEMS = 50.\n\nTrên App Service, biến này khai báo bằng Application setting (cũng hiện ở Environment variables).\n\nMở portal → App Services → az400-123456789-main → Configuration / Environment variables → Application settings. Thêm Name = MAX_ITEMS, Value = 50, Save. Restart app nếu portal yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"environmental variable\" + App Service → Application setting (name/value).\n",
    "answerText": "Application setting MAX_ITEMS=50 trên web app az400-123456789-main."
  },
  "408": {
    "stem": "Bạn provision AKS cluster đã bật RBAC. Có Helm chart cho client application.\nCần cấu hình Helm và Tiller trên cluster rồi cài chart.\nBa lệnh nào theo thứ tự? Kéo command vào answer area.",
    "explanation": "Đáp án (thứ tự): kubectl create → helm init → helm install\n\nĐề bài: AKS đã bật RBAC, có Helm chart. Cần cấu hình Helm/Tiller rồi cài chart. Exam vẫn theo Helm 2 (có Tiller trong cluster).\n\nBước 1 — kubectl create -f rbac-config.yaml: tạo ServiceAccount và ClusterRoleBinding để Tiller có quyền trên cluster RBAC.\n\nBước 2 — helm init --service-account tiller: cài Tiller vào cluster, gắn với service account vừa tạo.\n\nBước 3 — helm install: Tiller render chart và tạo resource Kubernetes.\n\nhelm serve / helm completion không cài Tiller. Helm 3 không còn Tiller, nhưng đáp án exam vẫn là ba lệnh trên.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Helm\" + \"Tiller\" + AKS RBAC → kubectl create, helm init, helm install.\n",
    "boxes": {
      "1": {
        "answer": "kubectl create"
      },
      "2": {
        "answer": ""
      },
      "3": {
        "answer": "helm init"
      },
      "4": {
        "answer": "helm install"
      }
    },
    "answerText": "kubectl create, helm init, helm install"
  },
  "409": {
    "stem": "Công ty build multi-tier web app, production trên Azure VM, dùng Azure DevOps. Team có ARM template VM để test feature mới.\nCần staging trên Azure: chi phí host thấp; provision VM tự động; dùng custom ARM template.\nBạn nên làm gì?",
    "options": {
      "A": "In Azure Cloud Shell, run Azure CLI commands to create and delete the new virtual machines in a staging resource group.",
      "B": "In Azure DevOps, configure new tasks in the release pipeline to deploy to Azure Cloud Services.",
      "C": "From Azure Cloud Shell, run Azure PowerShell commands to create and delete the new virtual machines in a staging resource group.",
      "D": "In Azure DevOps, configure new tasks in the release pipeline to create and delete the virtual machines in Azure DevTest Labs."
    },
    "explanation": "Đáp án: D\n\nĐề bài cần môi trường staging trên Azure: rẻ, tự provision VM, và dùng đúng custom ARM template của team. Production đang chạy trên Azure VM, quản lý bằng Azure DevOps.\n\nAzure DevTest Labs kết hợp release pipeline đáp ứng cả ba: task tạo/xóa VM trong lab, dùng ARM custom, có auto-shutdown và policy để hạ chi phí. Pipeline lặp lại được, không gõ lệnh tay mỗi lần.\n\nA và C (CLI/PowerShell trong Cloud Shell) tạo/xóa VM được nhưng không có sẵn chính sách cost và vòng đời lab; tốn công vận hành. B (Azure Cloud Services) là PaaS classic, không khớp mô hình VM + ARM template của đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"minimize cost\" + \"provision VMs automatically\" + \"custom ARM\" + staging → DevTest Labs + release pipeline.\n",
    "answerText": "D"
  },
  "410": {
    "stem": "Bạn implement Azure DevOps strategy cho mobile bằng App Center. Định dùng distribution groups để kiểm soát access tới releases.\nCần tạo các group như bảng. Loại group nào cho từng group? Kéo type phù hợp.",
    "explanation": "Đề bài: dùng App Center distribution groups để kiểm soát ai nhận được release. Gắn đúng loại group theo bảng.\n\nGroup1 chỉ tester được mời (email) → Private. Đây là mặc định: chỉ thành viên trong group cài được bản đó.\n\nGroup2 cho phép cài từ public link, không cần đăng nhập → Public.\n\nGroup3 dùng chung cho nhiều app trong cùng organization → Shared.\n\nhttps://learn.microsoft.com/en-us/appcenter/distribution/groups\n\nKeywords phản xạ nhanh (AZ-400)\nApp Center distribution groups: invited testers → Private; public link no auth → Public; many apps → Shared.\n",
    "boxes": {
      "1": {
        "answer": "Private"
      },
      "2": {
        "answer": "Public"
      },
      "3": {
        "answer": "Shared"
      }
    },
    "answerText": "Private, Public, Shared"
  },
  "411": {
    "stem": "SIMULATION — Cần webhook https://contoso.com/statushook được gọi mỗi khi registry az400123456789acr1 nhận version mới của image dotnetapp.\nĐăng nhập Microsoft Azure portal.",
    "explanation": "Đề bài: mỗi khi registry az400123456789acr1 nhận version mới của image dotnetapp, phải gọi webhook https://contoso.com/statushook.\n\nACR webhook bắt sự kiện push image. Mở portal → Container registries → az400123456789acr1 → Services → Webhooks. Tạo hoặc sửa webhook với URL trên, Actions = push, Scope/repository = dotnetapp (nếu có ô Scope). Save.\n\nKhi có tag mới của dotnetapp, ACR gửi HTTP POST tới statushook.\n\nKeywords phản xạ nhanh (AZ-400)\n\"webhook\" + \"new image version\" + ACR → Webhooks + trigger image push (repo scope).\n",
    "answerText": "ACR webhook statushook, trigger image push cho repo dotnetapp."
  },
  "412": {
    "stem": "Cần tạo deployment files cho AKS cluster. Các deployment phải đáp ứng yêu cầu provision storage như bảng.\nDùng resource type nào cho từng deployment? Chọn option trong answer area.",
    "explanation": "Đề bài: viết deployment cho AKS, mỗi deployment một kiểu storage (xem bảng).\n\nDeployment 1 cần file trên SMB share, mount vào filesystem của container → provisioner kubernetes.io/azure-file (Azure Files dùng SMB).\n\nDeployment 2 cần file trên managed disk → provisioner kubernetes.io/azure-disk.\n\nDeployment 3 cần lấy X.509 certificate an toàn từ filesystem của pod → driver secrets-store.csi.k8s.io. Azure Key Vault Provider for Secrets Store CSI Driver mount cert/secret từ Key Vault thành volume.\n\nblobfuse-flexvolume gắn Azure Blob, không phải SMB hay managed disk. Driver Key Vault kiểu flexvolume đã deprecated, thay bằng CSI.\n\nKeywords phản xạ nhanh (AZ-400)\nAKS storage: SMB share → azure-file; managed disk → azure-disk; X.509/Key Vault → secrets-store.csi.k8s.io.\n",
    "boxes": {
      "1": {
        "label": "Deployment 1:",
        "answer": "provisioner: kubernetes.io/azure-file"
      },
      "2": {
        "label": "Deployment 2:",
        "answer": "provisioner: kubernetes.io/azure-disk"
      },
      "3": {
        "label": "Deployment 3:",
        "answer": "driver: secrets-store.csi.k8s.io"
      }
    },
    "answerText": "provisioner: kubernetes.io/azure-file, provisioner: kubernetes.io/azure-disk, driver: secrets-store.csi.k8s.io"
  },
  "413": {
    "stem": "Công ty dùng Azure DevOps cho build/release, source trên Git repository.\nBạn định tạo branch mới từ pull request hiện có, sau đó merge branch mới với target branch của PR.\nCần dùng pull request action để tạo branch đó; branch chỉ lấy một phần code trong PR.\nNên dùng action nào?",
    "options": {
      "A": "Set as default branch",
      "B": "Approve with suggestions",
      "C": "Cherry-pick",
      "D": "Reactivate",
      "E": "Revert"
    },
    "explanation": "Đáp án: C — Cherry-pick\n\nĐề bài: từ một pull request hiện có, tạo branch mới chỉ lấy một phần code trong PR, rồi sau đó merge branch mới với target của PR.\n\nCherry-pick chọn từng commit (hoặc một subset thay đổi) từ nhánh PR rồi apply sang branch mới. Đó đúng yêu cầu “chỉ một phần code”, không phải lấy cả PR.\n\nA đổi default branch của repo, không tạo subset. B (Approve with suggestions) là hành động review, không tạo branch. D mở lại PR đã đóng. E (Revert) đảo thay đổi — ngược với việc lấy code.\n\nKeywords phản xạ nhanh (AZ-400)\n\"new branch from PR\" + \"only a portion of the code\" → Cherry-pick.\n",
    "answerText": "C"
  },
  "414": {
    "stem": "Bạn quản lý Git repository cho enterprise app lớn. Trong lúc develop dùng file Config.json.\nCần ngăn Config.json bị commit mỗi khi commit thay đổi app.\nBa bước nào theo thứ tự? Kéo action vào answer area.",
    "explanation": "Đề bài: không để Config.json bị commit mỗi khi commit thay đổi app.\n\nThứ tự đúng:\n\n1. Thêm Config.json vào .gitignore — Git sẽ bỏ qua file này ở các commit sau.\n\n2. git add .gitignore — đưa rule ignore vào staging.\n\n3. git commit — lưu .gitignore lên repo để cả team cùng ignore Config.json.\n\nXóa/tạo lại repository hoặc git reflog expire không giải quyết ignore. Nếu Config.json đã từng được track, thực tế còn cần git rm --cached; đề không có bước đó trong danh sách.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prevent Config.json from being committed\" → .gitignore, git add .gitignore, git commit.\n",
    "boxes": {
      "1": {
        "answer": "Add Config.json to the .gitignore file."
      },
      "2": {
        "answer": "Run the git add .gitignore command."
      },
      "3": {
        "answer": "Run the git commit command."
      }
    },
    "answerText": "Add Config.json to the .gitignore file., Run the git add .gitignore command., Run the git commit command."
  },
  "415": {
    "stem": "Bạn thiết kế build pipeline trên Azure Pipelines, cần self-hosted agent.\nPipeline chạy một lần/ngày, mất 30 phút. Cần recommend compute type cho agent, chi phí thấp nhất.\nBạn nên recommend gì?",
    "options": {
      "A": "an Azure Kubernetes Service (AKS) cluster",
      "B": "Azure Container Instances",
      "C": "an Azure virtual machine scale set",
      "D": "Azure virtual machines"
    },
    "explanation": "Đáp án: C — Azure virtual machine scale set\n\nĐề bài: self-hosted agent, pipeline chạy một lần mỗi ngày khoảng 30 phút, chọn compute rẻ nhất. Theo đáp án exam: VMSS.\n\nScale set agent có thể scale-out khi có job và scale-in (kể cả về 0) khi idle. Bạn không trả tiền VM cả ngày chỉ để chạy 30 phút.\n\nAKS phải nuôi control plane — quá đắt và phức tạp cho một pipeline. Dedicated VM (D) bật cả ngày, tốn hơn. Azure Container Instances không phải kiểu self-hosted agent phổ biến trên Azure Pipelines như VMSS theo cách đề này chấm.\n\nKeywords phản xạ nhanh (AZ-400)\n\"self-hosted agent\" + \"once daily\" + \"minimize costs\" → Azure virtual machine scale set.\n",
    "answerText": "C"
  },
  "416": {
    "stem": "Bạn đang finalize release trên GitHub.\nCần gắn các label sau lên release: Name, Email, Release v3.0, Release date.\nHoàn thành git command. Chọn option trong answer area.",
    "explanation": "Đáp án: git tag -a -m\n\nĐề bài: gắn lên release các thông tin Name, Email, Release v3.0, Release date. Đó là metadata của annotated tag, không phải lightweight tag.\n\ngit tag đánh dấu một commit là điểm release (ví dụ v3.0).\n\nCờ -a tạo annotated tag: Git lưu tên và email người tạo tag, ngày tạo tag.\n\nCờ -m ghi message (ví dụ “Release v3.0”).\n\nVí dụ: git tag -a v3.0 -m \"Release v3.0\". add / commit / push không tạo annotated tag kèm đủ metadata trên.\n\nKeywords phản xạ nhanh (AZ-400)\nGitHub release Name + Email + version + date → git tag -a -m (annotated tag).\n",
    "boxes": {
      "1": {
        "answer": "tag"
      },
      "2": {
        "answer": "-a"
      },
      "3": {
        "answer": "-m"
      }
    },
    "answerText": "tag, -a, -m"
  },
  "417": {
    "stem": "Project Azure DevOps có Azure Resource Group deployment project trong Visual Studio, đã check-in.\nCần release pipeline deploy resource bằng ARM templates, giảm administrative effort.\nNên dùng task type nào?",
    "options": {
      "A": "Azure Cloud Service Deployment",
      "B": "Azure RM Web App Deployment",
      "C": "Azure PowerShell",
      "D": "Azure App Service Manage"
    },
    "explanation": "Đáp án: C — Azure PowerShell\n\nĐề bài: project Visual Studio (ARM) đã check-in Azure DevOps. Cần release pipeline deploy bằng ARM templates, ít công quản trị.\n\nTask Azure PowerShell chạy New-AzResourceGroupDeployment (hoặc New-AzureRmResourceGroupDeployment) với file template đã check-in. Một task cover mọi loại resource trong template, không phải chỉ web app.\n\nA, B, D chỉ deploy Cloud Service hoặc App Service — hẹp hơn ARM tổng quát, không khớp “deploy resources” bằng template.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ARM templates\" + \"minimize administrative effort\" + release pipeline → Azure PowerShell.\n",
    "answerText": "C"
  },
  "418": {
    "stem": "Project Azure DevOps. Định tạo release pipeline deploy bằng ARM templates; template reference secrets trong Azure Key Vault.\nCần recommend cách truy cập secrets lúc deploy, theo least privilege.\nKéo configuration phù hợp vào từng yêu cầu.",
    "explanation": "Đề bài: release pipeline deploy ARM; template lấy secrets từ Key Vault; least privilege. Gắn đúng cơ chế cho từng yêu cầu.\n\nChặn quyền xóa key vault: dùng RBAC trên resource Key Vault (control plane). Role quyết định ai được Delete vault. Đây không phải access policy trên secret.\n\nHạn chế ai đọc secrets: dùng Azure Key Vault access policy (data plane) — cấp Get/List secrets cho service principal của pipeline, không rộng hơn.\n\nPAT của Azure DevOps không cấp quyền Key Vault. Access policy không thay RBAC khi mục tiêu là cấm xóa cả vault.\n\nKeywords phản xạ nhanh (AZ-400)\nKey Vault + least privilege: delete vault → RBAC; secrets → access policy.\n",
    "boxes": {
      "1": {
        "label": "Restrict access to delete the key vault:",
        "answer": "RBAC"
      },
      "2": {
        "label": "Restrict access to the secrets in Key Vault by using:",
        "answer": "an Azure Key Vault access policy"
      }
    },
    "answerText": "RBAC, an Azure Key Vault access policy"
  },
  "419": {
    "stem": "Trong build process, cần deploy một nhóm resource lên Azure bằng ARM template nằm trên GitHub.\nBa bước nào theo thứ tự? Kéo action vào answer area.",
    "explanation": "Đề bài: trong quá trình build/release, deploy một nhóm resource Azure từ ARM template đang nằm trên GitHub. Cần ba bước đúng thứ tự.\n\n1. Create a release pipeline — nơi chạy deploy (không phải đóng gói app).\n\n2. Add an Azure Resource Group Deployment task — task lấy template (từ GitHub/artifact) và deploy lên resource group.\n\n3. Set the template parameters — truyền location, tên resource, tham chiếu Key Vault, v.v.\n\nCreate a package hay tạo job agent không deploy ARM. Thứ tự phải là pipeline → task → parameters.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ARM template\" + GitHub + deploy resources → release pipeline, Resource Group Deployment task, set parameters.\n",
    "boxes": {
      "1": {
        "answer": "Create a release pipeline."
      },
      "2": {
        "answer": "Add an Azure Resource Group Deployment task."
      },
      "3": {
        "answer": "Set the template parameters."
      }
    },
    "answerText": "Create a release pipeline., Add an Azure Resource Group Deployment task., Set the template parameters."
  },
  "420": {
    "stem": "Project Azure DevOps có release pipeline và Git repository. Commit revision mới thì trigger build và release.\nCần thông tin release được gắn tự động vào work items liên kết Git commit.\nBạn nên làm gì?",
    "options": {
      "A": "Modify the Integrations options for the pipeline.",
      "B": "Modify the post-deployment conditions for the last stage of the pipeline.",
      "C": "Add an agentless job to the pipeline.",
      "D": "Modify the service hooks for the project."
    },
    "explanation": "Đáp án: A — Modify the Integrations options for the pipeline\n\nĐề bài: mỗi commit vừa build vừa release. Thông tin release phải tự gắn vào work items đã liên kết Git commit (ví dụ #123 trong message).\n\nTrong classic release pipeline, mục Integrations có tùy chọn tự liên kết work items với release. Bật tùy chọn đó thì hệ thống đọc commit của bản phát hành và ghi deployment/release lên work item trên Boards.\n\nB (post-deployment conditions) là gate/approval sau khi deploy, không gắn release vào work item. C (agentless job) chạy REST hoặc chờ duyệt, không bật linking. D (service hooks) đẩy sự kiện ra hệ thống ngoài, không ghi release lên Boards.\n\nKeywords phản xạ nhanh (AZ-400)\n\"release information\" + \"work items\" + Git commit → Integrations options for the pipeline.\n",
    "answerText": "A"
  },
  "421": {
    "stem": "SIMULATION — Định thêm web farm publish bằng IP 10.0.0.5. Cần cho phép traffic từ web farm tới Azure Database for MySQL server az400-123456789-mysql.\nĐăng nhập Microsoft Azure portal.",
    "explanation": "Đề bài: web farm mới publish bằng IP 10.0.0.5 phải gọi được Azure Database for MySQL az400-123456789-mysql.\n\nCần server-level firewall rule cho đúng một IP đó.\n\nPortal → Azure Database for MySQL → az400-123456789-mysql → Networking / Connection security. Thêm rule: Start IP = End IP = 10.0.0.5. Save và đợi cập nhật xong.\n\nRule chỉ mở mạng; ứng dụng vẫn phải có username/password (hoặc identity) hợp lệ.\n\nKeywords phản xạ nhanh (AZ-400)\n\"allow traffic\" + MySQL + specific IP → server-level firewall rule (Start IP = End IP).\n",
    "answerText": "Firewall rule 10.0.0.5 trên Azure Database for MySQL az400-123456789-mysql."
  },
  "422": {
    "stem": "Công ty có release pipeline trên Azure DevOps. Định deploy lên AKS bằng Helm package and deploy task.\nCần cài một service trong AKS namespace cho deployment đó.\nNên cài service nào?",
    "options": {
      "A": "Azure Container Registry",
      "B": "Chart",
      "C": "Kubectl",
      "D": "Tiller"
    },
    "explanation": "Đáp án: D — Tiller\n\nĐề bài: release pipeline dùng Helm package and deploy task lên AKS. Cần cài một “service” trong namespace của cluster cho việc đó. Exam theo Helm 2.\n\nHelm 2 gồm client và Tiller (process trong cluster). Task Azure DevOps nói chuyện với Tiller để render chart và apply manifest. Thiếu Tiller trong namespace thì deploy không chạy.\n\nA (ACR) là registry image, không cài trong namespace AKS. B (Chart) là gói ứng dụng, không phải service trên cluster. C (kubectl) là công cụ dòng lệnh trên máy/agent, không phải service in-cluster.\n\nHelm 3 đã bỏ Tiller; đáp án đề này vẫn là Tiller.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Helm package and deploy\" + \"service in the AKS namespace\" → Tiller (Helm 2).\n",
    "answerText": "D"
  },
  "423": {
    "stem": "SIMULATION — Tạo virtual machine template trong Azure DevTest Labs az400-123456789-dtl1, dựa trên Windows Server 2019 Datacenter. VM tạo từ template phải có Selenium và Google Chrome.\nĐăng nhập Microsoft Azure portal.",
    "explanation": "Đề bài: tạo VM template trong DevTest Labs az400-123456789-dtl1, base Windows Server 2019 Datacenter, VM sinh ra phải có Selenium và Google Chrome.\n\nTemplate trong lab là Formula (hoặc Custom image) gồm base image + artifacts.\n\nPortal → DevTest Labs → az400-123456789-dtl1 → Formulas (hoặc tạo một VM rồi lưu Custom image). Chọn base Windows Server 2019 Datacenter, thêm artifacts Google Chrome và Selenium, Save.\n\nVM tạo từ formula/image này đã có sẵn hai tool, không cài tay từng máy.\n\nKeywords phản xạ nhanh (AZ-400)\nDevTest Labs + VM template + Selenium + Chrome → Formula/custom image + artifacts.\n",
    "answerText": "Formula/custom image WS2019 Datacenter + artifacts Google Chrome và Selenium trên lab az400-123456789-dtl1."
  },
  "424": {
    "stem": "Bạn đang cấu hình release pipeline trên Azure DevOps như exhibit.\nDùng drop-down chọn đáp án cho từng câu theo hình.",
    "explanation": "Đề bài dựa trên sơ đồ release pipeline.\n\nCâu 1 — bao nhiêu stage có trigger: 7. Trên exhibit, Development, QA, Pre-prod, Production, Stakeholder Review, Load test và Internal Review đều có icon tia sét (after release hoặc after stage). Đếm đủ bảy stage.\n\nCâu 2 — bật continuous delivery: sửa Web Application artifact. CD nghĩa là mỗi khi có artifact/build mới thì tạo release. Exhibit ghi Schedule not set trên artifact; phải bật Continuous deployment trigger ở artifact. Sửa từng stage chỉ đổi thứ tự/approval, không tự tạo release khi có build mới.\n\nKeywords phản xạ nhanh (AZ-400)\nRelease exhibit: count stage trigger icons; \"continuous delivery\" → artifact CD trigger.\n",
    "boxes": {
      "1": {
        "label": "How many stages have triggers set?",
        "answer": "7"
      },
      "2": {
        "label": "Which component should you modify to enable continuous delivery?",
        "answer": "The Web Application artifact"
      }
    },
    "answerText": "7, The Web Application artifact"
  },
  "425": {
    "stem": "Công ty định deploy app tới:\n• 10 VM trên Azure\n• 10 VM on-premises datacenter\nMọi VM đã có Azure Pipelines agent.\nCần release strategy cho các endpoint. Kéo component phù hợp tới từng nhóm.",
    "explanation": "Đáp án: A deployment group cho cả hai nhóm máy\n\nĐề bài: 10 VM Azure và 10 VM on-premises, tất cả đã cài Azure Pipelines agent. Cần cách deploy app tới từng nhóm.\n\nDeployment group là tập máy đã đăng ký agent. Release job đẩy song song hoặc rolling tới từng máy. Máy nằm trên Azure hay trong datacenter đều dùng cùng cơ chế — miễn có agent.\n\nManagement group và resource group là phạm vi Azure (policy/billing/ARM), không nhắm agent on-prem. Application roles không phải đích deploy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure VMs\" + \"on-premises VMs\" + Pipelines agent → Deployment group (both).\n",
    "boxes": {
      "1": {
        "label": "Ten virtual machines hosted in Azure:",
        "answer": "A deployment group"
      },
      "2": {
        "label": "Ten virtual machines hosted in an on-premises data center environment:",
        "answer": "A deployment group"
      }
    },
    "answerText": "A deployment group, A deployment group"
  },
  "426": {
    "stem": "Bạn định dùng Terraform để deploy Azure resource group từ máy Windows.\nCần cài các framework hỗ trợ việc deploy này.\nHai framework nào nên cài? (Mỗi đáp án đúng là một phần giải pháp.)",
    "options": {
      "A": "Vault",
      "B": "Terratest",
      "C": "Node.js",
      "D": "Yeoman",
      "E": "Tiller"
    },
    "explanation": "Đáp án: B và D — Terratest, Yeoman\n\nĐề bài: trên máy Windows, dùng Terraform để deploy Azure resource group; cần cài framework hỗ trợ.\n\nTheo đáp án exam Microsoft: Yeoman (generator Azure/Terraform) để scaffold project Terraform; Terratest (thư viện Go) để viết test tự động cho cấu hình Terraform.\n\nVault lưu secret, không phải framework tạo/chạy Terraform. Node.js không bắt buộc để chạy Terraform. Tiller thuộc Helm 2, không liên quan Terraform.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Terraform\" + \"Windows\" + required frameworks → Yeoman + Terratest.\n",
    "answerText": "B,D"
  },
  "427": {
    "stem": "SIMULATION — Định triển khai CI/CD cho Azure Web App az400-123456789-main.\nCần cấu hình môi trường staging cho az400-123456789-main.\nĐăng nhập Microsoft Azure portal.",
    "explanation": "Đề bài: CI/CD cho web app az400-123456789-main, cần môi trường staging.\n\nTrên App Service, staging = deployment slot.\n\nPortal → App Services → az400-123456789-main → Deployment slots → Add Slot. Đặt tên staging, clone settings từ production nếu cần, Add.\n\nDeploy bản mới lên slot staging, kiểm tra, rồi swap sang production.\n\nKeywords phản xạ nhanh (AZ-400)\n\"staging environment\" + Azure Web App + CI/CD → Deployment slot named staging.\n",
    "answerText": "App Service deployment slot named staging for az400-123456789-main"
  },
  "428": {
    "stem": "SIMULATION — Nhiều app dùng Azure SQL Database db1.\nCần Azure tự tune query theo thời gian, chỉ áp dụng cho db1.\nĐăng nhập Microsoft Azure portal.",
    "explanation": "Đề bài: nhiều app dùng chung Azure SQL Database db1. Azure phải tự tune query theo thời gian, và chỉ áp dụng cho db1 (không kéo theo database khác).\n\nBật Automatic tuning ở cấp database trên db1, tắt Inherit from server nếu không muốn theo setting server.\n\nPortal → SQL databases → db1 → Automatic tuning. Inherit = Off. Bật FORCE PLAN / CREATE INDEX / DROP INDEX (hoặc Desired state On) → Apply.\n\nChỉ db1 được Azure điều chỉnh kế hoạch/index; database khác trên server không đổi.\n\nKeywords phản xạ nhanh (AZ-400)\n\"queries tuned by Azure\" + \"only apply to db1\" → Automatic tuning at database level (inherit off).\n",
    "answerText": "Automatic tuning on db1 only (database-level, inherit off)"
  },
  "429": {
    "stem": "Bạn dùng Azure Pipelines để quản lý build và deployment.\nĐang lập release strategy cho app mới. Chọn strategy cho từng kịch bản:\n• Release đưa tới user được nhóm theo mức chịu lỗi phần mềm.\n• Code được deploy để bật chức năng sẽ có ở release sau.\n• Khi có release mới, deployment cũ vẫn chạy để rollback nhanh.",
    "explanation": "Đề bài chọn release strategy cho ba tình huống.\n\nRelease đưa cho user theo mức chịu lỗi (ring/canary) → Progressive exposure. Bạn mở dần từng nhóm, giới hạn blast radius.\n\nCode đã deploy nhưng chức năng chỉ bật ở release sau → Feature flags. Flag ẩn/hiện tính năng mà không cần deploy lại.\n\nKhi bản mới lên, bản cũ vẫn chạy để rollback nhanh → Blue/green. Bản green đứng cạnh blue; lỗi thì trỏ traffic về blue, user hầu như không downtime.\n\nKeywords phản xạ nhanh (AZ-400)\nUsers by fault tolerance → Progressive exposure; later-release features → Feature flags; keep old deploy → Blue/green.\n",
    "boxes": {
      "1": {
        "label": "Releases will be made available to users who are grouped by their tolerance for software faults:",
        "answer": "Progressive exposure"
      },
      "2": {
        "label": "Code will be deployed to enable functionality that will be available in later releases of the app:",
        "answer": "Feature flags"
      },
      "3": {
        "label": "When a new release occurs, the existing deployment will remain active to minimize recovery time if a return to the previous version is required:",
        "answer": "Blue/green"
      }
    },
    "answerText": "Progressive exposure, Feature flags, Blue/green"
  },
  "430": {
    "stem": "Bạn có project trên Azure DevOps.\nCần gắn automated test vào test case.\nBa hành động nào, theo thứ tự? Kéo action vào answer area.",
    "explanation": "Đề bài: gắn automated test với test case trên Azure DevOps. Ba bước theo thứ tự Microsoft.\n\n1. Create a test project — project chứa test tự động (MSTest, xUnit, …).\n\n2. Check in vào Azure DevOps repository — associate cần test nằm trên repo Azure DevOps/TFS.\n\n3. Add the automated test to a build pipeline — build phải chạy test đó. Sau đó Visual Studio gắn test với test case trong test plan dùng đúng build.\n\nDebug project hoặc tạo work item không phải bước associate.\n\nKeywords phản xạ nhanh (AZ-400)\n\"associate an automated test to a test case\" → test project, check in, add test to build pipeline.\n",
    "boxes": {
      "1": {
        "label": "Box 1",
        "answer": "Create a test project"
      },
      "2": {
        "label": "Box 2",
        "answer": "Check in a project to the Azure DevOps repository"
      },
      "3": {
        "label": "Zone 3",
        "answer": "Add the automated test to a build pipeline"
      }
    },
    "answerText": "Create a test project, Check in a project to the Azure DevOps repository, Add the automated test to a build pipeline"
  },
  "431": {
    "stem": "Bạn có cluster Azure Kubernetes Service (AKS). Cần deploy ứng dụng lên cluster bằng Azure DevOps.\nBa hành động nào, theo thứ tự? Kéo action vào answer area.",
    "explanation": "Đề bài: deploy app lên AKS bằng Azure DevOps. Ba bước theo thứ tự.\n\n1. Tạo service principal trong Azure AD — identity để pipeline đẩy image lên ACR và gọi AKS.\n\n2. Cấu hình RBAC trên cluster — gán quyền cho identity đó (ví dụ deploy vào namespace).\n\n3. Thêm Helm package and deploy task vào deployment pipeline — task đóng gói chart và cài lên AKS.\n\nTạo service account trong cluster không thay service principal Azure AD cho pipeline. Task Function App for Container hoặc Docker Compose không phải đường Helm chuẩn của đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"deploy to AKS\" + Azure DevOps → Service principal, cluster RBAC, Helm package and deploy task.\n",
    "boxes": {
      "1": {
        "label": "Step 1",
        "answer": "Create a service principal in Azure Active Directory (Azure AD)."
      },
      "2": {
        "label": "Step 2",
        "answer": "Configure RBAC roles in the cluster."
      },
      "3": {
        "label": "Step 3",
        "answer": "Add a Helm package and deploy a task to the deployment pipeline."
      }
    },
    "answerText": "Create a service principal in Azure Active Directory (Azure AD)., Configure RBAC roles in the cluster., Add a Helm package and deploy a task to the deployment pipeline."
  },
  "432": {
    "stem": "Lưu ý: Câu hỏi này thuộc một nhóm câu có cùng bối cảnh nhưng mỗi câu có kết quả riêng. Xác định giải pháp có đáp ứng yêu cầu không.\n\nQuy trình phê duyệt yêu cầu team leader approve release trước khi deploy.\nPolicy: approval phải xong trong tám giờ.\nThực tế deployment fail nếu approval quá hai giờ.\nCần deployment chỉ fail khi approval quá tám giờ.\nGiải pháp: Trong Post-deployment conditions, sửa Time between re-evaluation of gates.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng kịch bản: team leader phải approve trước khi deploy; policy cho 8 giờ; thực tế fail sau 2 giờ. Cần fail chỉ khi quá 8 giờ.\n\nGiải pháp sửa Time between re-evaluation of gates ở Post-deployment conditions. Setting này chỉ là chu kỳ kiểm lại gate sau khi stage đã deploy xong, không phải thời gian chờ người approve trước deploy.\n\nPhải sửa Timeout của pre-deployment approvals thành 8 giờ. Giải pháp này không đáp ứng mục tiêu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"approvals within eight hours\" + Post-deployment gates re-evaluation → No.\n",
    "answerText": "B"
  },
  "433": {
    "stem": "Lưu ý: Câu hỏi này thuộc một nhóm câu có cùng bối cảnh nhưng mỗi câu có kết quả riêng. Xác định giải pháp có đáp ứng yêu cầu không.\n\nQuy trình phê duyệt yêu cầu team leader approve release trước khi deploy.\nPolicy: approval phải xong trong tám giờ.\nThực tế deployment fail nếu approval quá hai giờ.\nCần deployment chỉ fail khi approval quá tám giờ.\nGiải pháp: Trong Pre-deployment conditions, sửa Time between re-evaluation of gates.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng kịch bản approval 8 giờ, đang fail sau 2 giờ.\n\nGiải pháp sửa Time between re-evaluation of gates ở Pre-deployment conditions. Đó là tần suất chạy lại các gate tự động (health check, query), không phải hạn chờ team leader bấm Approve.\n\nFail sau 2 giờ vì Timeout của approval quá ngắn. Phải đổi Timeout, không đổi interval re-eval. Giải pháp không đáp ứng.\n\nKeywords phản xạ nhanh (AZ-400)\n\"approvals within eight hours\" + Pre-deployment gates re-evaluation → No.\n",
    "answerText": "B"
  },
  "434": {
    "stem": "Lưu ý: Câu hỏi này thuộc một nhóm câu có cùng bối cảnh nhưng mỗi câu có kết quả riêng. Xác định giải pháp có đáp ứng yêu cầu không.\n\nQuy trình phê duyệt yêu cầu team leader approve release trước khi deploy.\nPolicy: approval phải xong trong tám giờ.\nThực tế deployment fail nếu approval quá hai giờ.\nCần deployment chỉ fail khi approval quá tám giờ.\nGiải pháp: Trong Pre-deployment conditions, sửa Timeout của pre-deployment approvals.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: A — Yes\n\nCùng kịch bản: approval trước deploy, policy 8 giờ, hiện fail sau 2 giờ.\n\nGiải pháp sửa Timeout của pre-deployment approvals. Đây đúng chỗ pipeline chờ team leader. Đổi Timeout từ 2 giờ thành 8 giờ thì deployment chỉ bị hủy khi không ai approve trong 8 giờ — khớp policy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"approvals within eight hours\" + Pre-deployment Timeout for approvals → Yes.\n",
    "answerText": "A"
  },
  "435": {
    "stem": "Bạn đang định nghĩa release strategy cho hai ứng dụng (xem bảng).\nGắn strategy phù hợp cho từng app. Mỗi strategy dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đề bài (bảng): App1 lỗi thì impact lớn, chỉ nhóm user opt-in được nhận bản mới. App2 cần deploy nhanh và rollback càng nhanh càng tốt.\n\nApp1 → Canary deployment. Đưa bản mới cho một nhóm nhỏ, quan sát, rồi mới nới thêm. Giảm blast radius khi app quan trọng.\n\nApp2 → Blue/Green deployment. Hai môi trường song song, đổi traffic khi sẵn sàng; rollback là đổi traffic ngược lại — nhanh hơn rolling từng máy.\n\nRolling deployment không phải đáp án cho hai ô này.\n\nKeywords phản xạ nhanh (AZ-400)\nHigh impact + small opt-in testers → Canary; fastest deploy + rollback → Blue/Green.\n",
    "boxes": {
      "1": {
        "label": "App1:",
        "answer": "Canary deployment"
      },
      "2": {
        "label": "App2:",
        "answer": "Blue/Green deployment"
      }
    },
    "answerText": "Canary deployment, Blue/Green deployment"
  },
  "436": {
    "stem": "Lưu ý: Câu hỏi này thuộc một nhóm câu có cùng bối cảnh nhưng mỗi câu có kết quả riêng. Xác định giải pháp có đáp ứng yêu cầu không.\n\nQuy trình phê duyệt yêu cầu team leader approve release trước khi deploy.\nPolicy: approval phải xong trong tám giờ.\nThực tế deployment fail nếu approval quá hai giờ.\nCần deployment chỉ fail khi approval quá tám giờ.\nGiải pháp: Trong Post-deployment conditions, sửa Timeout của post-deployment approvals.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nCùng kịch bản: team leader approve trước khi deploy.\n\nGiải pháp sửa Timeout của post-deployment approvals. Post-deployment xảy ra sau khi stage đã deploy xong (ví dụ sign-off sau go-live). Nó không kéo thời gian chờ approval trước deploy.\n\nTimeout cần sửa nằm ở Pre-deployment conditions. Giải pháp không đáp ứng.\n\nKeywords phản xạ nhanh (AZ-400)\n\"approvals before deploy\" + Post-deployment approval Timeout → No.\n",
    "answerText": "B"
  },
  "437": {
    "stem": "Bạn có Azure DevOps organization Contoso và 10 Azure VM Windows Server 2019 host app build/deploy bằng Azure Pipelines.\nMỗi VM đã cài Web Server (IIS).\nCần duy trì cấu hình web server tự động, quản lý tập trung, giảm overhead.\nBốn hành động nào, theo thứ tự?",
    "explanation": "Đề bài: 10 VM Windows Server 2019 đã có IIS, app deploy bằng Azure Pipelines. Cần giữ cấu hình web server tự động, quản lý tập trung, ít overhead. Đó là Azure Automation State Configuration (DSC).\n\nThứ tự:\n\n1. Create an Azure Automation account — nơi lưu configuration và pull server.\n\n2. Install DSC extension trên các VM — extension đăng ký máy với Automation.\n\n3. Onboard các VM vào Automation account — máy trở thành node.\n\n4. Compile DSC configuration — ra MOF rồi gán cho node; LCM áp dụng IIS/settings.\n\nUpload zip lên Blob không phải luồng Automation DSC chuẩn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"web server configuration maintained automatically\" + DSC → Automation account, DSC extension, onboard, compile.\n",
    "boxes": {
      "1": {
        "label": "Step1",
        "answer": "Create an Azure Automation account"
      },
      "2": {
        "label": "Step 2",
        "answer": "Install the custom Desired State Configuration (DSC) extension on the virtual machines"
      },
      "3": {
        "label": "Step 3",
        "answer": "Onboard the virtual machines to the Azure Automation account"
      },
      "4": {
        "label": "Step 4",
        "answer": "Compile the Desired State Configuration (DSC) configuration"
      }
    },
    "answerText": "Create an Azure Automation account, Install the custom Desired State Configuration (DSC) extension on the virtual machines, Onboard the virtual machines to the Azure Automation account, Compile the Desired State Configuration (DSC) configuration"
  },
  "438": {
    "stem": "Bạn dùng Azure DevOps organization Contoso (free tier) với 10 private project. Mỗi project có nhiều job không phụ thuộc nhau.\nBuild cần file trên on-premises file system. Bạn thường chạy job trên năm self-hosted agent nhưng build lâu và hay bị queued.\nCần giảm số build queued và thời gian chạy build. Nên làm gì?",
    "options": {
      "A": "Configure the pipelines to use the Microsoft-hosted agents.",
      "B": "Register additional self-hosted agents.",
      "C": "Purchase self-hosted parallel jobs.",
      "D": "Purchase Microsoft-hosted parallel jobs."
    },
    "explanation": "Đáp án: C — Purchase self-hosted parallel jobs\n\nĐề bài: organization free, 10 private project, job không phụ thuộc nhau, build cần file trên file system on-premises. Đã có năm self-hosted agent nhưng vẫn queue lâu.\n\nFree private mặc định chỉ 1 self-hosted parallel job: dù có năm máy, cùng lúc chỉ một job chạy. Mua thêm self-hosted parallel jobs thì các agent chạy song song, vẫn truy cập được file on-prem.\n\nA và D (Microsoft-hosted) không thấy file share sau firewall/on-prem. B (thêm agent) không tăng số job chạy đồng thời nếu chưa mua parallel job.\n\nKeywords phản xạ nhanh (AZ-400)\n\"self-hosted\" + \"queued builds\" + on-prem files + free org → Purchase self-hosted parallel jobs.\n",
    "answerText": "C"
  },
  "439": {
    "stem": "SIMULATION — Cần Azure web app az400-123456789-main hỗ trợ rolling upgrades. Chỉ 10 percent user kết nối bản update. Giảm tối đa công sức quản trị.\nĐăng nhập Microsoft Azure portal.",
    "explanation": "Đề bài: web app az400-123456789-main hỗ trợ rolling upgrades; chỉ 10% user dùng bản update; ít công quản trị.\n\nCách ít bước nhất: thêm deployment slot rồi chia Traffic % = 10.\n\nPortal → App Service → Deployment slots → Add Slot. Trên trang slots, đặt Traffic % của slot mới = 10 (90% vẫn production). Không cần Traffic Manager hay tự dựng load balancer.\n\nKeywords phản xạ nhanh (AZ-400)\n\"rolling upgrades\" + \"10 percent of users\" → Deployment slot Traffic % = 10.\n",
    "answerText": "Deployment slot with Traffic % = 10 for az400-123456789-main"
  },
  "440": {
    "stem": "Bạn có Azure DevOps project Project1 và subscription Sub1 chứa Azure SQL database DB1.\nCần release pipeline dùng Azure SQL Database Deployment task để update DB1.\nNên deploy artifact nào?",
    "options": {
      "A": "a BACPAC",
      "B": "a DACPAC",
      "C": "an LDF file",
      "D": "an MDF file"
    },
    "explanation": "Đáp án: B — a DACPAC\n\nĐề bài: release pipeline dùng task Azure SQL Database Deployment để cập nhật DB1.\n\nTask này nhận Data-tier Application package (DACPAC): schema, procedure, view. Đó là artifact chuẩn để nâng cấp database có kiểm soát.\n\nBACPAC dùng để export/import cả dữ liệu (migrate/backup), không phải input chuẩn của task này. LDF và MDF là file đĩa của SQL Server, không deploy qua pipeline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure SQL Database Deployment task\" → DACPAC (not BACPAC/MDF/LDF).\n",
    "answerText": "B"
  },
  "441": {
    "stem": "Bạn có project Azure DevOps.\nĐịnh tạo build pipeline deploy bằng Azure Resource Manager templates. Template tham chiếu secret trong Azure Key Vault.\nCần sinh động resource ID của key vault lúc deploy template.\nNên đưa gì vào template? Chọn option trong answer area.",
    "explanation": "Đề bài: ARM template lấy secret Key Vault, nhưng resource ID của vault phải sinh lúc deploy (không hard-code).\n\nÔ type: Microsoft.Resources/deployments — nested/linked deployment. Pattern Microsoft: deployment con nhận vault ID được tính động rồi reference secret.\n\nÔ properties: templateLink — template cha trỏ linked template và truyền parameter chứa resource ID vừa sinh.\n\nMicrosoft.KeyVault/vaults chỉ khai báo tạo vault, không phải pattern “secret ID động”. Property tên deployment hay template không đúng chỗ templateLink.\n\nKeywords phản xạ nhanh (AZ-400)\n\"dynamically generate\" + Key Vault resource ID + ARM → Microsoft.Resources/deployments + templateLink.\n",
    "boxes": {
      "1": {
        "label": "type",
        "answer": "Microsoft.Resources/deployments"
      },
      "2": {
        "label": "properties",
        "answer": "templateLink"
      }
    },
    "answerText": "Microsoft.Resources/deployments, templateLink"
  },
  "442": {
    "stem": "Công ty có project Azure DevOps cho web application mới và dùng ServiceNow cho change management.\nCần change request được xử lý trước khi bất kỳ component nào deploy lên production.\nHai cách nào tích hợp ServiceNow vào Azure DevOps release pipeline? (Mỗi đáp án là một giải pháp đầy đủ.)",
    "options": {
      "A": "Define a deployment control that invokes the ServiceNow REST API.",
      "B": "Define a pre-deployment gate before the deployment to the Prod stage.",
      "C": "Define a deployment control that invokes the ServiceNow SOAP API.",
      "D": "Define a post-deployment gate after the deployment to the QA stage."
    },
    "explanation": "Đáp án: B và D\n\nĐề bài: công ty dùng ServiceNow change management. Phải xử lý change request trước khi bất kỳ component nào lên production. Hỏi hai cách tích hợp vào release pipeline (mỗi cách là một giải pháp đủ).\n\nB — Pre-deployment gate trước stage Prod: gate ServiceNow kiểm CR đã approved chưa; chưa đạt thì không deploy Prod. Đây là chặn trực tiếp trước production.\n\nD — Post-deployment gate sau stage QA: sau khi QA xong, gate xác nhận change/QA trước khi pipeline đi tiếp tới Prod. Cũng đảm bảo Prod không nhận bản chưa qua change process.\n\nA và C (deployment control gọi REST/SOAP) chạy trong lúc/sau deploy, không phải cổng chặn chuẩn trước Prod như gate.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ServiceNow\" + \"before production\" → Pre-deployment gate on Prod + post-deployment gate after QA.\n",
    "answerText": "B,D"
  },
  "443": {
    "stem": "Công ty phát triển App1 đang chạy production. Bản update thêm service mới cần gọi App2 vẫn đang development.\nCần deploy update App1 trước khi App2 sẵn sàng, rồi bật service khi App2 đã deploy. Nên làm gì?",
    "options": {
      "A": "Implement a feature flag.",
      "B": "Create a fork in the build.",
      "C": "Create a branch in the build.",
      "D": "Implement a branch policy."
    },
    "explanation": "Đáp án: A — Implement a feature flag\n\nĐề bài: App1 đang production, bản update thêm service gọi App2 vẫn đang dev. Phải deploy update App1 trước khi App2 sẵn sàng, rồi bật service khi App2 live.\n\nFeature flag bọc service mới: code lên production nhưng flag tắt. Khi App2 có mặt, bật flag — không cần deploy lại App1. Đó là tách deploy khỏi release.\n\nFork/branch chỉ tách source. Branch policy kiểm soát PR, không bật/tắt tính năng đã nằm trên production.\n\nKeywords phản xạ nhanh (AZ-400)\n\"deploy App1 before App2 is available\" + enable later → Feature flag.\n",
    "answerText": "A"
  },
  "444": {
    "stem": "Bạn có private distribution group gồm thiết bị đã provisioned và chưa provisioned.\nCần phân phối iOS application mới tới group bằng Microsoft Visual Studio App Center.\nNên làm gì?",
    "options": {
      "A": "Request the Apple ID associated with the user of each device.",
      "B": "Register the devices on the Apple Developer portal.",
      "C": "Create an active subscription in App Center Test.",
      "D": "Add the device owner to the organization in App Center."
    },
    "explanation": "Đáp án: B — Register the devices on the Apple Developer portal\n\nĐề bài: phát hành iOS app tới private distribution group có cả máy đã provisioned và chưa provisioned, dùng App Center.\n\niOS ngoài App Store chỉ cài được khi UDID máy nằm trong ad-hoc provisioning profile. Máy chưa provisioned chưa có UDID trên Apple Developer portal, nên bước bắt buộc là đăng ký thiết bị ở đó. App Center sau đó mới sign .ipa cho đúng danh sách máy.\n\nA: Apple ID của user không thay UDID trong provisioning profile.\nC: App Center Test là chạy UI test tự động, không phải phân phối bản cài.\nD: thêm owner vào organization chỉ cấp quyền portal, không làm máy cài được app.\n\nKeywords phản xạ nhanh (AZ-400)\n\"private distribution group\" + provisioned/unprovisioned iOS + App Center → Register devices on Apple Developer portal.\n",
    "answerText": "B"
  },
  "445": {
    "stem": "Bạn đang phát triển iOS application bằng Azure DevOps.\nCần test thủ công trên 10 thiết bị, không release công khai.\nHai hành động nào? (Mỗi đáp án là một phần giải pháp.)",
    "options": {
      "A": "Create a Microsoft Intune device compliance policy.",
      "B": "Deploy a certificate from an internal certification authority (CA) to each device.",
      "C": "Register the application in the iTunes store.",
      "D": "Onboard the devices into Microsoft Intune.",
      "E": "Distribute a new release of the application.",
      "F": "Register the IDs of the devices in the Apple Developer portal."
    },
    "explanation": "Đáp án: E, F\n\nĐề bài: test thủ công iOS app trên đúng 10 máy, không đưa app lên store công khai. Đây là ad-hoc distribution của Apple — cài .ipa ngoài App Store trên một danh sách máy đã được phép.\n\nF — Register the IDs of the devices in the Apple Developer portal: mỗi iPhone/iPad có UDID. Phải đăng ký 10 UDID đó trên Apple Developer portal rồi đưa vào ad-hoc provisioning profile. Thiếu bước này thì bản build không được phép cài trên máy tester.\n\nE — Distribute a new release of the application: sau khi profile đã chứa 10 máy, bạn build/sign .ipa rồi phát hành một release (App Center hoặc Azure DevOps) để tester cài. Đây là cách đưa app tới 10 máy mà không lên App Store.\n\nKhông chọn A và D: Intune (compliance policy, onboard) là MDM doanh nghiệp, không bắt buộc khi chỉ test 10 máy.\nKhông chọn B: iOS ad-hoc dùng chứng chỉ/signing của Apple, không phải certificate từ internal CA.\nKhông chọn C: đăng ký trên iTunes/App Store là phát hành công khai — trái yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"test manually\" + \"10 devices\" + \"without releasing to the public\" → Register device IDs + Distribute a new release.\n",
    "answerText": "E,F"
  },
  "446": {
    "stem": "Bạn có private distribution group gồm thiết bị đã provisioned và chưa provisioned.\nCần phân phối iOS application mới tới group bằng Microsoft Visual Studio App Center.\nNên làm gì?",
    "options": {
      "A": "Select Register devices and sign my app.",
      "B": "Create an active subscription in App Center Test.",
      "C": "Create an unsigned build.",
      "D": "Add the device owner to the collaborators group."
    },
    "explanation": "Đáp án: A — Select Register devices and sign my app\n\nĐề bài giống tình huống private iOS: group có máy đã provisioned và chưa provisioned. Cần App Center vừa đăng ký máy thiếu, vừa sign lại app.\n\nChọn Register devices and sign my app: App Center lấy UDID các máy chưa đăng ký, đưa vào provisioning profile, rồi re-sign .ipa. Sau bước này cả hai loại máy trong group đều cài được release.\n\nB: App Center Test dùng để chạy UI test trên device farm, không phát hành app cho tester.\nC: unsigned build không cài được trên iOS.\nD: collaborator chỉ có quyền quản lý project trên portal, không đăng ký UDID hay sign app.\n\nKeywords phản xạ nhanh (AZ-400)\n\"provisioned and unprovisioned\" + iOS + App Center → Register devices and sign my app.\n",
    "answerText": "A"
  },
  "447": {
    "stem": "SIMULATION — Tạo Azure Traffic Manager profile az400123456789n1-tm trong resource group RG1lod123456789. User luôn kết nối bản website cùng country.",
    "explanation": "Đề bài: tạo Traffic Manager profile az400123456789n1-tm trong RG1lod123456789. User luôn tới bản website cùng quốc gia với họ.\n\nRouting method Geographic chọn endpoint theo quốc gia/vùng của DNS query — đúng “same country”.\n\nPortal → Create a resource → Traffic Manager profile. Name = az400123456789n1-tm, Routing method = Geographic, Resource group = RG1lod123456789 → Create.\n\nPerformance chọn endpoint trễ thấp, Priority/Weighted không map theo quốc gia.\n\nKeywords phản xạ nhanh (AZ-400)\n\"always connect\" + \"same country\" + Traffic Manager → Geographic routing.\n",
    "answerText": "Traffic Manager profile az400123456789n1-tm, Geographic routing, RG1lod123456789"
  },
  "448": {
    "stem": "Công ty có Bitbucket Server on-premises (Git), nằm sau firewall chặn inbound Internet.\nĐịnh dùng Azure DevOps quản lý build và release.\nHai thành phần nào bắt buộc để tích hợp Azure DevOps và Bitbucket? (Mỗi đáp án là một phần giải pháp.)",
    "options": {
      "A": "a deployment group",
      "B": "a Microsoft-hosted agent",
      "C": "service hooks",
      "D": "a self-hosted agent",
      "E": "an External Git service connection"
    },
    "explanation": "Đáp án: D và E\n\nĐề bài: Bitbucket Server on-premises (Git) sau firewall chặn inbound Internet. Azure DevOps phải build/release từ repo đó.\n\nE — External Git service connection: khai URL và credential để Azure DevOps biết cách gọi Bitbucket.\n\nD — Self-hosted agent: đặt trong mạng nội bộ, agent chủ động outbound tới Azure DevOps và clone Bitbucket trong LAN. Firewall không cần mở inbound từ Microsoft.\n\nB (Microsoft-hosted) nằm trên cloud, không vào được server bị chặn inbound. A (deployment group) là đích cài app, không phải cầu nối source. C (service hooks) thường cần Bitbucket gọi inbound ra Azure DevOps — bị firewall chặn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"on-premises Bitbucket\" + \"firewall blocks inbound\" → Self-hosted agent + External Git service connection.\n",
    "answerText": "D,E"
  },
  "449": {
    "stem": "Công ty dùng Git cho source control của app phức tạp App1.\nĐịnh thêm chức năng mới và cần branching model.\nBranch lifetime và branch type nào? Chọn option trong answer area.",
    "explanation": "Đề bài: thêm chức năng mới cho App1 trên Git; chọn branch lifetime và branch type.\n\nLifetime: Short-lived. Feature branch tồn tại đến khi merge xong, giảm lệch lâu ngày với main.\n\nType: Feature. Đúng loại nhánh để làm enhancement rồi merge về master/main.\n\nMaster và Integration là nhánh sống lâu (long-lived), không dùng làm nhánh một chức năng lẻ.\n\nKeywords phản xạ nhanh (AZ-400)\n\"new functionality\" + Git branching model → Short-lived + Feature.\n",
    "boxes": {
      "1": {
        "label": "Branch lifetime:",
        "answer": "Short-lived"
      },
      "2": {
        "label": "Branch type:",
        "answer": "Feature"
      }
    },
    "answerText": "Short-lived, Feature"
  },
  "450": {
    "stem": "Bạn có project Azure DevOps. Định deploy self-hosted agent bằng unattended configuration script.\nHai giá trị nào phải khai trong script? (Mỗi đáp án là một phần giải pháp.)",
    "options": {
      "A": "authorization credentials",
      "B": "the project name",
      "C": "the deployment group name",
      "D": "the organization URL",
      "E": "the agent pool name"
    },
    "explanation": "Đáp án: A và D\n\nĐề bài: cài self-hosted agent bằng unattended configuration script. Hỏi hai giá trị bắt buộc trong script.\n\nAgent phải biết tổ chức nào và chứng thực thế nào: --url (organization URL, ví dụ https://dev.azure.com/contoso) và authorization credentials (thường là PAT / --auth --token).\n\nTên project không dùng lúc đăng ký agent (agent thuộc organization/pool). Tên deployment group chỉ khi agent vào deployment group. Tên pool có thể thêm nhưng exam coi URL + credentials là hai thứ tối thiểu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Self-hosted agent\" + \"unattended configuration script\" → Organization URL + Authorization credentials (PAT).\n",
    "answerText": "A,D"
  },
  "451": {
    "stem": "Bạn có Azure virtual machine Linux VM1.\nĐịnh deploy Desired State Configuration (DSC) extension lên VM1.\nCần cấp quyền thư mục phù hợp cho Log Analytics agent.\nHoàn thành lệnh thế nào?",
    "explanation": "Đáp án: rwx, /tmp\n\nĐề bài: Linux VM1 sẽ nhận Desired State Configuration (DSC) extension. Cần cấp quyền thư mục đúng cho Log Analytics agent (user omsagent) rồi hoàn thành lệnh setfacl.\n\nDSC trên Linux dùng thư mục /tmp khi compile và apply configuration. Agent chạy dưới user omsagent nên cần quyền đọc, ghi và thực thi trên /tmp. Lệnh đúng là setfacl -m u:omsagent:rwx /tmp.\n\nChỉ cấp r hoặc rx thì omsagent không ghi được file tạm của DSC. Không cấp ACL trên /lib, /etc hay /usr: đó không phải working directory của DSC trên Linux và mở rộng quyền hệ thống ngoài yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"DSC extension\" + Linux + omsagent → setfacl u:omsagent:rwx /tmp.\n",
    "boxes": {
      "1": {
        "label": "setfacl -m u:omsagent:",
        "answer": "rwx"
      },
      "2": {
        "label": "setfacl -m u:omsagent:",
        "answer": "/tmp"
      }
    },
    "answerText": "rwx, /tmp"
  },
  "452": {
    "stem": "Bạn dùng PowerShell quản trị Azure Log Analytics workspaces.\nCần liệt kê workspace và properties.\nHoàn thành lệnh thế nào?",
    "explanation": "Đáp án: Get-AzResource, -ResourceType\n\nĐề bài: dùng PowerShell liệt kê mọi Azure Log Analytics workspace trong subscription kèm properties.\n\nGet-AzResource liệt kê resource Azure. Kết hợp -ResourceType Microsoft.OperationalInsights/workspaces để chỉ lấy workspace, rồi -ExpandProperties để đọc thuộc tính (ví dụ access control mode).\n\nGet-AzResourceGroup chỉ trả resource group, không có workspace. Get-AzResourceProvider mô tả provider, không phải instance. -ResourceGroupName hoặc -ResourceId thu hẹp một nhóm hoặc một resource, không list toàn subscription như đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"list Log Analytics workspaces\" + PowerShell → Get-AzResource -ResourceType Microsoft.OperationalInsights/workspaces.\n",
    "boxes": {
      "1": {
        "label": "Microsoft.OperationalInsights/workspaces -ExpandProperties",
        "answer": "Get-AzResource"
      },
      "2": {
        "label": "Microsoft.OperationalInsights/workspaces -ExpandProperties",
        "answer": "-ResourceType"
      }
    },
    "answerText": "Get-AzResource, -ResourceType"
  },
  "453": {
    "stem": "Bạn tích hợp Azure Pipelines với GitHub làm source repository. Build pipeline đã bật continuous integration.\nĐịnh trigger build tự động khi có commit, nhưng hệ thống phải đợi build hiện tại xong rồi mới queue build khác.\nNên implement gì?",
    "options": {
      "A": "path filters",
      "B": "batch changes",
      "C": "scheduled builds",
      "D": "branch filters"
    },
    "explanation": "Đáp án: B — batch changes\n\nĐề bài: Azure Pipelines tích hợp GitHub, đã bật continuous integration. Cần đợi build hiện tại xong rồi mới queue build khác, không xếp nhiều run chồng lên nhau.\n\nBatch changes (batch: true trên CI trigger) giữ một run đang chạy. Các commit đẩy vào trong lúc đó được gộp; khi run hiện tại xong, pipeline chỉ queue thêm một build cho nhóm thay đổi đó. Đúng yêu cầu “wait until a build completes before queuing another build”.\n\nPath filters chỉ kích hoạt khi đổi file/thư mục nhất định, không điều khiển hàng đợi. Branch filters giới hạn nhánh, không gộp commit khi đang build. Scheduled builds chạy theo lịch, không theo từng commit CI.\n\nKeywords phản xạ nhanh (AZ-400)\n\"wait until a build completes\" + CI → batch changes.\n",
    "answerText": "B"
  },
  "454": {
    "stem": "Bạn dùng GitHub làm source repository. Đã tạo client-side Git hook trên sự kiện commit-msg, yêu cầu mỗi commit message có custom work item tag.\nCần commit không có work item tag. Dùng git commit parameter nào?",
    "options": {
      "A": "--squash",
      "B": "--no-verify",
      "C": "--message ''",
      "D": "--no-post-rewrite"
    },
    "explanation": "Đáp án: B — --no-verify\n\nĐề bài: client-side Git hook trên sự kiện commit-msg bắt buộc commit message có work item tag. Cần commit một lần mà không có tag đó.\n\ngit commit --no-verify bỏ qua hook pre-commit và commit-msg trên máy local. Hook kiểm tra tag không chạy nên commit vẫn được tạo.\n\n--squash dùng khi gộp nhiều commit, không tắt hook. --message '' vẫn chạy commit-msg; hook thường từ chối vì thiếu tag. --no-post-rewrite liên quan rewrite (rebase/amend), không bypass commit-msg lúc commit thường.\n\nKeywords phản xạ nhanh (AZ-400)\n\"commit-msg hook\" + skip validation → git commit --no-verify.\n",
    "answerText": "B"
  },
  "455": {
    "stem": "Bạn có private distribution group gồm thiết bị đã provisioned và chưa provisioned.\nCần phân phối iOS application mới tới group bằng Microsoft Visual Studio App Center.\nNên làm gì?",
    "options": {
      "A": "Select Register devices and sign my app.",
      "B": "Create an active subscription in App Center Test.",
      "C": "Add the device owner to the organization in App Center.",
      "D": "Create an unsigned build."
    },
    "explanation": "Đáp án: A — Select Register devices and sign my app\n\nĐề bài: private distribution group trên Visual Studio App Center gồm cả máy đã provisioned và chưa provisioned. Cần phát iOS app mới cho group đó.\n\nAd hoc iOS chỉ cài được khi UDID nằm trong provisioning profile và binary được sign. “Register devices and sign my app” đăng ký thiết bị (kể cả unprovisioned) rồi re-sign app với profile mới. Đó là luồng App Center cho private group.\n\nApp Center Test subscription phục vụ UI test trên device farm, không phát hành ad hoc. Thêm device owner vào organization chỉ cấp quyền portal, không đăng ký UDID. Unsigned build không cài được trên iOS.\n\nKeywords phản xạ nhanh (AZ-400)\n\"private distribution group\" + iOS App Center → Register devices and sign my app.\n",
    "answerText": "A"
  },
  "456": {
    "stem": "Cần deploy Internet Information Services (IIS) lên Azure virtual machine Windows Server 2019.\nHoàn thành Desired State Configuration (DSC) script. Kéo giá trị vào vị trí đúng.",
    "explanation": "Đáp án: Configuration, WindowsFeature\n\nĐề bài: hoàn thành script Desired State Configuration (DSC) để cài Internet Information Services (IIS) trên Azure VM Windows Server 2019.\n\nKhối ngoài cùng của file DSC phải là Configuration <Tên> { ... }. Bên trong Node, resource WindowsFeature (Name = \"Web-Server\", Ensure = \"Present\") cài role IIS. Đó là resource chuẩn để thêm Windows role/feature.\n\nDependsOn chỉ thứ tự giữa resource, không thay keyword Configuration. File quản lý file/thư mục, không cài IIS. IncludeAllSubFeature là thuộc tính tùy chọn của WindowsFeature, không phải resource thay thế.\n\nKeywords phản xạ nhanh (AZ-400)\n\"DSC\" + install IIS → Configuration + WindowsFeature Web-Server.\n",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Configuration"
      },
      "2": {
        "label": "Zone 2",
        "answer": "WindowsFeature"
      }
    },
    "answerText": "Configuration, WindowsFeature"
  },
  "457": {
    "stem": "Bạn định dùng Desired State Configuration (DSC) duy trì cấu hình server Windows Server 2019.\nServer phải có:\n• A web server\n• An email server\nHoàn thành DSC configuration file. Chọn option trong answer area.",
    "explanation": "Đáp án: Name = @(\"SMTP-Server\"; \"Web-Server\"), Ensure = 'Present'\n\nĐề bài: DSC trên Windows Server 2019 phải cài web server và email server. Cần điền Name và property đứng trước = 'Present'.\n\nWindowsFeature / WindowsFeatureSet dùng tên feature của Windows: Web-Server là IIS, SMTP-Server là SMTP/email. Mảng @(\"SMTP-Server\"; \"Web-Server\") đúng cả hai yêu cầu. Property Ensure = 'Present' bảo LCM cài và giữ feature.\n\nMail-Server và IIS không phải Name hợp lệ trên Get-WindowsFeature. Install, Enforce, Required không phải property DSC cho trạng thái cài đặt.\n\nKeywords phản xạ nhanh (AZ-400)\n\"web server\" + \"email server\" + DSC → Name SMTP-Server, Web-Server + Ensure Present.\n",
    "boxes": {
      "1": {
        "label": "Name:",
        "answer": "= @(\"SMTP-Server\";  \"Web-Server\")"
      },
      "2": {
        "label": "= 'Present'",
        "answer": "Ensure"
      }
    },
    "answerText": "= @(\"SMTP-Server\";  \"Web-Server\"), Ensure"
  },
  "458": {
    "stem": "Bạn có private distribution group gồm thiết bị đã provisioned và chưa provisioned.\nCần phân phối iOS application mới tới group bằng Microsoft Visual Studio App Center.\nNên làm gì?",
    "options": {
      "A": "Register the devices on the Apple Developer portal.",
      "B": "Add the device owner to the organization in App Center.",
      "C": "Create an unsigned build.",
      "D": "Add the device owner to the collaborators group."
    },
    "explanation": "Đáp án: A — Register the devices on the Apple Developer portal\n\nĐề bài: private distribution group có máy provisioned và unprovisioned. Cần phát iOS app mới bằng Visual Studio App Center.\n\nAd hoc iOS bắt buộc UDID trên Apple Developer portal trước khi tạo provisioning profile. App Center dựa trên danh sách đó để sign và phát cho private group, kể cả máy chưa provisioned.\n\nThêm owner vào organization hoặc collaborators group chỉ cấp quyền xem/download trên App Center, không đăng ký device với Apple. Unsigned build không cài được trên iOS.\n\nKeywords phản xạ nhanh (AZ-400)\n\"unprovisioned iOS\" + App Center private group → register UDID on Apple Developer portal.\n",
    "answerText": "A"
  },
  "459": {
    "stem": "Công ty dùng Azure Artifacts cho package management.\nCần cấu hình upstream source trong Azure Artifacts cho Python packages.\nNên chọn nguồn nào?",
    "options": {
      "A": "npmjs.org",
      "B": "PyPI",
      "C": "Maven Central",
      "D": "third-party trusted Python"
    },
    "explanation": "Đáp án: B — PyPI\n\nĐề bài: cấu hình upstream source trên Azure Artifacts cho Python packages.\n\nUpstream Python được hỗ trợ sẵn là PyPI (Python Package Index). Feed lấy package công khai từ PyPI, cache vào Azure Artifacts, rồi restore nội bộ.\n\nnpmjs.org là registry npm/Node.js. Maven Central là registry Java. “third-party trusted Python” không phải upstream built-in trên Azure Artifacts.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Artifacts\" + \"Python\" + upstream → PyPI.\n",
    "answerText": "B"
  },
  "460": {
    "stem": "Bạn có GitHub repository chứa workflows. Các step gọi predefined actions; mỗi action có một hoặc nhiều version.\nCần chỉ định đúng version của action. Ba thuộc tính nào định danh version? (Mỗi đáp án là một giải pháp đầy đủ.)",
    "options": {
      "A": "the SHA-based hashes",
      "B": "the tag",
      "C": "the runner",
      "D": "the branch",
      "E": "the serial"
    },
    "explanation": "Đáp án: A, B, D — SHA-based hashes, the tag, the branch\n\nĐề bài: GitHub Actions workflow gọi predefined actions. Cần ba cách chỉ định đúng version của action (mỗi cách là một giải pháp đủ).\n\nCú pháp uses: owner/action@ref chấp nhận commit SHA (bất biến), tag (ví dụ v1.2.0), hoặc branch (luôn lấy tip của nhánh). Cả ba đều pin được version action.\n\nRunner là môi trường chạy job (ubuntu-latest, self-hosted), không định nghĩa version action. Serial không phải thuộc tính version trên GitHub Actions.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub Actions\" + pin action version → SHA + tag + branch.\n",
    "answerText": "A,B,D"
  },
  "461": {
    "stem": "Bạn có Azure subscription chứa nhiều Azure pipelines.\nCần giải pháp monitoring: parse logs từ nhiều nguồn và xác định root cause.\nNên đưa advanced feature nào của monitoring tool vào giải pháp?",
    "options": {
      "A": "analytics",
      "B": "synthetic monitoring",
      "C": "directed monitoring",
      "D": "Alert Management"
    },
    "explanation": "Đáp án: A — analytics\n\nĐề bài: giám sát nhiều Azure Pipelines. Giải pháp phải parse log từ nhiều nguồn và xác định root cause.\n\nAnalytics (log analytics, correlation, query trên dữ liệu lớn) gom log từ task, agent và service, tìm pattern/anomaly rồi truy vết nguyên nhân. Đó là advanced feature khớp cả hai yêu cầu.\n\nSynthetic monitoring giả lập tương tác user để đo availability, không parse pipeline log. Alert Management chỉ thông báo khi rule khớp, không tự RCA đa nguồn. Directed monitoring không phải capability chuẩn cho parse log và root cause trên exam.\n\nKeywords phản xạ nhanh (AZ-400)\n\"parse logs\" + \"root cause\" + pipelines → analytics.\n",
    "answerText": "A"
  },
  "462": {
    "stem": "Lưu ý: Câu hỏi này thuộc một nhóm câu có cùng bối cảnh nhưng mỗi câu có kết quả riêng. Xác định giải pháp có đáp ứng yêu cầu không.\n\nBạn dùng Azure Pipelines build và test ứng dụng React.js. Pipeline có một job.\nCài JavaScript packages từ npm mất khoảng năm phút mỗi lần chạy.\nCần giảm thời gian thực thi pipeline.\nGiải pháp: Dùng pipeline artifacts.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề bài: pipeline React.js, một job. Cài JavaScript packages từ npm mất khoảng năm phút mỗi lần chạy. Solution đề xuất dùng pipeline artifacts để giảm thời gian. Có đạt mục tiêu không?\n\nPipeline artifacts lưu output (drop, test result) để job/stage sau hoặc release lấy. Chúng không cache thư mục node_modules giữa các lần chạy độc lập.\n\nĐể rút thời gian npm restore cần Cache task (hoặc cache của npm/yarn) keyed theo package-lock.json hoặc yarn.lock. Artifacts không thay cache dependency, nên solution không đạt mục tiêu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"npm takes five minutes\" + pipeline artifacts → No (use Cache task).\n",
    "answerText": "B"
  },
  "463": {
    "stem": "Cần giải pháp documentation:\n• Viết bằng Markdown khi developer đổi code.\n• Thay đổi document trigger biên dịch lại static website.\n• User đọc từ static website.\n• Document lưu trên GitHub repository.\nHai tool nào compile website? (Mỗi đáp án là một giải pháp đầy đủ.)",
    "options": {
      "A": "Word Press",
      "B": "Jekyll",
      "C": "DocFX",
      "D": "caret",
      "E": "Medium"
    },
    "explanation": "Đáp án: B và C — Jekyll, DocFX\n\nĐề bài: tài liệu viết Markdown trong GitHub repo; mỗi thay đổi phải compile lại static website; user đọc từ site đó. Hai tool nào compile được website?\n\nJekyll là static site generator: Markdown thành HTML/CSS, gắn tốt với GitHub Pages. DocFX cũng generate static site từ Markdown (và API docs .NET). Cả hai khớp “recompilation of a static website” khi commit.\n\nWordPress là CMS động, cần database, không compile Markdown thành site tĩnh. caret (editor/preview) không publish site. Medium là nền tảng blog, không phải compiler trong repo.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Markdown\" + \"static website\" + GitHub → Jekyll + DocFX.\n",
    "answerText": "B,C"
  },
  "464": {
    "stem": "Bạn có app on-premises App1 truy cập Azure bằng credential trong configuration file.\nĐịnh nâng App1 dùng Azure service principal.\nApp1 cần gì để sign in lập trình tới Azure Active Directory (Azure AD)?",
    "options": {
      "A": "the application ID, a client secret, and the object ID",
      "B": "a client secret, the object ID, and the tenant ID",
      "C": "the application ID, a client secret, and the tenant ID",
      "D": "the application ID, a client secret, and the subscription ID"
    },
    "explanation": "Đáp án: C — the application ID, a client secret, and the tenant ID\n\nĐề bài: App1 on-premises sẽ đăng nhập Azure AD bằng service principal thay vì credential trong file cấu hình. Hỏi bộ giá trị bắt buộc để sign in programmatically.\n\nClient credential flow cần application ID (client ID) để nhận diện app, client secret để chứng thực, và tenant ID để gửi token request đúng Azure AD tenant.\n\nObject ID định danh object trong directory, không dùng làm claim lúc xin token. Subscription ID là phạm vi billing/RBAC trên Azure Resource Manager, không phải thông tin đăng nhập Azure AD.\n\nKeywords phản xạ nhanh (AZ-400)\n\"service principal\" + sign in Azure AD → application ID + client secret + tenant ID.\n",
    "answerText": "C"
  },
  "465": {
    "stem": "Bạn có virtual machine Windows Server 2019 quản lý bằng Desired State Configuration (DSC).\nCó DSC configuration và Local Configuration Manager như exhibit.\nVới mỗi phát biểu, chọn Yes nếu đúng, No nếu sai.",
    "explanation": "Đáp án: No, No, Yes\n\nĐề bài: VM Windows Server 2019 quản lý bằng DSC. Có configuration (WindowsFeature Web-Server, File WebsiteContent copy Index.htm tới C:\\inetpub\\wwwroot, DependsOn Web-Server) và LCM ConfigurationMode = ApplyAndMonitor, ConfigurationModeFrequencyMins = 60. Đánh Yes/No từng phát biểu.\n\nPhát biểu 1 là No. File WebsiteContent phụ thuộc [WindowsFeature]Web-Server nên copy sau khi cài IIS. DestinationPath là C:\\inetpub\\wwwroot, không phải C:\\Test, và không copy trước feature.\n\nPhát biểu 2 là No. ApplyAndMonitor chỉ báo drift trong log, không tự apply lại (không phải ApplyAndAutoCorrect).\n\nPhát biểu 3 là Yes. LCM kiểm tra lại theo chu kỳ 60 phút. Gỡ Web-Server sẽ lệch desired state và được ghi log trong vòng ConfigurationModeFrequencyMins.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ApplyAndMonitor\" + ConfigurationModeFrequencyMins 60 → report drift, no AutoCorrect.\n",
    "statements": {
      "1": "File Index.htm sẽ được copy vào thư mục C:\\Test trước khi cài Windows feature Web-Server.",
      "2": "Nếu cấu hình virtual machine bị sửa thủ công, configuration sẽ được apply lại tự động.",
      "3": "Nếu Windows feature Web-Server bị gỡ khỏi virtual machine, lệch cấu hình sẽ được ghi trong log trong vòng 60 phút."
    },
    "answerText": "No, No, Yes"
  },
  "466": {
    "stem": "Web app App1 host trên nhiều server, dùng Application Insights trong Azure Monitor.\nCần so sánh daily CPU usage của tất cả server trong tuần vừa qua.\nHoàn thành KQL query. Kéo giá trị phù hợp vào từng vị trí.",
    "explanation": "Đáp án: bin(timestamp, 1d), render timechart\n\nĐề bài: App1 trên nhiều server, gửi Application Insights. Cần so sánh daily CPU usage của cả tuần cho mọi server. Hoàn thành KQL.\n\nsummarize avg(value) theo cloud_RoleInstance cần bucket thời gian một ngày: bin(timestamp, 1d). render timechart vẽ time series CPU theo ngày và instance, đúng “compare daily CPU”.\n\nbin(timestamp, 1h) là hourly, không phải daily. project timechart không phải operator KQL. render chart không phải visualization chuẩn cho chuỗi thời gian như timechart.\n\nKeywords phản xạ nhanh (AZ-400)\n\"daily CPU\" + Application Insights → bin(timestamp, 1d) + render timechart.\n",
    "boxes": {
      "1": {
        "label": "summarize avg(value) by cloud_RoleInstance,",
        "answer": "bin(timestamp,1d)"
      },
      "2": {
        "label": "|",
        "answer": "render timechart"
      }
    },
    "answerText": "bin(timestamp,1d), render timechart"
  },
  "467": {
    "stem": "Subscription có 50 virtual machine. Định quản lý cấu hình bằng Azure Automation State Configuration.\nCần tạo Desired State Configuration (DSC) configuration files. Nên cấu trúc các code block theo thứ tự nào?",
    "options": {
      "A": "Node > Configuration > Resource",
      "B": "Configuration > Resource > Node",
      "C": "Resource > Configuration > Node",
      "D": "Configuration > Node > Resource"
    },
    "explanation": "Đáp án: D — Configuration > Node > Resource\n\nĐề bài: viết file DSC cho Azure Automation State Configuration trên khoảng 50 VM. Hỏi thứ tự lồng các khối code.\n\nCompiler DSC bắt buộc: Configuration (tài liệu desired state) chứa một hoặc nhiều Node (máy đích), mỗi Node chứa Resource (File, WindowsFeature, Service, Registry, Package). Đó là Configuration > Node > Resource.\n\nNode > Configuration > Resource, Configuration > Resource > Node, và Resource > Configuration > Node đảo hierarchy. File không compile hoặc apply được.\n\nKeywords phản xạ nhanh (AZ-400)\n\"DSC configuration files\" + structure → Configuration > Node > Resource.\n",
    "answerText": "D"
  },
  "468": {
    "stem": "Cần thông báo mọi thành viên qua Microsoft Teams khi build hoặc release thất bại. Giải pháp phải giảm tối đa development effort.\nBạn nên làm gì?",
    "options": {
      "A": "Install the Azure Boards app for Teams and configure a subscription to receive notifications in a channel.",
      "B": "Use Azure Automation to connect to the Azure DevOps REST API and notify the team members.",
      "C": "Use an Azure function to connect to the Azure DevOps REST API and notify the team members.",
      "D": "Install the Azure Pipelines app for Teams and configure a subscription to receive notifications in a channel."
    },
    "explanation": "Đáp án: D — Install the Azure Pipelines app for Teams and configure a subscription to receive notifications in a channel\n\nĐề bài: khi build hoặc release thất bại, cả team phải được báo trên Microsoft Teams, và phải minimize development effort.\n\nAzure Pipelines app for Teams subscribe channel theo sự kiện pipeline (build failed, release failed) mà không viết code. Đó là tích hợp có sẵn, ít công nhất.\n\nAzure Boards app chỉ thông báo work item, không phải trạng thái build/release. Azure Automation hoặc Azure Function gọi REST API rồi post Teams được, nhưng phải viết auth, query và format — trái minimize development effort.\n\nKeywords phản xạ nhanh (AZ-400)\n\"build or release failure\" + Teams + minimize effort → Azure Pipelines app subscription.\n",
    "answerText": "D"
  },
  "469": {
    "stem": "App1 ghi log vào Log Analytics workspace Workspace1, bảng AppEvents.\nCần query AppEvents thỏa:\n• Chỉ hàng cột Name bắt đầu bằng \"Clicked Create New Ticket.\"\n• Tính số click mỗi ngày theo user.\n• Top 10 user theo số click trong một ngày bất kỳ.\n• Sort theo số click cao nhất.\n• Bỏ user có dưới 3 daily clicks.\nSắp xếp các câu lệnh KQL theo đúng thứ tự.",
    "explanation": "Đáp án: AppEvents → where Name startswith \"Clicked Create New Ticket\" → summarize NumberOfClicks = count() by bin(TimeGenerated, 1d), UserId → where NumberOfClicks >= 3 → top 10 by NumberOfClicks desc\n\nĐề bài: query bảng AppEvents. Lọc Name bắt đầu bằng \"Clicked Create New Ticket.\"; đếm daily clicks theo user; bỏ user dưới ba click/ngày; trả top 10 theo số click, sắp giảm dần.\n\nPipeline KQL phải bắt đầu từ table AppEvents. where sớm giảm dữ liệu. summarize tạo NumberOfClicks theo ngày và UserId. where NumberOfClicks >= 3 chỉ chạy sau khi cột đó tồn tại. top 10 by NumberOfClicks desc đứng cuối để lấy đúng mười user có nhiều click nhất.\n\nĐặt filter NumberOfClicks trước summarize thì cột chưa có. Đặt top trước where sẽ chọn nhầm user rồi mới lọc. Đảo table ra khỏi đầu pipeline thì query không hợp lệ.\n\nKeywords phản xạ nhanh (AZ-400)\n\"daily clicks per user\" + top 10 KQL → table, where, summarize, where >= 3, top desc.\n",
    "boxes": {
      "1": {
        "answer": "AppEvents"
      },
      "2": {
        "answer": "| where Name startswith &quot;Clicked Create New Ticket"
      },
      "3": {
        "answer": "| summarize NumberOfClicks = count() by bin(TimeGenerated 1d); UserId"
      },
      "4": {
        "answer": "| where NumberOfClicks >= 3"
      },
      "5": {
        "answer": "| top 10 by NumberOfClicks desc"
      }
    },
    "answerText": "AppEvents, | where Name startswith &quot;Clicked Create New Ticket, | summarize NumberOfClicks = count() by bin(TimeGenerated 1d); UserId, | where NumberOfClicks >= 3, | top 10 by NumberOfClicks desc"
  },
  "470": {
    "stem": "Subscription có resource group ContosoRG và ContosoDev, Azure Data Factory Contoso Data Factory, và release pipeline Pipeline1.\nĐịnh deploy Contoso Data Factory vào ContosoRG bằng Pipeline1. Task Azure Resource Manager (ARM) template deployment như exhibit.\nChọn giá trị hoàn thành mỗi câu.",
    "explanation": "Đáp án: Deployment mode; location specified in the Linked artifact variable\n\nĐề bài: Pipeline1 deploy Contoso Data Factory bằng ARM template vào ContosoRG. Cần không sửa database và web app đã có trong ContosoRG, và biết pipeline lấy template từ đâu.\n\nDeployment mode Complete xóa hoặc thay resource trong resource group không nằm trong template. Đổi sang Incremental thì chỉ tạo/cập nhật resource trong template, database và web app sẵn có được giữ. Template location = Linked artifact nên file ARM lấy từ đường dẫn artifact đã link (biến Linked artifact / System.DefaultWorkingDirectory của artifact).\n\nAction, Template location hay Deployment scope không phải control ngăn Complete xóa resource lạ. Default Git branch hoặc output CI chỉ đúng nếu artifact trỏ tới đó; đề hỏi đúng “location specified in the Linked artifact variable”.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prevent modification of existing\" + ARM task → Incremental (Deployment mode) + Linked artifact.\n",
    "boxes": {
      "1": {
        "label": "Phải đổi setting [answer choice] để không sửa database và web app sẵn có trong ContosoRG.",
        "answer": "Deployment mode"
      },
      "2": {
        "label": "Pipeline1 lấy ARM template từ [answer choice].",
        "answer": "location specified in the Linked artifact variable"
      }
    },
    "answerText": "Deployment mode, location specified in the Linked artifact variable"
  },
  "471": {
    "stem": "Có Azure Pipeline. Cần lưu configuration values dưới dạng variables.\nBốn scope nào có thể định nghĩa variable, và thứ tự precedence từ cao xuống thấp? Kéo scope vào answer area theo đúng thứ tự.",
    "explanation": "Đáp án: job, stage, pipeline root, pipeline settings UI (cao xuống thấp)\n\nĐề bài: biến YAML Azure Pipelines được khai ở nhiều scope. Hỏi bốn scope và thứ tự precedence từ cao xuống thấp.\n\nCùng tên biến: job ghi đè stage, stage ghi đè pipeline root (global YAML), YAML root ghi đè biến khai trên pipeline settings UI. Bốn scope đề hỏi là job, stage, pipeline root, pipeline settings UI.\n\nTask không thuộc bốn scope trong đáp án. Biến YAML ở root không hiện trên UI settings; UI là tầng thấp nhất trong danh sách này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"variable precedence\" + YAML → job > stage > pipeline root > pipeline settings UI.\n",
    "boxes": {
      "1": {
        "label": "Highest",
        "answer": "job"
      },
      "2": {
        "answer": "stage"
      },
      "3": {
        "answer": "pipeline root"
      },
      "4": {
        "label": "Lowest",
        "answer": "pipeline settings UI"
      }
    },
    "answerText": "job, stage, pipeline root, pipeline settings UI"
  },
  "472": {
    "stem": "Project1 trên Azure DevOps có environment1 và environment2. Khi release version mới: version mới deploy lên environment2, version trước redeploy lên environment1.\nCần phân phối user giữa hai environment:\n• Release mới chỉ tới một subset user.\n• Tăng dần số user được vào environment2.\nNên dùng gì?",
    "options": {
      "A": "VIP swaping",
      "B": "web app deployment slots",
      "C": "Azure Load Balancer",
      "D": "Azure Traffic Manager"
    },
    "explanation": "Đáp án: B — web app deployment slots\n\nĐề bài: version mới lên environment2, version cũ ở environment1. Chỉ một subset user thấy bản mới, rồi tăng dần số user vào environment2.\n\nDeployment slots trên Azure App Service giữ hai version trên cùng web app và route phần trăm traffic sang slot mới. Tăng dần tỷ lệ đúng progressive exposure; swap lại để rollback.\n\nVIP swapping không phải tính năng độc lập trên exam (swap VIP gắn với slot). Azure Load Balancer phân tải cùng một version, không staged hai bản. Azure Traffic Manager định tuyến DNS theo endpoint/region, không chia phần trăm user giữa hai slot cùng app.\n\nKeywords phản xạ nhanh (AZ-400)\n\"subset of users\" + gradually increase + two environments → web app deployment slots.\n",
    "answerText": "B"
  },
  "473": {
    "stem": "Bạn thiết kế versioning cho Git-based packages theo Semantic Versioning (SemVer).\nCần xác định khi nào đổi build version cho từng scenario. Kéo Major/Minor/Patch vào từng tình huống.",
    "explanation": "Đáp án: Major, Minor, Minor\n\nĐề bài: chiến lược SemVer cho Git-based packages. Gán phần version cho từng kịch bản: rename parameter API; deprecate functionality; thêm feature vẫn backwards compatible.\n\nRename parameter là breaking change: client cũ gọi tên cũ sẽ lỗi, nên tăng Major. Deprecate chỉ đánh dấu sẽ gỡ sau, API cũ vẫn chạy, nên tăng Minor. Thêm feature giữ tương thích cũng là Minor.\n\nPatch chỉ dùng cho bug fix tương thích, không dùng cho rename, deprecate hay feature mới.\n\nKeywords phản xạ nhanh (AZ-400)\n\"rename API parameter\" → Major; \"deprecate\" / \"backwards compatible feature\" → Minor.\n",
    "boxes": {
      "1": {
        "label": "You rename a parameter in an API:",
        "answer": "Major"
      },
      "2": {
        "label": "You deprecate functionality in an API:",
        "answer": "Minor"
      },
      "3": {
        "label": "You add a feature and maintain backwards compatibility:",
        "answer": "Minor"
      }
    },
    "answerText": "Major, Minor, Minor"
  },
  "474": {
    "stem": "Cần lưu optional tag beta trong version number. Dùng phần nào của version cho tag?",
    "options": {
      "A": "minor",
      "B": "major",
      "C": "micro",
      "D": "modifier"
    },
    "explanation": "Đáp án: D — modifier\n\nĐề bài: cần gắn tag tùy chọn beta vào version number. Hỏi dùng phần nào của version.\n\nModifier (prerelease/qualifier) chứa nhãn tùy chọn như beta, rc: 4.0.0-beta hoặc 2024.01.01-beta. Không đổi số major/minor/patch của bản ổn định.\n\nMajor, minor và micro (patch) là số lõi SemVer/CalVer. Chúng không phải chỗ để gắn tag beta optional.\n\nKeywords phản xạ nhanh (AZ-400)\n\"optional tag\" + beta + version → modifier (prerelease).\n",
    "answerText": "D"
  },
  "475": {
    "stem": "Subscription dùng Azure Automation State Configuration để quản lý cấu hình VM.\nCần xác định node noncompliant.\nHoàn thành query. Kéo giá trị vào từng chỗ trống.",
    "explanation": "Đáp án: Category, OperationName, ResultType\n\nĐề bài: Azure Automation State Configuration quản lý VM. Cần query node noncompliant. Kéo field vào điều kiện where.\n\nLog DSC node trên AzureDiagnostics lọc Category == \"DscNodeStatus\", rồi OperationName cho thao tác DSC, rồi ResultType != \"Compliant\" để lấy node lệch desired state.\n\nDscReportStatus, Message hay Resource không phải bộ filter chuẩn trên exhibit AzureDiagnostics cho câu “which nodes are noncompliant”.\n\nKeywords phản xạ nhanh (AZ-400)\n\"noncompliant\" + DSC + AzureDiagnostics → Category DscNodeStatus + ResultType != Compliant.\n",
    "boxes": {
      "1": {
        "label": "| where ____ == \"DscNodeStatus\"",
        "answer": "Category"
      },
      "2": {
        "label": "| where ____ contains \"\"",
        "answer": "OperationName"
      },
      "3": {
        "label": "| where ____ != \"Compliant\"",
        "answer": "ResultType"
      }
    },
    "answerText": "Category, OperationName, ResultType"
  },
  "476": {
    "stem": "Project1 trên Azure DevOps. Cần mọi pipeline mới trong Project1 đều chạy ba task cụ thể khi execute.\nBạn nên tạo gì?",
    "options": {
      "A": "a task group",
      "B": "a JSON template",
      "C": "a YAML template",
      "D": "a PowerShell task"
    },
    "explanation": "Đáp án: A — a task group\n\nĐề bài: mọi pipeline mới trong Project1 phải chạy đúng ba task cụ thể khi execute.\n\nTask group gói một chuỗi task thành một đơn vị tái sử dụng trên classic Azure Pipelines. Thêm task group vào pipeline mới là đủ ba bước, sửa một chỗ là mọi nơi dùng bản mới.\n\nJSON template và YAML template tái sử dụng được nhưng mỗi pipeline mới vẫn phải reference thủ công; chúng không tự chèn vào mọi pipeline vừa tạo. PowerShell task chỉ là một bước, phải copy vào từng pipeline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"all new pipelines\" + three specific tasks → task group.\n",
    "answerText": "A"
  },
  "477": {
    "stem": "Project Azure DevOps có release pipeline hai stage: QA deploy lên webapp1, Prod deploy lên webapp2.\nCần chặn deploy lên webapp2 nếu Azure Application Insights phát Failed requests alerts sau khi deploy code mới lên webapp1.\nChọn cấu hình cho QA và Prod.",
    "explanation": "Đáp án: QA — Add a task to configure alert rules in Application Insights; Prod — Configure a gate in the pre-deployment conditions\n\nĐề bài: QA deploy webapp1, Prod deploy webapp2. Không được deploy webapp2 nếu Application Insights phát Failed requests alerts sau khi deploy code mới lên webapp1.\n\nTrên stage QA cần task tạo/cấu hình Failed requests alert trên Application Insights ngay sau khi webapp1 nhận bản mới. Trên Prod, gate ở pre-deployment conditions đọc Azure Monitor / Application Insights; khi alert đang fire thì Prod bị chặn.\n\nAuto-redeploy, post-deployment approval và queue settings không đọc alert từ QA để chặn Prod. Gate đặt sau khi Prod đã deploy thì quá muộn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Failed requests\" after QA + block Prod → App Insights alert task + pre-deployment gate.\n",
    "boxes": {
      "1": {
        "label": "QA:",
        "answer": "Add a task to configure alert rules in Application Insights."
      },
      "2": {
        "label": "Prod:",
        "answer": "Configure a gate in the pre-deployment conditions."
      }
    },
    "answerText": "Add a task to configure alert rules in Application Insights., Configure a gate in the pre-deployment conditions."
  },
  "478": {
    "stem": "Cần so sánh thời gian troubleshooting issue phát hiện lúc development với issue phát hiện trên released code.\nNên dùng KPI nào?",
    "options": {
      "A": "defect escape rate",
      "B": "unplanned work rate",
      "C": "defect rate",
      "D": "rework rate"
    },
    "explanation": "Đáp án: A — defect escape rate\n\nĐề bài: so sánh thời gian troubleshoot lỗi tìm thấy lúc development với lỗi tìm thấy trên released code. Hỏi KPI nào.\n\nDefect escape rate đo tỷ lệ defect lọt qua dev/test rồi bị phát hiện sau release (production). Escape thấp nghĩa là hầu hết lỗi bị bắt trước khi phát hành; escape cao nghĩa là tốn công sửa trên released code. KPI này so sánh trực tiếp hai phía đề hỏi.\n\nUnplanned work rate đo việc ngoài kế hoạch sprint, không tách pre/post release. Defect rate đếm tổng defect, không nói chúng bị tìm thấy lúc nào. Rework rate đo lượng code làm lại, chỉ gián tiếp liên quan troubleshooting.\n\nKeywords phản xạ nhanh (AZ-400)\n\"troubleshooting in development vs released code\" → defect escape rate.\n",
    "answerText": "A"
  },
  "479": {
    "stem": "Project1 có CI/CD dùng PowerShell Desired State Configuration (DSC) để cấu hình infrastructure.\nCần unit test và integration test configuration trước khi deploy Project1.\nNên dùng gì?",
    "options": {
      "A": "the PSScriptAnalyzer tool",
      "B": "the Pester test framework",
      "C": "the PSCodeHealth module",
      "D": "the Test-DscConfiguration cmdlet"
    },
    "explanation": "Đáp án: B — the Pester test framework\n\nĐề bài: CI/CD dùng PowerShell DSC cho infrastructure. Cần unit test và integration test configuration trước khi Project1 được deploy.\n\nPester là test framework của PowerShell. Có thể viết test unit (logic resource, function) và integration (file, service, registry sau khi apply trên node thử) trước production.\n\nPSScriptAnalyzer và PSCodeHealth là static analysis / health style, không execute configuration. Test-DscConfiguration so sánh node với MOF đã apply, không thay bộ unit/integration test trước lúc deploy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"unit test\" + \"integration test\" + DSC → Pester.\n",
    "answerText": "B"
  },
  "480": {
    "stem": "Cần mọi comment trên pull request được resolve trước khi PR vào build. Giải pháp phải giảm administrative effort.\nNên đưa gì vào giải pháp?",
    "options": {
      "A": "a custom action",
      "B": "a post-deployment gate",
      "C": "a branch policy",
      "D": "a pre-deployment gate"
    },
    "explanation": "Đáp án: C — a branch policy\n\nĐề bài: mọi comment trên pull request phải được resolve trước khi PR vào build. Minimize administrative effort.\n\nBranch policy “Check for comment resolution” chặn complete/merge khi còn comment mở. PR chưa sạch không vào default/protected branch nên không vào CI của nhánh đó. Cấu hình một lần trên branch.\n\nCustom action phải viết và bảo trì script, tốn hơn policy. Pre-deployment gate và post-deployment gate chạy trên release sau khi đã có build, không phải chỗ chặn comment trước khi code vào build.\n\nKeywords phản xạ nhanh (AZ-400)\n\"comments resolved\" + pull request + minimize effort → branch policy.\n",
    "answerText": "C"
  },
  "481": {
    "stem": "Project có release pipeline ReleaseP1.\nMỗi khi tạo release mới cho ReleaseP1, cần sinh release notes (new features và bug fixes).\nBa action nào theo thứ tự?",
    "explanation": "Đáp án: Create a query that retrieves the feature and bug fix information → Create a personal access token (PAT) → Create a PowerShell task in ReleaseP1 that writes the retrieved data to a markdown file\n\nĐề bài: mỗi release mới của ReleaseP1 phải sinh release notes gồm new features và bug fixes.\n\nTrước hết tạo query (WIQL) lấy Feature và Bug đã đóng trong phạm vi release. PowerShell gọi Azure DevOps REST cần PAT. Task PowerShell trong ReleaseP1 chạy query, ghi markdown, rồi đính kèm/publish notes.\n\nService principal không phải bước trong chuỗi đáp án. Dashboard widget hiển thị work item, không tạo file notes trong release pipeline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"release notes\" + features and bugs → query + PAT + PowerShell markdown task.\n",
    "boxes": {
      "1": {
        "answer": "Create a query that retrieves the feature and bug fix information."
      },
      "2": {
        "answer": "Create a personal access token (PAT)."
      },
      "3": {
        "answer": "Create a PowerShell task in ReleaseP1 that writes the retrieved data to a markdown file."
      }
    },
    "answerText": "Create a query that retrieves the feature and bug fix information., Create a personal access token (PAT)., Create a PowerShell task in ReleaseP1 that writes the retrieved data to a markdown file."
  },
  "482": {
    "stem": "SIMULATION — Cần cấu hình virtual machine template trong DevTest Labs az400-123456789-dtl1.\nOS phải dựa trên Windows Server 2016 Datacenter. VM tạo từ lab phải có Selenium và Google Chrome.\nĐăng nhập Microsoft Azure portal.",
    "explanation": "Đáp án: Formula/template DevTest Labs — Windows Server 2016 Datacenter + artifacts Google Chrome và Selenium\n\nĐề bài (simulation): cấu hình VM template trong DevTest Labs az400-123456789-dtl1. OS dựa trên Windows Server 2016 Datacenter. Mọi VM tạo từ lab phải có Selenium và Google Chrome.\n\nTrên portal mở DevTest Labs az400-123456789-dtl1, tạo Formula (hoặc custom image) với base Windows Server 2016 Datacenter. Thêm artifacts Google Chrome và Selenium, Save. VM mới từ formula sẽ có đủ tool.\n\nTạo VM lẻ rồi cài tay không thành template cho lần sau. Chọn sai SKU OS hoặc thiếu một artifact thì không đủ yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"DevTest Labs\" + Selenium + Chrome → Formula on Windows Server 2016 Datacenter + artifacts.\n",
    "answerText": "DevTest Labs formula: Windows Server 2016 Datacenter + artifacts Google Chrome and Selenium."
  },
  "483": {
    "stem": "Cần cấu hình alert cho VM1 theo technical requirements: trigger khi average CPU vượt 80% trong 15 phút; tính average mỗi phút.\nHai setting nào cần cấu hình? Chọn trong answer area.",
    "explanation": "Đáp án: 80%, 15 minutes\n\nĐề bài: alert Azure Monitor cho VM1 theo technical requirements: trigger khi average CPU vượt 80 phần trăm trong 15 phút; tính average mỗi phút.\n\nThreshold value = 80% khớp “exceeds 80 percent”. Aggregation granularity (period) = 15 minutes là cửa sổ tính average. Frequency of evaluation giữ Every 1 minute như yêu cầu “averages once every minute”.\n\n20% hoặc 50% sai ngưỡng. 5 minutes hoặc 10 minutes sai cửa sổ 15 phút.\n\nKeywords phản xạ nhanh (AZ-400)\n\"average CPU exceeds 80 percent for 15 minutes\" → threshold 80% + granularity 15 minutes.\n",
    "boxes": {
      "1": {
        "label": "Threshold value",
        "answer": "80%"
      },
      "2": {
        "label": "Aggregation granularity (Period)",
        "answer": "15 minutes"
      }
    },
    "answerText": "80%, 15 minutes"
  },
  "484": {
    "stem": "Cần code flow cho Project2 trên Azure DevOps: Team2 submit PR; Team2 làm độc lập trên bản copy Project2; mọi thay đổi trung gian trên copy vẫn chịu cùng restriction như build policy của Project2.\nBa action nào theo thứ tự?",
    "explanation": "Đáp án: Create a fork → Create a branch → Add a build validation policy\n\nĐề bài: code flow Project2: Team2 submit pull request; làm độc lập trên bản copy; mọi thay đổi trung gian trên copy vẫn chịu cùng restriction như build policy của Project2.\n\nFork tạo bản copy độc lập và vẫn PR về repo gốc. Branch trên fork là nơi Team2 commit. Build validation policy trên branch đích queue build khi có PR hoặc push; build fail thì không complete PR — cùng restriction với Project2.\n\nCreate a repository mới mất liên kết fork/PR. Application access policy không phải build gate. Chỉ “Add a build policy” không đủ nếu chưa có fork và branch làm việc.\n\nKeywords phản xạ nhanh (AZ-400)\n\"work independently on a copy\" + same build restrictions → fork, branch, build validation policy.\n",
    "boxes": {
      "1": {
        "label": "Step 1",
        "answer": "Create a fork"
      },
      "2": {
        "label": "Step 2",
        "answer": "Create a branch"
      },
      "3": {
        "label": "Step 3",
        "answer": "Add a build validation policy"
      }
    },
    "answerText": "Create a fork, Create a branch, Add a build validation policy"
  },
  "485": {
    "stem": "Subscription có: DepPipeline1 (Azure DevOps deployment pipeline), ADFPipeline1 (Azure Data Factory pipeline), Vault1 (Azure Key Vault).\nDepPipeline1 và ADFPipeline1 dùng một credential lưu trong Vault1.\nCần cấu hình ADFPipeline1 lấy credential từ Vault1. Dùng activity nào?",
    "options": {
      "A": "Lookup",
      "B": "Get Metadata",
      "C": "Сoрy",
      "D": "Web"
    },
    "explanation": "Đáp án: D — Web\n\nĐề bài: DepPipeline1 và ADFPipeline1 dùng một credential trong Vault1 (Azure Key Vault). Cần cấu hình ADFPipeline1 lấy credential đó. Chọn activity.\n\nAzure Data Factory lấy secret Key Vault lúc runtime bằng Web activity (HTTP GET Key Vault Secrets API, thường kèm managed identity) hoặc linked service Key Vault. Trong các option, Web là activity đúng.\n\nLookup đọc hàng từ dataset. Get Metadata đọc metadata dataset. Copy sao chép dữ liệu. Cả ba không phải chỗ chuẩn gọi Key Vault REST để lấy credential.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Data Factory\" + retrieve secret from Key Vault → Web activity.\n",
    "answerText": "D"
  },
  "486": {
    "stem": "Cần code flow cho Project2 trên Azure DevOps: Team2 làm trên bản copy, gửi PR, thay đổi trên copy chịu cùng build restriction như Project2.\nBa action nào theo thứ tự?",
    "explanation": "Đáp án: Create a fork. → Create a branch. → Add a build policy for the fork.\n\nĐề bài: cùng code flow Project2 — Team2 làm trên copy, PR về Project2, thay đổi trung gian phải chịu build policy.\n\nFork tạo copy. Branch là nhánh làm việc trên fork. Add a build policy for the fork áp restriction lên fork/branch để PR và push trung gian cũng phải qua build, không chỉ khi merge về repo gốc.\n\nPolicy chỉ trên master của repo gốc không cover commit trung gian trên fork. Tạo repository mới hoặc application access policy không đúng chuỗi.\n\nKeywords phản xạ nhanh (AZ-400)\n\"code flow\" + fork copy + same restrictions → fork, branch, build policy for the fork.\n",
    "boxes": {
      "1": {
        "answer": "Create a fork."
      },
      "2": {
        "answer": "Create a branch."
      },
      "3": {
        "answer": "Add a build policy for the fork."
      }
    },
    "answerText": "Create a fork., Create a branch., Add a build policy for the fork."
  },
  "487": {
    "stem": "Azure web app deploy bằng Azure Pipelines. Khi version mới lên production phải rollback được version trước.\n• Minimize downtime lúc deploy.\n• Minimize thời gian rollback.\nNên dùng gì?",
    "options": {
      "A": "a single web app and two deployment slots",
      "B": "a single web app and two deployment pipelines",
      "C": "two web apps and an Azure Standard Load Balancer",
      "D": "two web apps and an Azure Traffic Manager instance"
    },
    "explanation": "Đáp án: A — a single web app and two deployment slots\n\nĐề bài: Azure web app deploy bằng Azure Pipelines. Khi lên production phải rollback được bản trước. Minimize downtime lúc deploy và minimize thời gian rollback.\n\nHai slot (production và staging) trên một web app: deploy và warm-up staging rồi swap. Downtime thấp. Swap lại là rollback gần như tức thì, không phải redeploy bản cũ.\n\nHai deployment pipelines không có swap slot. Hai web app kèm Azure Load Balancer hoặc Azure Traffic Manager phức tạp hơn, tốn thời gian chuyển traffic và không nhanh bằng slot swap.\n\nKeywords phản xạ nhanh (AZ-400)\n\"minimize downtime\" + \"fast rollback\" + web app → one app + two deployment slots.\n",
    "answerText": "A"
  },
  "488": {
    "stem": "Bạn có app App1 phát hành bằng Azure Pipelines. App1 có các version như bảng (previous release 3.4.7, current release 4.0.0).\nBạn hoàn thành code change để sửa bug được introduce ở version 3.4.3.\nNên gán version number nào cho release?",
    "options": {
      "A": "3.4.4",
      "B": "3.4.8",
      "C": "3.5.0",
      "D": "4.0.1"
    },
    "explanation": "Đáp án: D — 4.0.1\n\nĐề bài: App1 phát hành bằng Azure Pipelines. Previous release 3.4.7, current release 4.0.0. Bạn sửa bug được introduce ở 3.4.3 và cần gán version cho release tiếp theo.\n\nSemantic Versioning tăng số trên bản hiện tại, không quay về dòng cũ. Bug fix không thêm feature và không breaking → tăng PATCH. Current là 4.0.0 nên bản mới là 4.0.1. Thời điểm bug xuất hiện (3.4.3) không đẩy version về 3.4.x.\n\n3.4.4 thấp hơn cả previous 3.4.7. 3.4.8 hoặc 3.5.0 phát hành lại dòng 3.x, không phải next release từ 4.0.0.\n\nKeywords phản xạ nhanh (AZ-400)\n\"current 4.0.0\" + bug fix + SemVer → 4.0.1 (patch).\n",
    "answerText": "D"
  },
  "489": {
    "stem": "Bạn đang automate testing. Cần automate UI testing cho web application.\nNên dùng framework nào?",
    "options": {
      "A": "JaCoco",
      "B": "Playwright",
      "C": "Xamarin.UITest",
      "D": "Microsoft.CodeAnalysi"
    },
    "explanation": "Đáp án: B — Playwright\n\nĐề bài: automate UI testing cho web application. Chọn framework.\n\nPlaywright điều khiển Chromium, Firefox và WebKit bằng một API, đúng UI test web đa trình duyệt.\n\nJaCoco (JaCoCo) đo code coverage Java, không phải UI test. Xamarin.UITest dành cho native mobile (iOS/Android). Microsoft.CodeAnalysis (Roslyn) phân tích/refactor code, không chạy UI.\n\nKeywords phản xạ nhanh (AZ-400)\n\"automate UI testing\" + web application → Playwright.\n",
    "answerText": "B"
  },
  "490": {
    "stem": "Project1 reference Azure Artifacts feed Feed1. Package1 có các version:\n• 1.0.3 — manually pushed to Feed1\n• 1.4.0 — manually pushed to Feed1\n• 2.0.0 — available from an upstream source\n• 2.3.1 — saved from an upstream source\nKhi build Project1, version nào của Package1 được dùng?",
    "options": {
      "A": "1.0.3",
      "B": "1.4.0",
      "C": "2.0.0",
      "D": "2.3.1"
    },
    "explanation": "Đáp án: D — 2.3.1\n\nĐề bài: Project1 restore Package1 từ Feed1. Bảng version: 1.0.3 và 1.4.0 push tay vào Feed1; 2.0.0 chỉ available từ upstream; 2.3.1 đã saved từ upstream vào feed. Build không pin version thì lấy bản nào?\n\nRestore lấy latest version đã có trong feed (kể cả bản đã cache từ upstream). 2.3.1 đã saved nên nằm trong Feed1 và mới hơn 1.4.0.\n\n2.0.0 mới “available from an upstream source”, chưa được kéo vào feed, nên chưa dùng. 1.0.3 và 1.4.0 cũ hơn bản đã cache 2.3.1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Artifacts feed\" + saved from upstream vs only available → latest saved in feed (2.3.1).\n",
    "answerText": "D"
  },
  "491": {
    "stem": "Cần tạo storage account bằng Bicep file.\nHoàn thành file. Chọn option trong answer area.",
    "explanation": "Đáp án: kind:, properties:\n\nĐề bài: hoàn thành Bicep tạo storage account. Một chỗ sau sku cần kind StorageV2; một chỗ bọc supportsHttpsTrafficOnly.\n\nkind: là thuộc tính resource Microsoft.Storage/storageAccounts (ví dụ StorageV2), đứng cùng cấp sku. Các setting resource-specific như supportsHttpsTrafficOnly nằm trong khối properties: { }.\n\nparam, var và type khai báo bên ngoài resource body, không thay kind hay properties trong resource.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Bicep\" + storage account → kind: StorageV2 + properties: { ... }.\n",
    "boxes": {
      "1": {
        "label": "'StorageV2'",
        "answer": "kind:"
      },
      "2": {
        "label": "supportsHttpsTrafficOnly",
        "answer": "properties:"
      }
    },
    "answerText": "kind:, properties:"
  },
  "492": {
    "stem": "GitHub repo repo1 chứa App1. Cần GitHub Actions workflow:\n• Scan khi push lên main.\n• Scan PR vào main.\n• Scan PR vào branch prefix releases/.\n• Scan mọi file trong subdirectory của src.\nHoàn thành code. Kéo giá trị vào từng chỗ.",
    "explanation": "Đáp án: 'releases/**', 'src/**', '*.md'\n\nĐề bài: GitHub Actions scan khi push/PR vào main, PR vào nhánh prefix releases/, và quét mọi file trong subdirectory của src. Hoàn thành workflow (kể cả paths-ignore trên exhibit).\n\nNhánh PR thêm 'releases/**' khớp mọi nhánh dưới releases/. paths: 'src/**' lấy đệ quy mọi file trong src. Ô paths-ignore theo key là '*.md'.\n\n'release*' không khớp prefix releases/. 'src/*' chỉ một cấp, bỏ thư mục con sâu hơn. '**/*.md' không phải giá trị key cho ô đó.\n\nKeywords phản xạ nhanh (AZ-400)\n\"PRs to releases/\" + scan src subdirs → releases/** + src/**.\n",
    "boxes": {
      "1": {
        "label": "- main",
        "answer": "'releases/**'"
      },
      "2": {
        "label": "paths:",
        "answer": "'src/**'"
      },
      "3": {
        "label": "paths-ignore:",
        "answer": "'*.md'"
      }
    },
    "answerText": "'releases/**', 'src/**', '*.md'"
  },
  "493": {
    "stem": "Dùng Azure Pipelines build/test. Thấy cycle time tăng.\nCần xác định có phải agent pool exhaustion hay không. Hai cách nào? (Mỗi cách là một giải pháp đủ.)",
    "options": {
      "A": "Query the PipelineRun/PipelineRuns endpoint.",
      "B": "Query the TaskAgentPoolSizeSnapshots endpoint.",
      "C": "View the Pipeline duration report.",
      "D": "View the pool consumption report at the organization level."
    },
    "explanation": "Đáp án: B và D — Query the TaskAgentPoolSizeSnapshots endpoint; View the pool consumption report at the organization level\n\nĐề bài: cycle time Azure Pipelines tăng. Cần biết có phải agent pool exhaustion hay không. Hai cách nào?\n\nTaskAgentPoolSizeSnapshots cho lịch sử size và utilization của pool; đối chiếu với lúc cycle time tăng. Pool consumption report ở organization visualize agent bận/đầy theo thời gian. Cả hai nói trực tiếp về sức chứa pool.\n\nPipelineRun/PipelineRuns và Pipeline duration report cho thấy job chạy lâu, không tách được nguyên nhân hết agent / queue exhaustion.\n\nKeywords phản xạ nhanh (AZ-400)\n\"agent pool exhaustion\" + cycle time → TaskAgentPoolSizeSnapshots + org pool consumption report.\n",
    "answerText": "B,D"
  },
  "494": {
    "stem": "Subscription có Pipeline1 và GitHub repo Repo1 chứa Bicep modules. Pipeline1 deploy Azure resources từ Bicep.\nCần mọi release tuân Azure Policy trước khi vào production.\nBạn nên làm gì?",
    "options": {
      "A": "To Pipeline1, add a step that runs a What if deployment before the deployment step.",
      "B": "Configure a deployment gate for Pipeline1 that uses Azure Automation to run a What If deployment.",
      "C": "Create an Azure DevOps build that runs on the creation of a pull request and assesses the code for compliance.",
      "D": "Configure a deployment gate for Pipeline1 and include the Azure DevOps Security and compliance assessment task."
    },
    "explanation": "Đáp án: D — Configure a deployment gate for Pipeline1 and include the Azure DevOps Security and compliance assessment task\n\nĐề bài: Pipeline1 deploy Bicep từ GitHub. Mọi release phải comply Azure Policy trước khi vào production.\n\nDeployment gate gắn Security and compliance assessment đánh giá template/Bicep theo Azure Policy assignment. Vi phạm thì stage production không chạy. Đó là checkpoint ngay trước prod.\n\nWhat if trong pipeline hữu ích nhưng phải đọc tay, không phải gate policy. Gate gọi Azure Automation chạy What if tốn custom script. Build trên pull request kiểm tra code sớm, không thay gate tuân thủ policy ngay trước production.\n\nKeywords phản xạ nhanh (AZ-400)\n\"comply with Azure Policy\" + before production → deployment gate + Security and compliance assessment.\n",
    "answerText": "D"
  },
  "495": {
    "stem": "Dùng Semantic Versioning (SemVer) cho dependency.\nCác thay đổi code (bảng Change1–Change3): Change1 thêm feature (breaking không đáng kể / tương thích), Change2 breaking rõ, Change3 không thêm feature (bug fix).\nTăng phần version nào cho từng change? Kéo Major/Minor/Patch.",
    "explanation": "Đáp án: Change1 Minor, Change2 Major, Change3 Patch\n\nĐề bài: SemVer cho dependency. Change1 thêm feature (incompatibility không đáng kể / không phải breaking lớn). Change2 breaking rõ. Change3 không thêm feature (bug fix).\n\nMINOR tăng khi thêm chức năng tương thích (Change1). MAJOR tăng khi breaking đáng kể (Change2). PATCH tăng khi sửa lỗi, không feature mới (Change3).\n\nKhông gán Patch cho feature, không gán Minor cho breaking lớn, không gán Major cho bug fix thuần.\n\nKeywords phản xạ nhanh (AZ-400)\n\"SemVer parts\" → feature Minor, breaking Major, bug fix Patch.\n",
    "boxes": {
      "1": {
        "label": "Change1:",
        "answer": "Minor"
      },
      "2": {
        "label": "Change2:",
        "answer": "Major"
      },
      "3": {
        "label": "Change3:",
        "answer": "Patch"
      }
    },
    "answerText": "Minor, Major, Patch"
  },
  "496": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario, mỗi câu một giải pháp; có thể không có đáp án đúng. Không quay lại câu trước.\n\nBạn có Azure pipeline deploy web app. Pipeline có test suite TestSuite1 để validate web app. TestSuite1 fail không ổn định. Failure không liên quan thay đổi source code hay execution environment.\nCần giảm công sức troubleshooting cho các failure của TestSuite1.\nGiải pháp: Bật flaky test management.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: A — Yes\n\nĐề bài: TestSuite1 fail gián đoạn, không liên quan thay đổi source hay execution environment. Cần minimize troubleshooting. Solution: enable flaky test management. Có đạt mục tiêu không?\n\nFlaky test pass/fail không theo code hay environment. Flaky test management trên Azure Test Plans / Pipelines tự phát hiện, retry, đánh dấu và report test không ổn định. Team không phải soi log tay từng lần fail ngẫu nhiên.\n\nSolution khớp đúng lớp sự cố đề mô tả, nên Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"intermittent failures\" + unrelated to code/environment → Yes, flaky test management.\n",
    "answerText": "A"
  },
  "497": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario, mỗi câu một giải pháp; có thể không có đáp án đúng. Không quay lại câu trước.\n\nBạn có Azure pipeline deploy web app. Pipeline có test suite TestSuite1 để validate web app. TestSuite1 fail không ổn định. Failure không liên quan thay đổi source code hay execution environment.\nCần giảm công sức troubleshooting cho các failure của TestSuite1.\nGiải pháp: Implement widget Test Results Trend.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề bài: cùng scenario TestSuite1 flaky. Solution: implement Test Results Trend widget.\n\nWidget vẽ pass/fail và duration theo thời gian. Nó cho thấy test không ổn định nhưng không retry, không isolate, không tự xử lý flaky.\n\nTroubleshooting từng lần fail vẫn thủ công. Widget không đạt minimize troubleshooting, nên No.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Test Results Trend widget\" + flaky suite → No.\n",
    "answerText": "B"
  },
  "498": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario, mỗi câu một giải pháp; có thể không có đáp án đúng. Không quay lại câu trước.\n\nBạn có Azure pipeline deploy web app. Pipeline có test suite TestSuite1 để validate web app. TestSuite1 fail không ổn định. Failure không liên quan thay đổi source code hay execution environment.\nCần giảm công sức troubleshooting cho các failure của TestSuite1.\nGiải pháp: Bật Test Impact Analysis (TIA).\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: A — Yes\n\nĐề bài: cùng scenario TestSuite1 fail gián đoạn, không bám code hay environment. Cần giảm troubleshooting. Solution: enable Test Impact Analysis (TIA). Theo key của đề: Yes.\n\nTIA chỉ chạy những test bị ảnh hưởng bởi changeset. Tập TestSuite1 thu hẹp theo từng build, nên số lần soi kết quả nhiễu của cả suite giảm so với luôn chạy full.\n\nĐó là cách đề map TIA với “minimize troubleshooting effort” cho series này. (TIA không sửa bản chất flaky; key vẫn là Yes.)\n\nKeywords phản xạ nhanh (AZ-400)\n\"Test Impact Analysis\" + minimize TestSuite1 troubleshooting → Yes (exam key).\n",
    "answerText": "A"
  },
  "499": {
    "stem": "Định publish build artifacts bằng Azure pipeline. Cần file .artifactignore:\n• Include mọi file trong build output folder và subfolder.\n• Exclude file đuôi .dll.\nNên ghi gì trong file?",
    "options": {
      "A": "./** !*.dll",
      "B": "**/* !*.dll",
      "C": "*/** *.dll",
      "D": "**/* #*.dll"
    },
    "explanation": "Đáp án: B — **/* !*.dll\n\nĐề bài: .artifactignore phải gồm mọi file trong build output và thư mục con, nhưng loại file .dll.\n\nTheo đáp án đề: **/* chọn mọi file đệ quy; !*.dll loại trừ extension .dll. Hai dòng đó khớp “include all, exclude .dll”.\n\n./** !*.dll dùng ./ đi ra ngoài hoặc sai phạm vi output. */** *.dll thiên về include đúng file .dll, ngược yêu cầu. **/* #*.dll: # là comment, không exclude .dll.\n\nKeywords phản xạ nhanh (AZ-400)\n\".artifactignore\" + include all exclude .dll → **/* !*.dll.\n",
    "answerText": "B"
  },
  "500": {
    "stem": "Có GitHub repository. Định tạo container và dùng GitHub Actions deploy lên GitHub Container Registry.\nHoàn thành script. Chọn option trong answer area.",
    "explanation": "Đáp án: echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin; docker build . --file Dockerfile --tag ${{ github.repository }}:latest --label \"runnumber=${{ github.run_number}}\"; docker push ghcr.io/${{ github.repository_owner }}/${{ github.repository }}:latest\n\nĐề bài: GitHub Actions deploy container lên GitHub Container Registry. Hoàn thành script.\n\nThứ tự chuẩn: login GHCR bằng GITHUB_TOKEN qua stdin, build image từ Dockerfile, rồi push ghcr.io/owner/repo:latest.\n\ndocker login không pipe password thì thiếu credential. azure/docker-login không phải luồng GHCR chuẩn trên exhibit. docker pull không deploy image mới.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub Container Registry\" + Actions → GITHUB_TOKEN login, docker build, docker push ghcr.io.\n",
    "boxes": {
      "1": {
        "label": "run:",
        "answer": "echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin"
      },
      "2": {
        "label": "run:",
        "answer": "docker build. --file Dockerfile --tag ${{ github.repository }}:latest --label &quot;runnumber=${{ github.run_number}}&quot;"
      },
      "3": {
        "label": "run:",
        "answer": "docker push ghcr.io/${{ github.repository_owner }}/${{ github.repository }}:latest"
      }
    },
    "answerText": "echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin, docker build. --file Dockerfile --tag ${{ github.repository }}:latest --label &quot;runnumber=${{ github.run_number}}&quot;, docker push ghcr.io/${{ github.repository_owner }}/${{ github.repository }}:latest"
  },
  "501": {
    "stem": "Lưu ý: Chuỗi câu cùng scenario, mỗi câu một giải pháp; có thể không có đáp án đúng. Không quay lại câu trước.\n\nBạn có Azure pipeline deploy web app. Pipeline có test suite TestSuite1 để validate web app. TestSuite1 fail không ổn định. Failure không liên quan thay đổi source code hay execution environment.\nCần giảm công sức troubleshooting cho các failure của TestSuite1.\nGiải pháp: Tăng code coverage.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề bài: cùng TestSuite1 flaky. Solution: increase code coverage.\n\nTăng coverage thêm test và điểm phủ code. Flaky đến từ race, timing hoặc phụ thuộc ngoài, không hết khi viết thêm test. Thêm test còn thể tăng fail nhiễu.\n\nCoverage không giảm troubleshooting cho failure không liên quan code, nên No.\n\nKeywords phản xạ nhanh (AZ-400)\n\"increase code coverage\" + intermittent TestSuite1 → No.\n",
    "answerText": "B"
  },
  "502": {
    "stem": "Azure pipeline build/deploy App1. Build job dùng Microsoft-hosted Windows agent, thỉnh thoảng timeout.\nCần build hoàn thành, giảm administrative effort.\nBạn nên làm gì?",
    "options": {
      "A": "Change the configuration of the build agent.",
      "B": "Deploy a self-hosted agent.",
      "C": "Change to a Microsoft-hosted Linux agent.",
      "D": "Purchase more parallel jobs."
    },
    "explanation": "Đáp án: D — Purchase more parallel jobs\n\nĐề bài: build App1 trên Microsoft-hosted Windows agent đôi khi timeout. Cần build xong và minimize administrative effort.\n\nTimeout gián đoạn trên hosted pool thường do job chờ agent khi hết parallel job. Mua thêm parallel jobs tăng số job đồng thời, giảm queue và timeout. Microsoft quản lý agent, gần như không thêm admin.\n\nKhông cấu hình được Microsoft-hosted agent. Self-hosted hết chờ pool công cộng nhưng phải tự giữ VM. Đổi Linux không tăng capacity Windows và có thể lệch toolchain của App1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Microsoft-hosted\" + intermittent timeout + minimize admin → purchase more parallel jobs.\n",
    "answerText": "D"
  },
  "503": {
    "stem": "Subscription có Pipeline1 và User1. Pipeline1 build/test App1. User1 là Contributors trên Pipeline1.\nĐịnh test App1 bằng Azure Deployment Environments. Cần User1 provision được environment, least privilege.\nGán role nào cho User1?",
    "options": {
      "A": "DevCenter Project Admin",
      "B": "Deployment Environments User",
      "C": "Contributors",
      "D": "Build Administrators"
    },
    "explanation": "Đáp án: B — Deployment Environments User\n\nĐề bài: User1 đã là Contributors trên Pipeline1. Cần User1 provision Azure Deployment Environments environment, least privilege.\n\nDeployment Environments User đủ tạo và dùng environment ADE, đúng phạm vi provision, không admin cả Dev Center.\n\nDevCenter Project Admin quá rộng. Contributors và Build Administrators là role Azure DevOps trên pipeline, không cấp quyền provision ADE.\n\nKeywords phản xạ nhanh (AZ-400)\n\"provision ADE environment\" + least privilege → Deployment Environments User.\n",
    "answerText": "B"
  },
  "504": {
    "stem": "Subscription có Azure DevOps build pipelines. Cần pipeline caching bằng Cache task.\nHoàn thành YAML. Chọn option trong answer area.",
    "explanation": "Đáp án: key:, path:\n\nĐề bài: hoàn thành YAML Cache task cho pipeline caching.\n\nCache@2 bắt buộc key: (fingerprint, ví dụ yarn | Agent.OS | yarn.lock) và path: (thư mục cache, ví dụ $(YARN_CACHE_FOLDER)).\n\nrestoreKeys chỉ là fallback prefix khi miss exact key, không thay key. directory, folder, location không phải tên input của task.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Cache task\" + YAML → key: + path:.\n",
    "boxes": {
      "1": {
        "label": "\"yarn\" | Agent.OS | yarn.lock",
        "answer": "key:"
      },
      "2": {
        "label": "$(YARN_CACHE_FOLDER)",
        "answer": "path:"
      }
    },
    "answerText": "key:, path:"
  },
  "505": {
    "stem": "Management group có bốn Azure subscription; mỗi subscription bốn resource group.\nĐịnh deploy một instance App1 vào mỗi resource group bằng Bicep:\n• Tên mỗi App1 instance phải nhất quán theo từng subscription và resource group.\n• Tên App Service plan host App1 phải nhất quán.\nHoàn thành template. Chọn option trong answer area.",
    "explanation": "Đáp án: uniqueString(subscription().id), uniqueString(resourceGroup().id)\n\nĐề bài: bốn subscription, mỗi subscription bốn resource group. Deploy App1 vào mọi resource group. Tên từng instance App1 phải nhất quán theo từng subscription và resource group; tên App Service plan cũng nhất quán.\n\nuniqueString ổn định theo input. Plan name dùng uniqueString(subscription().id) để mọi resource group trong cùng subscription ra cùng tên plan. App name dùng uniqueString(resourceGroup().id) để cùng resource group luôn ra cùng tên app, khác resource group thì khác id.\n\ndeployment().name đổi theo mỗi lần deploy, không ổn định. Literal 'resourceGroupName' không gắn uniqueString với resource group thật.\n\nKeywords phản xạ nhanh (AZ-400)\n\"consistent names\" + Bicep multi-sub/RG → uniqueString(subscription().id) + uniqueString(resourceGroup().id).\n",
    "boxes": {
      "1": {
        "label": "planname uniqueString",
        "answer": "(subscription().id)')"
      },
      "2": {
        "label": "appname uniqueString",
        "answer": "(resourceGroup().id)')"
      }
    },
    "answerText": "(subscription().id)'), (resourceGroup().id)')"
  },
  "1": {
    "explanation": "Đáp án: Cycle time\n\nĐề cần cấu hình một chart widget trên Azure DevOps dashboard để đo elapsed time hoàn thành work items sau khi chúng trở thành active.\n\nCycle time đo thời gian một work item đi từ một stage sang stage khác, thường từ Active đến Done. Metric này khớp trực tiếp yêu cầu đo thời gian hoàn thành sau khi item đã active.\n\nCumulative Flow Diagram chỉ thể hiện số work items theo từng state theo thời gian, không cho elapsed time của từng item. Burnup theo dõi tổng scope đã hoàn thành so với tổng scope cần làm, không đo thời gian xử lý. Burndown theo dõi work còn lại trong sprint hoặc release so với thời gian còn lại, cũng không đo thời gian từ Active đến Complete.\n\nKeywords phản xạ nhanh (AZ-400)\n\"elapsed time\" + \"once they become active\" → Cycle time.\n"
  },
  "2": {
    "explanation": "Đáp án: Lead time\n\nĐề kiểm tra đoạn gạch chân: widget Burnup đo elapsed time từ lúc tạo work items đến khi hoàn thành. Cần xác nhận đúng hay chọn thuật ngữ thay thế.\n\nBurnup không đo elapsed time. Widget này vẽ lượng work đã hoàn thành theo thời gian so với tổng scope. Lead time mới là metric từ lúc work item được tạo đến khi hoàn thành, tức thời gian đi hết workflow.\n\nNo adjustment required sai vì đoạn gạch chân không đúng. Test results trend theo dõi kết quả test và chất lượng theo thời gian, không đo thời gian vòng đời work item. Burndown theo dõi work còn lại, không đo thời gian từ creation đến completion.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Burnup\" + \"creation of work items to their completion\" → Lead time.\n"
  },
  "3": {
    "explanation": "Đáp án: License procurement\n\nĐề hỏi việc nào trong quản lý user và license của Azure DevOps không thể tự động hóa khi team lớn và thường xuyên thêm người.\n\nLicense procurement là giao dịch mua license với Microsoft. Có thể gắn billing và subscription, nhưng quyết định mua và hoàn tất purchase vẫn cần thao tác thủ công.\n\nGroup membership changes tự động được khi Azure DevOps dùng Microsoft Entra ID (Azure AD) groups. License assignment tự động được bằng group rules sau khi license đã có. Assigning entitlements cũng gán theo group membership. Chỉ procurement nằm ngoài automation trong Azure DevOps.\n\nKeywords phản xạ nhanh (AZ-400)\n\"users and licenses\" + \"can't be automated\" → License procurement.\n"
  },
  "4": {
    "explanation": "Đáp án: Static code analysis\n\nĐề cần loại security tool phù hợp giai đoạn Continuous Integration (CI).\n\nStatic code analysis kiểm tra source code trước khi compile và deploy, không cần ứng dụng đang chạy. Tool gắn vào CI pipeline, phát hiện lỗ hổng sớm theo shift-left, chặn insecure code merge vào main.\n\nPenetration testing cần hệ thống đang chạy, thường ở giai đoạn test hoặc production. Threat modeling thuộc design, xác định threat và attack vector chứ không phân tích code trong CI. Dynamic code analysis cũng cần runtime nên phù hợp giai đoạn sau CI.\n\nKeywords phản xạ nhanh (AZ-400)\n\"security tool\" + \"Continuous Integration (CI)\" → Static code analysis.\n"
  },
  "5": {
    "explanation": "Đáp án: Using the TFS Database Import Service to perform the upgrade.\n\nĐề cần cách migrate TFS artifacts, giữ changeset dates và work item revision dates, đồng thời giảm migration effort. Đã đề xuất upgrade TFS lên RTW mới nhất.\n\nTFS Database Import Service là phương pháp Microsoft khuyến nghị để đưa TFS on-premises database sang Azure DevOps Services với high-fidelity history gồm version control, work items, builds và tests.\n\nInstalling the TFS kava SDK không tồn tại. Upgrading PowerShell Core hữu ích cho script kiểm tra, không phải cơ chế chuyển database. TFS Integration Platform đã deprecated và dùng để sync giữa các hệ, không phải full-fidelity migration giữ dates.\n\nKeywords phản xạ nhanh (AZ-400)\n\"preserve changesets dates\" + \"all TFS artifacts\" → TFS Database Import Service.\n"
  },
  "6": {
    "explanation": "Đáp án: A self-hosted agent; An External Git service connection\n\nĐề cần tích hợp Azure DevOps với Bitbucket Server on-premises khi firewall chặn inbound Internet traffic, để quản lý build và release.\n\nSelf-hosted agent chạy trong mạng nội bộ nên clone được Git trên Bitbucket Server mà Azure DevOps hosted agent không vào được vì inbound bị chặn. External Git service connection khai báo Bitbucket như một Git endpoint để pipeline checkout source.\n\nHosted agent trên Microsoft-hosted pool không mở được inbound tới Bitbucket Server sau firewall. Service connection kiểu GitHub hoặc Azure Repos không mô tả đúng Bitbucket Server on-premises.\n\nKeywords phản xạ nhanh (AZ-400)\n\"on-premises Bitbucket Server\" + \"block inbound Internet traffic\" → A self-hosted agent + An External Git service connection.\n"
  },
  "7": {
    "explanation": "Đáp án: CMMI\n\nĐề cần work item process trên Azure DevOps để track requirements, change requests, risks và reviews.\n\nCMMI là process formal nhất trong các template mặc định. Process này có work item types và workflow riêng cho Requirement, Change Request, Risk và Review, đúng phạm vi đề.\n\nBasic chỉ có Issue, Task và Epic, quá hẹp. Agile tập trung User Story, Bug và Feature, không có tracking formal cho risk và review như CMMI. Scrum dùng Product Backlog Item và Bug trên sprint, cũng không có bộ work item compliance đó.\n\nKeywords phản xạ nhanh (AZ-400)\n\"requirements, change requests, risks, and reviews\" → CMMI.\n"
  },
  "8": {
    "explanation": "Đáp án: No\n\nĐề cần test servers luôn đúng configuration dù có configuration drift. Solution đặt -ConfigurationMode thành ApplyOnly.\n\nApplyOnly apply Desired State Configuration một lần rồi dừng. Drift sau đó không được tự sửa, nên không đạt mục tiêu giữ desired state liên tục.\n\nĐể tự remediate drift cần ApplyAndAutoCorrect. ApplyAndMonitor chỉ phát hiện và ghi nhận lệch. ApplyOnly phù hợp khi chỉ muốn apply một lần, không phải khi phải chống drift.\n\nKeywords phản xạ nhanh (AZ-400)\n\"configuration drift\" + \"ApplyOnly\" → No.\n"
  },
  "9": {
    "explanation": "Đáp án: No\n\nĐề vẫn yêu cầu test servers đúng configuration bất kể configuration drift. Solution đặt -ConfigurationMode thành ApplyAndMonitor.\n\nApplyAndMonitor apply configuration rồi giám sát lệch so với desired state, nhưng chỉ report, không tự sửa. Server có thể lệch mà không được đưa về đúng.\n\nMục tiêu “remain correctly configured” cần ApplyAndAutoCorrect. ApplyOnly còn yếu hơn vì không monitor. ApplyAndMonitor chỉ cho visibility, không đủ để giữ cấu hình.\n\nKeywords phản xạ nhanh (AZ-400)\n\"configuration drift\" + \"ApplyAndMonitor\" → No.\n"
  },
  "11": {
    "explanation": "Đáp án: Hosted Windows Container\n\nĐề kiểm tra đoạn gạch chân: compile IIS web application chạy Docker thì dùng Default build agent pool.\n\nDefault pool không đảm bảo agent có Docker và Windows containers cho IIS. Hosted Windows Container (Microsoft-hosted Windows container image) đã có Windows Server, Docker daemon và khả năng build IIS trong container.\n\nNo adjustment required sai vì Default không phải lựa chọn đúng. Hosted là Windows generic, chưa chắc bật container features. Hosted macOS dành cho macOS và iOS, không phù hợp IIS trên Windows containers.\n\nKeywords phản xạ nhanh (AZ-400)\n\"IIS web application that runs docker\" + \"Default build agent pool\" → Hosted Windows Container.\n"
  },
  "12": {
    "explanation": "Đáp án: Configure conditional access in Azure Active Directory.\n\nĐề yêu cầu Azure DevOps chỉ truy cập được từ thiết bị trên mạng on-premises của công ty, trong khi user đã dùng Azure Active Directory.\n\nConditional Access tạo named location theo dải IP on-premises rồi policy chỉ cho phép truy cập Azure DevOps từ named location đó. Truy cập từ mạng khác bị chặn.\n\nAssign the devices to a security group quản lý quyền, không giới hạn theo network location. Create a GPO điều khiển máy on-premises, không chặn truy cập cloud Azure DevOps. Configure Security in Project Settings chỉ phân quyền trong project, không lọc theo nguồn mạng.\n\nKeywords phản xạ nhanh (AZ-400)\n\"only be accessed from devices connected to the company's on-premises network\" → Conditional Access in Azure Active Directory.\n"
  },
  "13": {
    "explanation": "Đáp án: Github Enterprise\n\nĐề cần version control lưu source trên managed Windows server trong mạng công ty, dùng cùng Azure Pipelines.\n\nGitHub Enterprise Server cài on-premises trên Windows server do công ty quản lý, source nằm sau firewall và vẫn kết nối Azure Pipelines.\n\nBitbucket Cloud và GitHub Professional (GitHub.com) host trên cloud, không đặt repo trên Windows server nội bộ. Git in Azure Repos lưu trên Azure DevOps Services, cũng không phải server Windows trong mạng công ty.\n\nKeywords phản xạ nhanh (AZ-400)\n\"source code\" + \"managed Windows server\" + \"company network\" → Github Enterprise.\n"
  },
  "14": {
    "explanation": "Đáp án: boards\n\nĐề kiểm tra đoạn gạch chân: khi chuyển sang Azure DevOps thì JIRA phải được thay bằng build pipelines.\n\nJIRA là công cụ issue tracking và planning. Analog trong Azure DevOps là Azure Boards, không phải build pipelines. Build pipelines làm CI, không thay tracking work items.\n\nNo adjustment required sai. Repos là source control. Release pipelines là CD. Cả hai không thay JIRA. Có thể giữ JIRA và integrate, nhưng nếu thay thì thay bằng Boards.\n\nKeywords phản xạ nhanh (AZ-400)\n\"JIRA must be replaced\" + \"build pipelines\" → boards.\n"
  },
  "15": {
    "explanation": "Đáp án: npm install\n\nĐề cần chỉ scan production dependencies bằng WhiteSource Bolt.\n\nWhiteSource Bolt (Mend Bolt) scan thư viện đã có trên máy. Lệnh npm install với cờ production (npm install --production) bỏ qua devDependencies, nên chỉ còn production packages trước khi scan.\n\nnpm edit mở package để chỉnh, không giới hạn production set. npm publish đẩy package lên registry. npm update cập nhật phiên bản, mặc định vẫn gồm devDependencies. Chỉ npm install (production) tạo đúng tập dependency cần scan.\n\nKeywords phản xạ nhanh (AZ-400)\n\"only production dependencies\" + \"WhiteSource Bolt\" → npm install (--production).\n"
  },
  "16": {
    "explanation": "Đáp án: Red/Black deployment\n\nĐề cần release strategy giảm thời gian deploy bản mới và rollback trong thời gian ngắn nhất.\n\nRed/Black (Blue/Green) giữ hai môi trường giống nhau. Bản mới deploy lên môi trường idle, kiểm tra xong thì switch traffic. Rollback là switch lại môi trường cũ còn nguyên, nên cả deploy lẫn rollback đều nhanh.\n\nRolling deployment cập nhật từng subset instance, thường lâu hơn. Big Bang deploy tất cả một lúc, rollback khó và rủi ro cao. Canary tăng dần traffic cho bản mới, phát hiện lỗi tốt nhưng không tối thiểu thời gian deploy và rollback như Red/Black.\n\nKeywords phản xạ nhanh (AZ-400)\n\"minimum\" + \"deploy\" + \"roll back in the shortest time\" → Red/Black deployment.\n"
  },
  "17": {
    "explanation": "Đáp án: You should make use of a gate.\n\nĐề đã có Azure Monitor alerts. Release mới phải đạt performance baseline ở staging trước khi lên production; bản không đạt phải bị chặn.\n\nRelease gate trong Azure Pipelines đánh giá điều kiện tự động, gồm Azure Monitor alerts hoặc query, trước khi sang stage production. Không đạt thì pipeline dừng.\n\nBranch control check ràng buộc nhánh source, không đánh giá runtime performance. Alert trigger chỉ thông báo, không chặn deploy. Approval check cần người duyệt, không tự so sánh performance baseline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"performance baseline\" + \"staging\" + \"prevented from being deployed\" → gate.\n"
  },
  "18": {
    "explanation": "Đáp án: deployment\n\nĐề kiểm tra đoạn gạch chân: deploy application lên nhiều Azure virtual machines thì tạo universal group.\n\nUniversal group là khái niệm Active Directory cho quyền user, không phải cơ chế deploy. Deployment group trong Azure Pipelines là tập máy đích đã register agent, pipeline deploy đồng loạt lên các máy đó.\n\nNo adjustment required sai. Security group phục vụ access control. Resource group chứa tài nguyên Azure, không đăng ký máy để release pipeline cài app.\n\nKeywords phản xạ nhanh (AZ-400)\n\"deploy an application\" + \"Azure virtual machines\" + \"universal group\" → deployment (deployment group).\n"
  },
  "19": {
    "explanation": "Đáp án: Yeoman; Terratest\n\nĐề chuẩn bị deploy Azure resource group bằng Terraform và cần cài các framework cần thiết.\n\nYeoman có generator tạo cấu trúc Terraform module và scaffolding cho Azure. Terratest (Go) viết integration test chống infrastructure thật: apply Terraform, kiểm tra HTTP hoặc SSH, rồi destroy.\n\nChỉ cài Terraform CLI chưa đủ theo đáp án đề. Framework khác không nằm trong keys. Yeoman hỗ trợ tạo module; Terratest hỗ trợ kiểm chứng resource group sau khi apply.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure resource group via Terraform\" + \"frameworks\" → Yeoman + Terratest.\n"
  },
  "20": {
    "explanation": "Đáp án: You should make use of views.\n\nĐề dùng một feed để phát hành nhiều builds của mỗi package, đồng thời hạn chế phát hành package đang development.\n\nAzure Artifacts views (ví dụ @Local, @Prerelease, @Release) tách phiên bản theo đối tượng. Package đang phát triển nằm ở view hạn chế; khi ổn định thì promote sang view release mà không upload lại.\n\nStatic code analysis và dynamic code analysis đánh giá chất lượng code, không kiểm soát visibility trên feed. Upstream sources lấy package từ feed ngoài, không hạn chế package development trong feed của bạn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"solitary feed\" + \"packages that are in development is restricted\" → views.\n"
  },
  "21": {
    "explanation": "Đáp án: WhiteSource\n\nĐề kiểm tra đoạn gạch chân: thêm Jenkins vào build pipeline để biết khi nào common open source libraries được thêm vào codebase.\n\nJenkins là CI server, không tự identify open-source libraries. WhiteSource (Mend) là Software Composition Analysis: scan dependency, version, license và lỗ hổng khi library được thêm vào.\n\nNo adjustment required sai. SourceGear Vault là source control. OWASP ZAP là web security scanner, không phải SCA cho open-source libraries.\n\nKeywords phản xạ nhanh (AZ-400)\n\"common open source libraries\" + \"Jenkins\" → WhiteSource.\n"
  },
  "22": {
    "explanation": "Đáp án: You should create a build task and use the WhiteSource Bolt service.\n\nĐề có build pipeline dùng khoảng năm mươi open-source libraries và cần scan common security weaknesses.\n\nWhiteSource Bolt gắn vào build pipeline, phân tích open-source về CVE và license ngay lúc build, trước khi artifact được phát hành.\n\nDeployment task chạy lúc release thì muộn. Chef là configuration management, không scan thư viện. Kết hợp build task với WhiteSource Bolt đúng cả thời điểm lẫn công cụ SCA.\n\nKeywords phản xạ nhanh (AZ-400)\n\"scan\" + \"open source libraries\" + \"security weaknesses\" → build task + WhiteSource Bolt.\n"
  },
  "23": {
    "explanation": "Đáp án: No adjustment required.\n\nĐề kiểm tra: Black Duck dùng để bảo đảm open-source libraries tuân thủ licensing criteria của công ty.\n\nBlack Duck (Synopsys) là SCA chuyên license compliance: nhận diện component, license và policy vi phạm. Đoạn gạch chân đúng, không cần sửa.\n\nMaven là Java build tool. Bamboo là CI server. CMAKE là native build system. Cả ba không enforce open-source licensing criteria như Black Duck.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Black Duck\" + \"open source libraries\" + \"licensing criteria\" → No adjustment required.\n"
  },
  "26": {
    "explanation": "Đáp án: Azure Application Insights\n\nĐề kiểm tra: front end trên Azure App Service, dùng Azure Event Hubs để pinpoint average load times của application pages.\n\nEvent Hubs chỉ ingest event stream, không tính page load times. Application Insights là APM đo page load, browser timing và server request duration.\n\nNo adjustment required sai. Azure Log Analytics có thể chứa telemetry nếu bạn tự gửi, nhưng không phải công cụ đo page load sẵn. Azure Advisor đưa khuyến nghị tối ưu, không cho metric load time chi tiết.\n\nKeywords phản xạ nhanh (AZ-400)\n\"average load times of the application pages\" + \"Azure Event Hubs\" → Azure Application Insights.\n"
  },
  "27": {
    "explanation": "Đáp án: No\n\nĐề dùng Azure SQL Database Intelligent Insights và Azure Application Insights, cần ngôn ngữ ad-hoc queries. Solution dùng Contextual Query Language (CQL).\n\nCQL không phải ngôn ngữ query của Azure Monitor, Application Insights hay Intelligent Insights. Application Insights và Log Analytics dùng Kusto Query Language (KQL).\n\nTransact-SQL query Azure SQL Database, không query telemetry Application Insights. CQL thuộc ngữ cảnh khác. Solution không đạt goal.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Intelligent Insights\" + \"Application Insights\" + \"Contextual Query Language (CQL)\" → No.\n"
  },
  "29": {
    "explanation": "Đáp án: No\n\nĐề cần đúng query language cho Intelligent Insights và Application Insights. Solution nêu “You use Azure Log Analytics”.\n\nAzure Log Analytics là workspace và trải nghiệm query, không phải query language. Goal hỏi ngôn ngữ. Intelligent Insights thường xem trên portal, không bắt buộc query qua Log Analytics.\n\nKQL mới là ngôn ngữ đúng. Chỉ nói dùng Azure Log Analytics không đáp ứng yêu cầu chọn query language cho cả hai dịch vụ.\n\nKeywords phản xạ nhanh (AZ-400)\n\"correct query language\" + \"Azure Log Analytics\" → No.\n"
  },
  "30": {
    "explanation": "Đáp án: Azure Logic Apps; Azure Application Insights\n\nĐề cần tự động gửi daily summary các exceptions của web application tới Microsoft Teams.\n\nApplication Insights thu thập exceptions của live app. Logic Apps chạy theo recurrence hàng ngày, query exceptions rồi post summary vào Teams channel.\n\nChỉ Application Insights không gửi Teams theo lịch. Chỉ Logic Apps không có nguồn exception. Pipeline hay App Center không phải cặp dịch vụ trong keys.\n\nKeywords phản xạ nhanh (AZ-400)\n\"summary of the exceptions\" + \"Microsoft Teams\" + \"daily\" → Azure Logic Apps + Azure Application Insights.\n"
  },
  "31": {
    "explanation": "Đáp án: The Microsoft Test & Feedback extension.\n\nĐề quản lý work items trên Azure DevOps cho mobile Android và iOS, cần crash reports, beta distribution và user feedback. Keys chọn Microsoft Test & Feedback extension.\n\nExtension gắn Chrome hoặc Edge để tester gửi bug, screenshot và feedback thẳng vào Azure Boards work items, đúng phần thu thập feedback trong vòng đời Azure DevOps.\n\nOWASP ZAP là scanner bảo mật web. TFS Integration Platform đồng bộ dữ liệu TFS cũ. Code Style là quy ước format code. Cả ba không thu thập crash, beta hay feedback như extension.\n\nKeywords phản xạ nhanh (AZ-400)\n\"user feedback\" + \"Azure DevOps\" + \"testers\" → Microsoft Test & Feedback extension.\n"
  },
  "32": {
    "explanation": "Đáp án: Lead Time; Cycle Time; Burndown\n\nĐề map metric dashboard Azure Boards: thời gian từ tạo work item đến hoàn thành, thời gian hoàn thành sau khi active, và remaining work.\n\nLead Time đo elapsed time từ creation đến completion. Cycle Time đo elapsed time sau khi item active đến khi done. Burndown thể hiện remaining work theo thời gian.\n\nVelocity đếm backlog items hoàn thành trong iteration, không phải elapsed time hay remaining work. CFD thể hiện số item theo state, không thay ba metric trên.\n\nKeywords phản xạ nhanh (AZ-400)\n\"creation of work items to their completion\" + \"once they are active\" + \"remaining work\" → Lead Time + Cycle Time + Burndown.\n"
  },
  "36": {
    "explanation": "Đáp án: Create an Azure Application Insights availability test and alert.\n\nĐề cần URL ping mỗi năm phút, alert khi web app unavailable từ một số Azure regions, và giảm development time.\n\nApplication Insights availability test (URL ping) chọn location, tần suất năm phút và gắn alert khi fail. Không cần viết code.\n\nAzure Monitor Availability metric không tạo multi-region URL ping sẵn như availability test. Azure Function deploy nhiều region tốn development. Service Health báo sự cố platform Azure, không ping URL app của bạn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"URL ping test\" + \"every five minutes\" + \"specific Azure regions\" → Application Insights availability test and alert.\n"
  },
  "37": {
    "explanation": "Đáp án: Azure Application Insights\n\nĐề multi-tier app, front end trên Azure App Service, cần average load times của application pages.\n\nApplication Insights thu browser page view timing và server request duration, cho average load time theo page.\n\nActivity log ghi thao tác quản trị resource. Diagnostics logs của App Service ghi IIS và HTTP, không cho page load trung bình sẵn. Azure Advisor không phải APM đo load time.\n\nKeywords phản xạ nhanh (AZ-400)\n\"average load times of the application pages\" → Azure Application Insights.\n"
  },
  "38": {
    "explanation": "Đáp án: Tạo Application Insights az400-123456789-main rồi gắn telemetry cho web app cùng tên.\n\nĐề yêu cầu instance Application Insights nhận telemetry từ Azure web app az400-123456789-main.\n\nTạo resource Application Insights trên portal với đúng name. Trong app, thêm Application Insights Telemetry (SDK hoặc portal) và chọn existing resource để instrumentation key / connection string trỏ đúng instance.\n\nChỉ tạo resource mà không đăng ký SDK thì không có telemetry. Chỉ bật App Service logs không thay Application Insights instance theo tên đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"create an instance of Azure Application Insights\" + \"receive telemetry data\" → Create Application Insights + configure App Insights SDK.\n"
  },
  "39": {
    "explanation": "Đáp án: IT Service Management Connector (ITSM)\n\nĐề dùng ServiceNow cho incident management. Cần ticket ServiceNow khi application fails to authenticate, chọn Azure Log Analytics solution.\n\nITSM Connector đồng bộ Azure Monitor alerts thành incident trên ServiceNow, gồm alert authentication failure từ Log Analytics.\n\nApplication Insights Connector xuất telemetry để phân tích, không tạo ticket ServiceNow. Automation & Control là nhóm automation rộng. Insight & Analytics là nhóm workspace, không phải connector ITSM.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ServiceNow\" + \"ticket\" + \"fails to authenticate\" → IT Service Management Connector (ITSM).\n"
  },
  "41": {
    "explanation": "Đáp án: Kusto Query Language (KQL)\n\nĐề cần viết ad-hoc queries trên monitoring data (ngữ cảnh Intelligent Insights và Application Insights).\n\nMonitoring logs trên Azure Monitor dùng KQL. Đây là ngôn ngữ ad-hoc đúng.\n\nPL/pgSQL dành cho PostgreSQL. PL/SQL dành cho Oracle. Transact-SQL dành cho SQL Server và Azure SQL Database, không query Application Insights telemetry.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ad-hoc queries\" + \"monitoring data\" → Kusto Query Language (KQL).\n"
  },
  "43": {
    "explanation": "Đáp án: Users; User Flows; Impact\n\nTheo keys, map các usage pane Application Insights: feature usage, số người dùng actions và features, và ảnh hưởng performance tới usage.\n\nUsers cho thấy ai dùng feature. User Flows cho số người đi qua các actions và features. Impact đo performance của page hoặc feature ảnh hưởng usage như thế nào.\n\nSessions mô tả phiên, không khớp ba nhãn trên. Funnels tập trung conversion step, không phải Impact. Keys chỉ định Users, User Flows và Impact.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Feature usage\" + \"people who used the actions\" + \"effect that the performance\" → Users + User Flows + Impact.\n"
  },
  "44": {
    "explanation": "Đáp án: Microsoft Visual Studio App Center integration\n\nĐề mobile Android và iOS trên Azure DevOps: collect crash reports, distribute beta releases, get user feedback.\n\nVisual Studio App Center (khi còn trên exam) có crash analytics, distribution groups cho beta, và in-app feedback, tích hợp Azure DevOps.\n\nMicrosoft Test & Feedback hỗ trợ manual feedback trên web, không đủ crash tự động và beta store. Application Insights widgets nghiêng server telemetry. Jenkins không có đủ ba khả năng mobile sẵn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"crash reports\" + \"Distribute beta releases\" + \"user feedback\" → Microsoft Visual Studio App Center integration.\n"
  },
  "46": {
    "explanation": "Đáp án: Metric alert trên web app az400-123456789-main, threshold 5 giây trong 5 phút, webhook https://contoso.com/notify\n\nĐề tạo notification khi peak average response time vượt năm giây trong cửa sổ năm phút, gọi webhook Contoso.\n\nTrên portal, tạo alert rule cho App Service, metric response time, aggregation phù hợp peak average, period 5 minutes, threshold 5, action webhook tới https://contoso.com/notify.\n\nActivity log alert không đo response time. Chỉ email action không gọi webhook. Sai resource name thì không monitor đúng app.\n\nKeywords phản xạ nhanh (AZ-400)\n\"peak average response time\" + \"five seconds\" + \"webhook\" → metric alert + action webhook.\n"
  },
  "47": {
    "explanation": "Đáp án: Tạo storage account az400lod123456789stor trong RG1lod123456789 rồi bật Boot diagnostics của VM1 trỏ tới account đó.\n\nĐề lưu boot diagnostics của VM1 trên storage account chỉ định.\n\nTạo general-purpose v2 storage account đúng name và resource group. Trên VM1, Support + troubleshooting, Boot diagnostics On, chọn storage account vừa tạo.\n\nDùng managed storage diagnostics khác name thì không khớp đề. Không bật Boot diagnostics thì account trống không nhận serial log.\n\nKeywords phản xạ nhanh (AZ-400)\n\"boot diagnostics\" + \"az400lod123456789stor\" + \"VM1\" → create storage account + enable Boot diagnostics.\n"
  },
  "48": {
    "explanation": "Đáp án: Diagnostic setting của db1, destination Log Analytics, category QueryStoreRuntimeStatistics\n\nĐề web app nối Azure SQL Database db1. Cần gửi Query Store runtime statistics tới Azure Log Analytics.\n\nMở db1, Diagnostics settings, Add diagnostic setting, chọn Send to Log Analytics, tick QueryStoreRuntimeStatistics, Save.\n\nArchive to storage hoặc Event Hubs không phải Log Analytics. Chỉ bật Basic metrics không gửi Query Store runtime statistics. Intelligent Insights trên portal không thay diagnostic category này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Query Store runtime statistics\" + \"Azure Log Analytics\" → Diagnostics settings + QueryStoreRuntimeStatistics.\n"
  },
  "49": {
    "explanation": "Đáp án: summarize; makelist(EventID)\n\nTheo keys, hoàn thiện KQL: sau lọc Event 12 giờ, dùng summarize và makelist(EventID) theo Computer.\n\nsummarize gom hàng. makelist(EventID) tạo danh sách EventID theo thứ tự đã order, thường by Computer. Đây là pattern pivot chuỗi event trên mỗi máy.\n\nrender chỉ vẽ chart. count() không tạo list EventID. project chỉ chọn cột. Keys yêu cầu summarize và makelist(EventID).\n\nKeywords phản xạ nhanh (AZ-400)\n\"Event | where TimeGenerated\" + \"by Computer\" → summarize + makelist(EventID).\n"
  },
  "50": {
    "explanation": "Đáp án: requests; success == false\n\nTheo keys, query Application Insights lấy failed requests: bảng requests và điều kiện success == false.\n\nBảng requests chứa server request. success == false (hoặc \"False\") lọc request thất bại để làm alert hoặc báo cáo.\n\nBảng exceptions chỉ exception, không đủ mọi failed request. Lọc theo resultCode riêng lẻ dễ sót. Keys chỉ định requests và success == false.\n\nKeywords phản xạ nhanh (AZ-400)\n\"failed requests\" + \"Application Insights\" → requests + success == false.\n"
  },
  "53": {
    "explanation": "Đáp án: Add the Azure Boards app to the repository.\n\nĐề private GitHub repository, cần display commit status trên Azure Boards. Hỏi việc làm first.\n\nAzure Boards GitHub app tạo kết nối chính thức: Boards đọc commit và hiển thị status khi commit message gắn work item. Đây là bước đầu.\n\nMFA chỉ bảo vệ account GitHub. Azure Pipelines app phục vụ CI, không phải bước first cho Boards commit status. GitHub Action tự gọi API phức tạp hơn app dành riêng.\n\nKeywords phản xạ nhanh (AZ-400)\n\"commit status\" + \"Azure Boards\" + \"GitHub repository\" → Add the Azure Boards app.\n"
  },
  "54": {
    "explanation": "Đáp án: From Microsoft Teams, run @azure pipelines subscriptions.\n\nĐề đã subscribe Project1 trong Teams. Cần chỉ nhận events về failed builds. Hỏi việc làm first.\n\n@azure pipelines subscriptions liệt kê subscription hiện có để bạn update filter, ví dụ chỉ Failed. Đây là bước mở cấu hình hiện tại.\n\n@azure pipelines subscribe URL chỉ tạo subscription mới, không chỉnh filter. Publish Build Artifacts và enable CI không liên quan lọc Teams events.\n\nKeywords phản xạ nhanh (AZ-400)\n\"only receive events about failed builds\" + \"Microsoft Teams\" → @azure pipelines subscriptions.\n"
  },
  "55": {
    "explanation": "Đáp án: From Microsoft Teams, configure a connector\n\nĐề organization Contoso cần Teams notifications khi work items được updated.\n\nAzure DevOps connector (hoặc Azure Boards connector) trong Teams channel chọn organization, project và event Work item updated.\n\nService hook generic đẩy ra webhook, vòng hơn connector Teams. External access chỉ cho guest vào tenant. Add a channel không gửi notify. Cài extension trên Azure DevOps không phải cách chính cho work item notify tới Teams theo đáp án.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Microsoft Teams notifications\" + \"work items are updated\" → configure a connector.\n"
  },
  "57": {
    "explanation": "Đáp án: Send to Log Analytics\n\nĐề web app dùng Azure SQL. Cần alert khi có 10.000 simultaneous connections, minimize development effort. Chọn destination trong Diagnostics settings.\n\nSend to Log Analytics cho phép metric alert hoặc log alert trên connection count bằng KQL, không viết app.\n\nStream to an event hub cần thêm consumer để đếm và alert. Archive to a storage account chỉ lưu file, không alert trực tiếp. Cả hai tốn development hơn Log Analytics.\n\nKeywords phản xạ nhanh (AZ-400)\n\"10,000 simultaneous connections\" + \"Diagnostics settings\" → Send to Log Analytics.\n"
  },
  "59": {
    "explanation": "Đáp án: the Dependency agent\n\nĐề VM đã có Log Analytics agent, định deploy Service Map. Hỏi agent nào cần thêm.\n\nService Map (VM insights map) cần Dependency agent để khám phá process và connection inbound/outbound.\n\nTelegraf thu metric Influx. Windows Azure diagnostics extension thu perf log cổ điển. Azure Monitor agent thu logs/metrics nhưng theo keys của đề, Service Map vẫn cần Dependency agent.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Service Map\" + \"virtual machine\" → Dependency agent.\n"
  },
  "60": {
    "explanation": "Đáp án: Name System.Debug; Value true\n\nĐề bật detailed logging bằng pipeline variable.\n\nBiến predefined System.Debug = true bật debug logging cho mọi task trong Azure Pipelines.\n\nsystem.debug sai hoa thường vẫn thường được chấp nhận, nhưng keys là System.Debug. Giá trị false tắt verbose. Biến tự đặt khác tên không bật engine debug.\n\nKeywords phản xạ nhanh (AZ-400)\n\"detailed logging\" + \"pipeline variable\" → System.Debug = true.\n"
  },
  "61": {
    "explanation": "Đáp án: Import the Firebase module to UIApplicationDelegate.\n\nĐề capture crash-free users, custom events và breadcrumbs (ngữ cảnh iOS/Firebase).\n\nFirebase SDK (Analytics và Crashlytics) khởi tạo trong UIApplicationDelegate lúc launch. Import module và configure app để thu crash-free users, custom events và breadcrumbs từ đầu phiên.\n\nChỉ sửa xcworkspace không khởi tạo SDK. GoogleAnalytics pod cũ không đủ Crashlytics breadcrumbs. Cấu hình Crashlytics pod riêng thiếu Firebase module trong delegate theo đáp án.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Crash-free users\" + \"Custom events\" + \"Breadcrumbs\" → Import the Firebase module to UIApplicationDelegate.\n"
  },
  "62": {
    "explanation": "Đáp án: Install the Dependency Tracker extension and create dependencies for each project.\n\nĐề nhiều teams, nhiều projects trên Azure DevOps. Cần plan consumers và producers, có overview mọi projects.\n\nDependency Tracker extension tạo và visualize dependency giữa work items across projects, đúng consumers/producers overview.\n\nPredecessor/Successor link trong một project không cho overview đa project. Parent/Child là hierarchy, không phải consumer/producer. Custom query và widget không quản lý dependency xuyên project như extension.\n\nKeywords phản xạ nhanh (AZ-400)\n\"consumers and producers\" + \"overview of all the projects\" → Dependency Tracker extension.\n"
  },
  "65": {
    "explanation": "Đáp án: OpenTelemetry; OpenCensus\n\nĐề microservices dùng nhiều tracing libraries. Cần libraries integrate trực tiếp với Application Insights.\n\nAzure Monitor hỗ trợ exporter OpenTelemetry và vẫn nhận OpenCensus. Đây là hai thư viện integrate trực tiếp theo đề.\n\nHoneycomb là backend riêng. OpenTracing cần bridge. Jaeger là backend tracing, không native Application Insights. OpenTelemetry và OpenCensus là cặp keys.\n\nKeywords phản xạ nhanh (AZ-400)\n\"integrate directly with Application Insights\" + \"tracing libraries\" → OpenTelemetry + OpenCensus.\n"
  },
  "66": {
    "explanation": "Đáp án: From the code repository of webapp1, modify the Startup.cs file.\n\nĐề webapp1 .NET Core gửi telemetry tới AppInsights1. Cần fixed sampling rate.\n\nTrên ASP.NET Core, fixed-rate sampling cấu hình trong startup (TelemetryProcessor UseSampling). ApplicationInsights.config là .NET Framework.\n\nUsage and estimated costs là ingestion sampling phía service, không phải fixed-rate SDK như đề. Continuous export không đổi sampling lúc gửi.\n\nKeywords phản xạ nhanh (AZ-400)\n\".NET Core\" + \"fixed sampling rate\" → modify Startup.cs.\n"
  },
  "67": {
    "explanation": "Đáp án: Logs; where timestamp > ago(2d); join (Events); where continent == 'Asia'; on RequestId\n\nĐề query Workspace1: log entries liên quan Asia trong hai ngày gần nhất, bảng Events và Logs.\n\nBắt đầu từ Logs, lọc timestamp hai ngày, join Events đã lọc continent Asia, khóa RequestId. Thứ tự lọc sớm rồi join đúng best practice KQL.\n\nJoin trước khi lọc thời gian quét nhiều hơn. Sai khóa join làm lệch log-event. Keys đúng thứ tự năm mệnh đề trên.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Logs\" + \"Asia\" + \"last two days\" → Logs | where ago(2d) | join Events on RequestId.\n"
  },
  "69": {
    "explanation": "Đáp án: startup.cs\n\nĐề monitor App1 bằng Application Insights instance AI1. Hỏi file nào sửa để App1 dùng AI1.\n\nstartup.cs đăng ký services.AddApplicationInsightsTelemetry() và gắn AI1. Đây là chỗ initialize SDK .NET.\n\nappsettings.json chứa instrumentation key nhưng không tự đăng ký service. launchSettings.json chỉ launch profile. project.json là project file cũ, không cấu hình telemetry runtime.\n\nKeywords phản xạ nhanh (AZ-400)\n\"configure App1 to use AI1\" → startup.cs.\n"
  },
  "71": {
    "explanation": "Đáp án: timestamp >= ago(1hr); project\n\nĐề query requests App1 từ London và Paris trả 404, chỉ một giờ gần nhất, trả timestamp, url, resultCode, duration.\n\nwhere timestamp >= ago(1hr) cắt cửa sổ một giờ. project chọn đúng bốn field yêu cầu.\n\nextend thêm cột tính toán, không thu hẹp output. ago(1d) quá rộng. Keys chọn timestamp filter và project.\n\nKeywords phản xạ nhanh (AZ-400)\n\"last hour\" + \"timestamp url, resultCode, and duration\" → timestamp >= ago(1hr) + project.\n"
  },
  "73": {
    "explanation": "Đáp án: the secret key of WS1; the ID of WS1\n\nĐề cài Microsoft Enterprise Cloud Monitoring extension trên VM1, nối Log Analytics workspace WS1.\n\nExtension cổ điển cần Workspace ID và Workspace key (secret) để agent gửi data tới WS1.\n\nSubscription ID không authenticate workspace. System-assigned managed identity dùng cho Azure Monitor agent hiện đại, không phải hai giá trị required theo keys. Resource ID của VM1 không điền vào cấu hình workspace.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Enterprise Cloud Monitoring extension\" + \"Log Analytics workspace\" → workspace ID + secret key.\n"
  },
  "74": {
    "explanation": "Đáp án: Events\n\nĐề App1 dùng Application Insights. Cần analyze how often a page is accessed.\n\nEvents (custom events / page view events) đếm số lần page hoặc event được ghi, đúng tần suất truy cập.\n\nSessions đếm phiên, một phiên nhiều page. Impact đo ảnh hưởng performance tới conversion. Users đếm người dùng unique, không phải how often page được access.\n\nKeywords phản xạ nhanh (AZ-400)\n\"how often a page\" + \"accessed\" → Events.\n"
  },
  "76": {
    "explanation": "Đáp án: Cycle time; Velocity; Lead time\n\nĐề widget: thời gian close work item, số completed backlog items, thời gian restore failed services.\n\nCycle time đo thời gian đóng work item sau khi làm. Velocity đếm completed backlog items theo iteration. Keys map “restore failed services” sang Lead time (theo đáp án đề).\n\nCFD không đếm velocity. Sprint burndown là remaining work. MTTR widget không nằm trong keys. Phải theo Cycle time, Velocity, Lead time.\n\nKeywords phản xạ nhanh (AZ-400)\n\"close a work item\" + \"completed backlog items\" + \"restore failed services\" → Cycle time + Velocity + Lead time.\n"
  },
  "77": {
    "explanation": "Đáp án: Availability and Performance\n\nĐề App Service App1, cần biết khi nào App1 offline, minimize administrative effort.\n\nApp Service diagnostics, category Availability and Performance, có Web App Down và downtime history sẵn, không viết query.\n\nNavigator chỉ điều hướng. Configuration and Management nói về setting. Diagnostic Tools gồm profiler và logs, không phải category downtime sẵn như Availability and Performance.\n\nKeywords phản xạ nhanh (AZ-400)\n\"when App1 was offline\" + \"App Service diagnostics\" → Availability and Performance.\n"
  },
  "78": {
    "explanation": "Đáp án: PromQL\n\nĐề AKS1 thu metrics bằng Azure Monitor managed service for Prometheus. Cần query language để analyze performance.\n\nManaged Prometheus dùng PromQL trên workspace Prometheus.\n\nPL/SQL là Oracle. SparkQL không dùng cho Prometheus. KQL dùng Azure Monitor Logs và Data Explorer, không phải Prometheus metrics workspace.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Monitor managed service for Prometheus\" → PromQL.\n"
  },
  "79": {
    "explanation": "Đáp án: Six; timespan\n\nTheo keys, đọc output query: số cột trả về là Six, kiểu Duration là timespan.\n\nproject hoặc output exhibit có sáu cột. Trong KQL, duration của request là timespan, không phải datetime hay string.\n\nNếu chỉ đếm bốn cột trong snippet thì vẫn theo keys Six. real hoặc long không đúng kiểu Duration.\n\nKeywords phản xạ nhanh (AZ-400)\n\"columns will be returned\" + \"Duration column\" → Six + timespan.\n"
  },
  "88": {
    "explanation": "Đáp án: an HTTP trigger\n\nĐề Logic App gửi email khi availability bị degraded (Application Insights test gọi Logic App).\n\nAvailability alert gọi webhook HTTP POST. HTTP trigger trên Logic App mở endpoint nhận POST đó.\n\nHTTPWebhook trigger dùng subscribe/unsubscribe handshake, không khớp POST thẳng từ alert. Request trigger là tên cũ/lẫn. ApiConnection trigger nối connector Azure, không phải URL webhook từ availability test.\n\nKeywords phản xạ nhanh (AZ-400)\n\"availability is degraded\" + \"logic app\" → HTTP trigger.\n"
  },
  "89": {
    "explanation": "Đáp án: Add a liveness probe to the YAML configuration of App1.\n\nĐề App1 container trên ACI1. Cần restart ACI1 khi App1 stops responding.\n\nlivenessProbe trong YAML (ACI hỗ trợ) fail thì runtime restart container. Đúng “stops responding”.\n\nreadinessProbe chỉ cắt traffic, không restart. Connection Monitor và IP flow verify là Network Watcher, không restart container khi app treo.\n\nKeywords phản xạ nhanh (AZ-400)\n\"restart ACI1\" + \"App1 stops responding\" → liveness probe.\n"
  },
  "90": {
    "explanation": "Đáp án: Azure Log Analytics\n\nĐề multi-tier: Web Apps front end và Azure SQL back end. Cần store telemetry tập trung, ad-hoc queries tìm baseline, alert khi vượt baseline.\n\nLog Analytics là central store, KQL ad-hoc, alert rule trên query. Cả app và database diagnostics gửi về một workspace.\n\nEvent Hubs chỉ ingest. Intelligent Insights chỉ SQL. Application Insights mạnh APM app, không phải chỗ tập trung database metrics như Log Analytics theo đáp án.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ad-hoc queries\" + \"baselines\" + \"application and database metrics\" → Azure Log Analytics.\n"
  },
  "91": {
    "explanation": "Đáp án: the Smart Detection feature in Azure Application Insights\n\nĐề App1 trên VMSS1, usage thay đổi theo tuần. Cần phát hiện abnormal rise of failed requests, minimize administrative effort.\n\nSmart Detection học pattern theo thời gian, tự bắt tăng failed requests bất thường, ít cấu hình.\n\nFailures blade chỉ xem thủ công. Service Health không thấy failed requests của App1. Log Analytics alert làm được nhưng phải viết và chỉnh query, tốn effort hơn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"abnormal rise\" + \"failed requests\" + \"minimize administrative effort\" → Smart Detection.\n"
  },
  "93": {
    "explanation": "Đáp án: Azure dashboards\n\nĐề consolidated view: RBAC bằng Azure AD, visuals Azure Monitor viết KQL, documentation markdown, luôn latest data.\n\nAzure portal dashboards pin tile Monitor (KQL), markdown tile, chia sẻ theo RBAC, tile lấy data mới khi mở.\n\nAzure Monitor là nguồn dữ liệu, không phải canvas gộp markdown và RBAC view. Power BI không phải “latest data” live trên portal như dashboard. Azure Data Explorer là engine query, không phải portal dashboard.\n\nKeywords phản xạ nhanh (AZ-400)\n\"RBAC\" + \"Kusto query language\" + \"markdown\" + \"latest data\" → Azure dashboards.\n"
  },
  "94": {
    "explanation": "Đáp án: Selenium\n\nĐề automate UI testing của web application.\n\nSelenium điều khiển browser thật, chuẩn UI test web.\n\nJaCoCo đo coverage Java. Xamarin.UITest dành native mobile. Microsoft.CodeAnalysis (Roslyn) phân tích source, không bấm UI web.\n\nKeywords phản xạ nhanh (AZ-400)\n\"automate UI testing\" + \"web application\" → Selenium.\n"
  },
  "96": {
    "explanation": "Đáp án: the Application Health extension\n\nĐề App1 HTTPS, mutual authentication bằng client certificate trên VMSS1 sau LB1. Health check phải biết instance nào eligible for upgrade, minimize effort.\n\nApplication Health extension chạy probe trong guest, vượt client certificate vì không cần LB trình cert. VMSS dùng kết quả để loại instance khỏi upgrade khi unhealthy.\n\nLoad Balancer health probe khó trình client cert. Autoscale không đánh giá upgrade eligibility. Custom Script Extension phải tự viết vòng đời health, tốn effort hơn extension sẵn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"mutual authentication\" + \"eligible for an upgrade\" → Application Health extension.\n"
  },
  "99": {
    "explanation": "Đáp án: a gate\n\nĐề releases gần đây làm chậm hệ thống. Đã có Azure Monitor alerts. Chỉ deploy production khi staging đạt performance baseline.\n\nRelease gate đánh giá alert hoặc query trước production. Không đạt thì không deploy.\n\nAzure Scheduler chạy theo giờ, không so baseline. Trigger chỉ khởi chạy pipeline. Azure Function có thể gọi API nhưng không phải primitive chặn release như gate.\n\nKeywords phản xạ nhanh (AZ-400)\n\"performance baseline\" + \"staging\" + \"prevent the deployment\" → gate.\n"
  },
  "104": {
    "explanation": "Đáp án: B — No\n\nĐề bài muốn ngăn configuration của Azure DevOps project thay đổi theo thời gian. Giải pháp: implement Continuous Integration.\n\nCI tự động integrate, build, test và merge code. CI không bảo vệ work item types, process templates, permissions, pipeline definitions hay service connections. CI cải thiện chất lượng code, không khóa project settings.\n\nYes (A) sai vì CI không phải cơ chế chống configuration drift. Cần IaC (YAML/JSON trong Git), process templates, hạn chế quyền và auditing.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prevent project configuration from changing\" + \"Continuous Integration\" → No.\n"
  },
  "105": {
    "explanation": "Đáp án: B — No\n\nĐề bài muốn ngăn configuration của Azure DevOps project thay đổi theo thời gian. Giải pháp: implement Continuous Assurance.\n\nContinuous Assurance là khung practice về security và compliance (scan, test, kiểm soát). Nó không khóa trực tiếp build pipelines, variable groups, service connections hay permissions trên Azure DevOps. Có khung kiểm soát vẫn chưa version và review mọi thay đổi configuration.\n\nYes (A) sai vì Continuous Assurance một mình không lock/version project configuration. Cần IaC cộng pull request, RBAC và audit.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prevent project configuration from changing\" + \"Continuous Assurance\" → No.\n"
  },
  "106": {
    "explanation": "Đáp án: C — Azure App Configuration\n\nĐề bài cần configuration management cho năm App Service apps trên development, test và production: feature flags, lịch sử thay đổi 30 ngày, cấu hình phân cấp, RBAC, và key/value dùng chung.\n\nAzure App Configuration được thiết kế cho centralized configuration: hierarchical keys, feature flags sẵn, revision history đủ 30 ngày, RBAC qua Azure AD, và shared key-value cho nhiều app và môi trường.\n\nA sai vì Cosmos DB là database, không phải configuration service với feature flags. B sai vì App Service lưu app settings nhưng thiếu feature flags, history 30 ngày và hierarchical config tập trung. D sai vì Key Vault dành secrets, không quản lý feature flags hay hierarchical application configuration.\n\nKeywords phản xạ nhanh (AZ-400)\n\"feature flags\" + \"hierarchical configuration\" + \"RBAC\" + 30 days → Azure App Configuration.\n"
  },
  "107": {
    "explanation": "Đáp án: C — a readiness probe\n\nĐề bài: ACI có frontend App1 và backend DB1; DB1 load nhiều data lúc startup. Cần chắc DB1 sẵn sàng nhận request trước khi user gửi request tới App1.\n\nReadiness probe báo khi container sẵn sàng nhận traffic. Khi DB1 chưa load xong, probe fail nên ACI chưa chuyển request từ App1 sang DB1.\n\nA sai vì liveness probe phát hiện container chết rồi restart, không chờ startup data load xong. B sai vì performance log chỉ chẩn đoán, không chặn traffic. D sai vì Azure Load Balancer health probe dành VM sau load balancer, không phải intra-container trong cùng ACI group.\n\nKeywords phản xạ nhanh (AZ-400)\n\"container\" + \"handle incoming requests\" + \"startup\" → readiness probe (not liveness).\n"
  },
  "109": {
    "explanation": "Đáp án: Create an Azure logic app → Select the HTTP request trigger → Update the action group in Azure Monitor\n\nĐề bài: alert Azure Monitor khi WebApp1 lỗi, cần forward chi tiết lỗi sang third-party system với ít công quản trị.\n\nTạo Logic App làm webhook nhận payload. Chọn HTTP request trigger để third-party hoặc action group gọi URL. Cập nhật action group của alert để trỏ tới Logic App; mỗi lần alert fire, chi tiết được forward mà không viết custom service.\n\nKhông bắt đầu bằng sửa pipeline: alert đã có trên Azure Monitor. Không dùng trigger khác nếu cần webhook HTTP chuẩn. Không bỏ bước action group vì alert không tự gọi Logic App nếu chưa gắn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"alert\" + \"third-party\" + minimize effort → Logic App + HTTP request trigger + update action group.\n"
  },
  "110": {
    "explanation": "Đáp án: B — No\n\nĐề bài cần email mỗi khi VMSS1 scale in hoặc scale out. Giải pháp: cấu hình Notifications của Project1 trong Azure DevOps.\n\nNotifications của Azure DevOps theo dõi sự kiện trong DevOps (build, work item, check-in), không theo dõi Azure resource như instance count của VMSS.\n\nYes (A) sai vì notification project không phát hiện autoscaling. Cần Azure Monitor alert trên metric hoặc Activity Log rồi gửi email qua action group.\n\nKeywords phản xạ nhanh (AZ-400)\n\"VMSS scales\" + \"Azure DevOps Notifications\" → No (use Azure Monitor).\n"
  },
  "111": {
    "explanation": "Đáp án: B — No\n\nĐề bài cần email khi VMSS1 scale in hoặc scale out. Giải pháp: cấu hình Service hooks của Project1.\n\nService hooks kích hoạt hệ thống ngoài khi có sự kiện trong Azure DevOps. Sự kiện scale của VMSS không phải trigger của service hooks.\n\nYes (A) sai vì service hooks không monitor Azure VMSS. Cần Azure Monitor alert và action group email.\n\nKeywords phản xạ nhanh (AZ-400)\n\"VMSS scales\" + \"Service hooks\" → No (use Azure Monitor).\n"
  },
  "112": {
    "explanation": "Đáp án: A — Yes\n\nĐề bài cần email khi VMSS1 scale in hoặc scale out. Giải pháp: từ Azure Monitor, tạo action group.\n\nAction group là cách Azure Monitor gửi email khi alert fire. Gắn action group với alert rule theo dõi autoscaling (instance count hoặc Activity Log) thì mỗi lần scale in/out sẽ có email.\n\nNo (B) sai theo khóa đáp án: tạo action group là bước nền đúng trên Azure Monitor, khác Notifications hay Service hooks trong Azure DevOps.\n\nKeywords phản xạ nhanh (AZ-400)\n\"VMSS scales\" + \"email alert\" + Azure Monitor action group → Yes.\n"
  },
  "113": {
    "explanation": "Đáp án: Link width, Link color\n\nCác ô hỏi cách đọc bản đồ dependencies: Number of dependencies và Risk level.\n\nLink width (độ dày đường) thể hiện số lượng dependencies trong khu vực đó; đường càng dày thì càng nhiều phụ thuộc. Link color thể hiện risk level theo chú thích bản đồ.\n\nKhông dùng node size hay label làm tín hiệu chính cho hai thuộc tính này theo khóa đáp án. Stem Privileged Identity Management trên đề nguồn không khớp exhibit Service Map; vẫn theo khóa: width = số dependencies, color = risk.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Number of dependencies\" + \"Risk level\" (map) → Link width + Link color.\n"
  },
  "116": {
    "explanation": "Đáp án: Configure PAT-based authentication → Custom install Git for Windows with Git LFS → Configure Git LFS file tracking\n\nĐề bài: repo Git cho Project1 trên máy Windows 10; hỗ trợ binary lớn, lưu binary ngoài repo, metadata vẫn commit theo workflow Git chuẩn.\n\nGit LFS lưu nội dung file lớn ngoài Git object store, pointer được commit. Trên Windows: cài Git kèm Git LFS, cấu hình PAT để Azure DevOps/Git authenticate (LFS cũng dùng credential này), rồi git lfs track các kiểu file binary.\n\nKhông bỏ PAT vì Azure Repos yêu cầu auth. Không cài Git thiếu LFS. Không track LFS trước khi binary extension đã có trên máy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"large binary\" + \"outside the repository\" + Git → PAT + Git LFS install + LFS tracking.\n"
  },
  "117": {
    "explanation": "Đáp án: C — WhiteSource Bolt\n\nĐề bài: build pipeline dùng khoảng 50 open source libraries; cần bảo đảm chúng tuân licensing standards của công ty.\n\nWhiteSource Bolt (Mend Bolt) là SCA trên Azure DevOps: phát hiện thành phần open source, license và so với policy.\n\nA sai vì Ansible là configuration automation, không scan license. B sai vì Maven quản lý dependency Java, không enforce license policy. D sai vì Helm là package manager Kubernetes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source\" + \"licensing standards\" + Azure Pipelines → WhiteSource Bolt (Mend).\n"
  },
  "118": {
    "explanation": "Đáp án: B — Gradle\n\nĐề bài: công ty đã dùng SonarQube cho .NET, nay cần phân tích chất lượng code Java trong build pipeline. Hỏi loại task nên thêm.\n\nSonarQube phân tích Java qua build tool. Gradle là build tool phổ biến cho Java; task Gradle chạy SonarQube scanner rồi gửi kết quả lên server hiện có.\n\nA sai vì Chef là configuration management. C sai vì Octopus là deployment. D sai vì Xcode dành nền tảng Apple, không build Java.\n\nKeywords phản xạ nhanh (AZ-400)\n\"SonarQube\" + \"Java\" + build pipeline task → Gradle.\n"
  },
  "119": {
    "explanation": "Đáp án: C — WhiteSource\n\nĐề bài: lo license khi developer thêm open source libraries; cần process tự động trên build pipeline để phát hiện libraries phổ biến.\n\nWhiteSource (Mend) là SCA: quét dependencies, map license và cảnh báo trong pipeline.\n\nA sai vì Visual SourceSafe là source control cũ. B sai vì PDM quản lý product data, không scan OSS license. D sai vì OWASP ZAP là web application security scanner, không quản lý license thư viện.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source libraries\" + \"licensing\" + build pipeline → WhiteSource (Mend).\n"
  },
  "120": {
    "explanation": "Đáp án: C — Black Duck\n\nĐề bài giống yêu cầu phát hiện open source libraries và license trong build pipeline.\n\nBlack Duck là SCA: scan build, liệt kê libraries, versions, licenses và rủi ro.\n\nA sai vì Visual SourceSafe là source control. B sai vì Code Style là formatting. D sai vì Jenkins là automation server, không dedicated SCA. E sai vì SourceGear là source control. F sai vì OWASP ZAP là runtime web scan.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source\" + \"licensing\" + automated build → Black Duck (SCA).\n"
  },
  "121": {
    "explanation": "Đáp án: C — Black Duck\n\nĐề bài cần bảo đảm mọi open source libraries tuân licensing standards.\n\nBlack Duck phát hiện OSS, xác định license, CVE và báo cáo policy.\n\nA sai vì NuGet là package manager .NET, không phân tích license ở mức dự án. B sai vì Maven quản lý dependency Java tương tự. D sai vì Helm triển khai Kubernetes, không scan license codebase.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source libraries\" + \"licensing standards\" → Black Duck.\n"
  },
  "124": {
    "explanation": "Đáp án: D — conditional access\n\nĐề bài: nhiều tài khoản Azure AD; user phải MFA khi truy cập Azure apps từ untrusted networks.\n\nConditional Access đặt điều kiện location hoặc named location không tin cậy rồi Grant require MFA.\n\nA sai vì access reviews chỉ định kỳ xét quyền. B sai vì managed identities dành Azure resources, không MFA cho user. C sai vì entitlement management là access packages, không MFA theo mạng.\n\nKeywords phản xạ nhanh (AZ-400)\n\"MFA\" + \"untrusted networks\" + Azure AD → Conditional Access.\n"
  },
  "125": {
    "explanation": "Đáp án: A — personal access token (PAT)\n\nĐề bài hỏi cơ chế authentication khi register self-hosted Linux agent.\n\nPAT là cách Microsoft khuyến nghị: agent dùng token scoped để nối Azure DevOps, có thể đặt expiry.\n\nB sai vì SSH key dùng để vào máy Linux, không phải register agent. C sai vì Alternate credentials không còn được khuyến nghị. D sai vì certificate bảo vệ TLS, không phải credential chính khi config.sh register agent.\n\nKeywords phản xạ nhanh (AZ-400)\n\"self-hosted Linux agent\" + register → PAT.\n"
  },
  "126": {
    "explanation": "Đáp án: B — Create an app registration in Azure AD\n\nĐề bài: ASP.NET cần authenticate user bằng Azure AD. Hỏi việc làm trước.\n\nApp registration tạo application identity, client ID và redirect URIs. Chỉ sau bước này app mới xin token OpenID Connect hoặc OAuth.\n\nA sai vì gán enterprise application cho user là bước sau, thường cho SaaS đã có. C sai vì SAML là một protocol; vẫn phải register app trước. D sai vì không tạo OAuth token trước khi app tồn tại trên Azure AD. E sai vì membership database không phải bước đầu tích hợp Azure AD.\n\nKeywords phản xạ nhanh (AZ-400)\n\"authenticate users\" + \"Azure AD\" + first step → Create an app registration.\n"
  },
  "127": {
    "explanation": "Đáp án: A — PATs in Azure DevOps\n\nĐề bài: authentication hỗ trợ Git và giảm việc nhập credentials.\n\nPAT dùng được với Git; lưu trong Git Credential Manager nên ít bị hỏi lại. PAT scoped và có expiry, không lộ password Azure AD.\n\nB sai vì Alternate credentials kém an toàn và ít linh hoạt. C sai vì user Azure AD thường phải nhập password và có thể MFA mỗi lần. D sai vì managed identities dành Azure resources, không phải user Git tới Azure DevOps.\n\nKeywords phản xạ nhanh (AZ-400)\n\"authentication from Git\" + \"minimize credentials\" → PAT.\n"
  },
  "128": {
    "explanation": "Đáp án: D — Compute & apps in Azure Security Center\n\nĐề bài: nhiều App Service web apps và Azure Functions; cần recommendation về security của ứng dụng.\n\nCompute & apps trong Azure Security Center (Defender for Cloud) đánh giá compute resources gồm web apps và functions, rồi đưa khuyến nghị.\n\nA sai vì Security & Compliance trong Log Analytics phân tích log, không proactively recommend như Security Center. B sai vì Resource Health nói availability, không phải lỗ hổng cấu hình. C sai vì Smart Detection trong Application Insights tập trung perf và failure APM.\n\nKeywords phản xạ nhanh (AZ-400)\n\"security recommendation\" + web apps + functions → Compute & apps in Security Center.\n"
  },
  "129": {
    "explanation": "Đáp án: D — Add Azure Key Vault references to ARM templates\n\nĐề bài: giảm khả năng infrastructure credentials bị leak.\n\nKey Vault references trong ARM templates để secret không nằm trong template, parameter file hay log. ARM lấy secret lúc deploy.\n\nA sai vì inline PowerShell dễ hardcode credentials. B sai vì Set-AzureKeyVaultSecret là ghi secret vào vault, không phải cách deploy infra dùng secret. C sai vì Key Vault task lấy secret cho pipeline, không thay reference trong template infrastructure.\n\nKeywords phản xạ nhanh (AZ-400)\n\"infrastructure credentials\" + \"not leaked\" + ARM → Key Vault references in templates.\n"
  },
  "131": {
    "explanation": "Đáp án: B — Get only\n\nĐề bài: ASP.NET Core đọc secrets từ Key Vault làm configuration; access policy theo least privilege.\n\nGet đủ để lấy giá trị secret đã biết tên. List cho phép liệt kê mọi secrets trong vault, không cần cho runtime app.\n\nA sai vì List không đọc được giá trị secret. C sai vì Get and List rộng hơn cần thiết.\n\nKeywords phản xạ nhanh (AZ-400)\n\"app reads secrets\" + least privilege → Get only (not List).\n"
  },
  "134": {
    "explanation": "Đáp án: D — From the Security settings of the branch, modify the access control for the user\n\nĐề bài: branch policy yêu cầu build thành công; một user phải luôn merge được vào master dù compile fail; least privilege.\n\nBypass policies khi merge được cấp ở branch security của master, chỉ cho user đó, không mở cả repo hay cả project.\n\nA sai vì Build Administrators quản lý builds, không phải bypass policy trên một branch. B sai vì Project Administrators quá rộng. C sai vì repository security áp dụng mọi branch, rộng hơn master.\n\nKeywords phản xạ nhanh (AZ-400)\n\"bypass build policy\" + \"one user\" + master + least privilege → Branch security ACL.\n"
  },
  "135": {
    "explanation": "Đáp án: A — Azure Key Vault\n\nĐề bài: ARM template deploy multi-tier app; người deploy không được xem account credentials và connection strings.\n\nKey Vault giữ secrets; template reference lúc deploy qua managed identity hoặc service principal. Người chạy deployment không thấy giá trị.\n\nB và C sai vì Web.config và appsettings.json chứa plaintext, dễ đọc. D sai vì Storage table không phải secret store chuẩn. E sai vì ARM parameter file thường vào source control và người deploy vẫn thấy giá trị.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prevent deployer viewing credentials\" + ARM → Azure Key Vault references.\n"
  },
  "143": {
    "explanation": "Đáp án: D — In Azure Active Directory, configure conditional access\n\nĐề bài: chỉ user Azure AD được vào Azure DevOps; thêm điều kiện chỉ thiết bị trên on-premises network được truy cập.\n\nConditional Access: named location theo dải IP on-premises, target Azure DevOps, chỉ grant khi từ location đó.\n\nA sai vì Stakeholder chỉ cắt feature, không chặn theo mạng. B sai vì risky sign-ins là Identity Protection, không enforce corporate network. C sai vì Project Settings Security không filter theo IP on-premises.\n\nKeywords phản xạ nhanh (AZ-400)\n\"only on-premises network\" + Azure DevOps → Azure AD Conditional Access.\n"
  },
  "144": {
    "explanation": "Đáp án: B — ensures that all traffic to new Azure Storage accounts is encrypted\n\nĐề bài: Azure Policy gán Tenant root group; field Microsoft.Storage/storageAccounts/supportsHttpsTrafficOnly notEquals true (effect Deny theo exhibit thông dụng).\n\nPolicy chặn tạo storage account mới nếu không bật HTTPS-only, nên traffic tới account mới phải encrypted trên đường truyền.\n\nA sai vì policy kiểu này không sửa account đã tồn tại (không phải modify existing). C sai vì policy yêu cầu HTTPS, không chặn HTTPS. D sai vì encryption at rest là thuộc tính khác (encryption), không phải supportsHttpsTrafficOnly.\n\nKeywords phản xạ nhanh (AZ-400)\n\"supportsHttpsTrafficOnly\" + new storage → HTTPS / encrypted traffic (not at rest).\n"
  },
  "145": {
    "explanation": "Đáp án: A — Create a variable group in Project1\n\nĐề bài: mọi pipelines của Project1 reference secrets vault1; không lưu values trong pipelines.\n\nVariable group link Key Vault: mọi pipeline trong project dùng chung, secret lấy runtime, không persist trong YAML.\n\nB sai vì secure file không map Key Vault secrets. C sai vì security settings pipeline không lấy secret từ vault. D sai vì organization security policy không link vault1 vào Project1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"secrets in all pipelines\" + \"values not stored\" → variable group linked to Key Vault.\n"
  },
  "151": {
    "explanation": "Đáp án: B — No\n\nĐề bài cần phát hiện licensing violations và prohibited libraries. Giải pháp: implement pre-deployment gates.\n\nPre-deployment gates kiểm tra điều kiện trước khi deploy (health, tests, approvals). Gates không phân tích dependencies hay license trong codebase. Có thể gọi script phụ nhưng đó không phải chức năng chính và không đáng tin để bắt prohibited libraries.\n\nYes (A) sai. Cần SCA hoặc static analysis trong build, không phải gate một mình.\n\nKeywords phản xạ nhanh (AZ-400)\n\"licensing violations\" + \"prohibited libraries\" + \"pre-deployment gates\" → No.\n"
  },
  "152": {
    "explanation": "Đáp án: A — Yes\n\nĐề bài cần phát hiện licensing violations và prohibited libraries. Giải pháp: implement automated security testing.\n\nAutomated security testing trong CI/CD gồm SAST và SCA: quét dependencies, so license với policy, fail build khi có thư viện cấm. Đây là shift-left, bắt vấn đề khi chúng xuất hiện trong development process.\n\nNo (B) sai vì khóa đáp án công nhận automated security testing đủ để identify hai loại issue đó.\n\nKeywords phản xạ nhanh (AZ-400)\n\"licensing violations\" + \"prohibited libraries\" + \"automated security testing\" → Yes.\n"
  },
  "153": {
    "explanation": "Đáp án: B — No\n\nĐề bài cần phát hiện licensing violations và prohibited libraries. Giải pháp: implement continuous deployment.\n\nContinuous deployment tự động đưa bản build đã sẵn sàng lên môi trường. CD không scan license hay libraries. Các check SCA phải chạy trước giai đoạn deploy.\n\nYes (A) sai vì CD là cơ chế phát hành, không phải detection.\n\nKeywords phản xạ nhanh (AZ-400)\n\"licensing violations\" + \"prohibited libraries\" + \"continuous deployment\" → No.\n"
  },
  "154": {
    "explanation": "Đáp án: Bật Advanced Threat Protection / Advanced Data Security trên SQL server\n\nĐề bài: sửa SQL database để bảo vệ khỏi SQL injection, thực hiện trên Azure portal.\n\nĐăng nhập portal, mở SQL server của database, Security → Advanced Data Security / Microsoft Defender for SQL (Advanced Threat Protection). Bật threat detection gồm SQL injection alerts.\n\nKhông chỉ thêm firewall rule. Không dựa vào backup. ATP cảnh báo tấn công injection trên SQL.\n\nKeywords phản xạ nhanh (AZ-400)\n\"SQL injection\" + Azure SQL + portal → Advanced Threat Protection / Defender for SQL.\n"
  },
  "155": {
    "explanation": "Đáp án: Microsoft.Resources/subscriptions/resourceGroups; Append\n\nĐề bài: mọi resource groups phải có tag organization = Contoso. Hoàn thành Azure Policy.\n\nType là Microsoft.Resources/subscriptions/resourceGroups vì yêu cầu gắn trên resource group. Effect Append thêm tag nếu thiếu khi tạo hoặc cập nhật, ít phá hơn Deny và không xóa resource.\n\nKhông chọn Microsoft.Resources/subscriptions vì đó là subscription, không phải resource group. Không chọn Deny nếu đề muốn enforce tag bằng cách bổ sung giá trị. Không chọn Audit vì Audit chỉ ghi log, không set tag.\n\nKeywords phản xạ nhanh (AZ-400)\n\"resource groups\" + tag organization=Contoso → resourceGroups + Append.\n"
  },
  "156": {
    "explanation": "Đáp án: B — Register GitHub in Azure AD\n\nĐề bài: cấu hình GitHub dùng Azure AD để authentication. Hỏi việc làm trước.\n\nPhải đăng ký GitHub như enterprise application trong Azure AD để Azure AD phát token và SSO. Mọi policy sau đó dựa trên app object này.\n\nA sai vì Conditional Access chỉ áp sau khi GitHub đã là ứng dụng trong tenant. C sai vì Azure AD B2C dành external consumers, không phải bước đầu employee SSO. D sai vì Security settings trên GitHub organization là bước cấu hình sau khi đã integrate.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub\" + \"Azure AD authentication\" + first → Register GitHub in Azure AD.\n"
  },
  "157": {
    "explanation": "Đáp án: A — Add a deployment gate\n\nĐề bài: ngăn releases deploy trừ khi tuân Azure Policy trên Sub1.\n\nDeployment gate gọi kiểm tra compliance Azure Policy trước khi sang stage. Nếu resource không compliant, gate fail và release dừng.\n\nB sai vì Deployment queue settings chỉ xếp hàng agent, không đọc Policy. C sai vì deployment trigger quyết định khi nào stage chạy, không evaluate Policy. D sai vì pipeline variable không enforce subscription policy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"releases\" + \"Azure Policy\" + Sub1 → Add a deployment gate.\n"
  },
  "159": {
    "explanation": "Đáp án: C — WhiteSource Bolt\n\nĐề bài: khoảng 50 open source libraries trong build pipeline; cần tuân licensing standards.\n\nWhiteSource Bolt quét license trong Azure DevOps và so policy công ty.\n\nA sai vì Ansible là automation. B sai vì Maven quản lý dependency, không phải license compliance. D sai vì Helm là Kubernetes package manager.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source\" + \"licensing standards\" + pipeline → WhiteSource Bolt.\n"
  },
  "160": {
    "explanation": "Đáp án: D — SonarQube\n\nĐề bài: security validation; cần identify package dependencies có known security issues và có thể sửa bằng update.\n\nSonarQube inspect dependencies, gắn CVE và gợi ý nâng version.\n\nA sai vì Octopus Deploy là release automation. B sai vì Jenkins là CI server, cần plugin mới gần được khả năng này. C sai vì Gradle quản lý dependency, không phân tích security sẵn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"package dependencies\" + \"known security issues\" + update → SonarQube.\n"
  },
  "163": {
    "explanation": "Đáp án: C — Black Duck\n\nĐề bài: tự động phát hiện open source libraries khi chúng được thêm vào codebase để tránh license issues.\n\nBlack Duck SCA gắn CI/CD, map license và cảnh báo.\n\nA sai vì Visual SourceSafe là source control. B sai vì Code Style là formatting. D sai vì Jenkins không dedicated OSS license management.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source\" + \"licensing\" + build pipeline → Black Duck.\n"
  },
  "165": {
    "explanation": "Đáp án: A build task; WhiteSource Bolt\n\nĐề bài: bảo đảm khoảng 50 open source libraries tuân licensing standards. Các ô: object to create và service to use.\n\nTạo build task trong pipeline để chạy scan mỗi build. Service là WhiteSource Bolt: kiểm tra security, licensing và quality của OSS.\n\nKhông chọn Helm hay Maven làm service license. Không chỉ tạo release gate mà không scan lúc build.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source licensing\" + build pipeline → build task + WhiteSource Bolt.\n"
  },
  "166": {
    "explanation": "Đáp án: C — Black Duck\n\nĐề bài: open source libraries phải tuân licensing standards.\n\nBlack Duck SCA identify licenses và rủi ro trong pipeline.\n\nA sai vì NuGet là package manager. B sai vì Maven tương tự cho Java. D sai vì Helm dành Kubernetes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source libraries\" + \"licensing standards\" → Black Duck.\n"
  },
  "167": {
    "explanation": "Đáp án: az aks create → az ad sp create-for-rbac → kubectl create\n\nĐề bài: AKS host containers từ Docker Trusted Registry; AKS bật RBAC và dùng custom service principal. Ba lệnh theo thứ tự khóa đáp án.\n\naz aks create provision cluster (RBAC). az ad sp create-for-rbac tạo custom service principal cho registry hoặc cluster identity. kubectl create tạo Kubernetes secret (docker-registry) để node kéo image.\n\nKhông bỏ kubectl create vì cluster cần secret kéo image. Không thay az aks create bằng lệnh khác theo khóa nguồn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"AKS\" + \"RBAC\" + \"custom service principal\" → az aks create + az ad sp create-for-rbac + kubectl create.\n"
  },
  "168": {
    "explanation": "Đáp án: C — .p12\n\nĐề bài: app iOS; user thuộc private distribution group App Center; cần biết certificate file upload để distribute release.\n\nFile .p12 (Personal Information Exchange) chứa certificate và private key. App Center cần cả hai để sign .ipa trước khi gửi nhóm.\n\nA sai vì .cer chỉ public certificate, không sign được. B sai vì .pfx cũng chứa key nhưng tài liệu App Center chỉ định .p12. D sai vì .pvk chỉ private key, thiếu certificate trong một file.\n\nKeywords phản xạ nhanh (AZ-400)\n\"App Center\" + iOS + \"private distribution\" → upload .p12.\n"
  },
  "171": {
    "explanation": "Đáp án: Static code analysis; Static code analysis; Penetration testing\n\nĐề bài: tăng security cho từng giai đoạn development.\n\nPull request: static code analysis trên diff trước khi merge. Continuous integration: static analysis trên build để bắt lỗ hổng sớm. Continuous delivery: penetration testing trên app đã deploy ở môi trường thấp.\n\nKhông dùng penetration testing ở PR vì app chưa chạy. Không dùng DAST thay SAST ở CI theo khóa.\n\nKeywords phản xạ nhanh (AZ-400)\n\"PR\" + \"CI\" + \"CD\" security tools → SAST + SAST + penetration testing.\n"
  },
  "172": {
    "explanation": "Đáp án: D — WhiteSource Bolt\n\nĐề bài: tự động phát hiện open source libraries trong build pipeline vì lo license.\n\nWhiteSource Bolt (Mend Bolt) scan components, license và vulnerability ngay trên Azure Pipelines.\n\nA sai vì OWASP ZAP là web scanner. B sai vì Jenkins cần tool khác để scan license. C sai vì Code Style là formatting.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source\" + \"licensing\" + build pipeline → WhiteSource Bolt.\n"
  },
  "175": {
    "explanation": "Đáp án: B — GitHub App\n\nĐề bài: tích hợp GitHub làm repository; Azure Pipelines phải chạy dưới Azure Pipelines identity.\n\nGitHub App là application identity, quyền fine-grained, không gắn user. Pipeline trigger thay mặt app, không phụ thuộc PAT của một người.\n\nA sai vì PAT gắn user; user nghỉ là pipeline gãy, không phải identity Azure Pipelines. C sai vì Azure AD xác thực user Azure, không phải identity GitHub của pipeline. D sai vì OAuth nghiêng ủy quyền user, không phải app identity độc lập.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Pipelines identity\" + GitHub repo → GitHub App (not PAT).\n"
  },
  "178": {
    "explanation": "Đáp án: A — Store the secrets in the environment variables instead of the pipeline variables\n\nĐề bài: ngăn values của secrets bị ghi vào log.\n\nTheo khóa nguồn, secret đặt environment variables được Azure Pipelines mask trong logs khi agent command logging bật, giảm lộ hơn pipeline variables thường.\n\nB sai vì truyền secret trên command line rất dễ vào process list và log. C sai vì prefix tên secret không tự mask trên Azure Pipelines. D sai vì echo cố ý in secret ra log.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prevent secrets from being logged\" → store as environment variables (not command line).\n"
  },
  "181": {
    "explanation": "Đáp án: D — Upgrade the license of the Azure AD tenant\n\nĐề bài: Premium P1; cần time limits và approval cho privileged access; minimize costs. Hỏi việc trước.\n\nPIM (JIT, approval, time-bound) cần Azure AD Premium P2. Phải nâng license trước khi cấu hình notifications, alerts hay MFA lúc activate.\n\nA, B, C sai vì đó là bước trong PIM sau khi đã có P2.\n\nKeywords phản xạ nhanh (AZ-400)\n\"time limits\" + \"approval\" + privileged access + P1 → Upgrade to Azure AD Premium P2.\n"
  },
  "182": {
    "explanation": "Đáp án: C — Encrypt the secret and store it in the repository; store the decryption key in repository-level GitHub secrets\n\nĐề bài: GitHub Actions cần secret 256 KB; chỉ workflow được truy cập; minimize administrative effort.\n\nOrganization-level secrets (A, D) quá rộng, nhiều repo thấy được, trái “chỉ workflow”. Encrypt giá trị (vì vượt hoặc gần giới hạn secret plaintext) rồi để ciphertext trong repo; decryption key là repository-level secret nên chỉ workflows của repo đó dùng, gói gọn một chỗ.\n\nB sai theo lời giải nguồn: để plaintext 256 KB trong repository secrets kém phù hợp hơn encrypt-plus-repo-key. D sai vì organization-level key chia sẻ quá rộng.\n\nKeywords phản xạ nhanh (AZ-400)\n\"256-KB secret\" + \"only the workflow\" → encrypt in repo + decryption key in repo secrets.\n"
  },
  "183": {
    "explanation": "Đáp án: A — Purchase a GitHub Advanced Security license\n\nĐề bài: GitHub Enterprise; enable push protection for secret scanning. Hỏi việc trước.\n\nPush protection thuộc GitHub Advanced Security. Không GHAS thì secret scanning chỉ báo sau commit. Phải mua license trước.\n\nB, C, D không mở push protection.\n\nKeywords phản xạ nhanh (AZ-400)\n\"push protection\" + \"secret scanning\" → Purchase GitHub Advanced Security first.\n"
  },
  "184": {
    "explanation": "Đáp án: Configure PAT-based authentication → Custom install Git for Windows with Git LFS → Configure Git LFS file tracking\n\nĐề bài: Git repo cho Project1 trên Windows 10; binary lớn lưu ngoài repo; metadata qua commit Git chuẩn.\n\nPAT authenticate Azure Repos và LFS. Cài Git for Windows kèm Git LFS. git lfs track các kiểu binary.\n\nKhông bỏ LFS. Không track trước khi LFS đã cài.\n\nKeywords phản xạ nhanh (AZ-400)\n\"large binary files\" + \"outside the repository\" → PAT + Git LFS + LFS tracking.\n"
  },
  "185": {
    "explanation": "Đáp án: C — In Azure AD, configure conditional access\n\nĐề bài: chỉ user Azure AD vào Azure DevOps; chỉ thiết bị trên on-premises network được truy cập.\n\nConditional Access với named location IP on-premises, target Azure DevOps, block khi ngoài mạng công ty.\n\nA sai vì Stakeholder không chặn theo mạng. B sai vì Project Settings không filter IP. D sai vì risky sign-ins không enforce corporate network.\n\nKeywords phản xạ nhanh (AZ-400)\n\"only on-premises network\" + Azure DevOps → Azure AD Conditional Access.\n"
  },
  "186": {
    "explanation": "Đáp án: B — a user-assigned managed identity\n\nĐề bài: bốn Azure VMs dùng một identity; credentials quản lý tự động; có thể grant privileges cho identity.\n\nUser-assigned managed identity là resource độc lập, gán được nhiều VM, Azure xoay credential, gán RBAC được.\n\nA sai vì system-assigned mỗi VM một identity, không phải single identity. C sai vì service principal phải tự quản secret nhiều hơn. D sai vì user account không tự xoay credential và không phù hợp VM workload.\n\nKeywords phản xạ nhanh (AZ-400)\n\"single identity\" + \"multiple VMs\" + \"credentials managed automatically\" → user-assigned managed identity.\n"
  },
  "188": {
    "explanation": "Đáp án: B — Recreate the secret at the repository level\n\nĐề bài: GitHub secret đang ở environment level; cần mọi workflows dùng được. Hỏi việc trước.\n\nEnvironment secret chỉ scoped một environment. Repository-level secret có mặt trên mọi workflows trong repo.\n\nA sai vì organization level quá rộng, repo khác cũng thấy. C sai vì required reviewers không chia sẻ secret.\n\nKeywords phản xạ nhanh (AZ-400)\n\"environment-level secret\" + \"all workflows\" → Recreate at repository level.\n"
  },
  "190": {
    "explanation": "Đáp án: C — a user-assigned managed identity\n\nĐề bài: App1 trên ba web servers lấy secret từ KV1; minimize số lần grant; least privilege.\n\nMột user-assigned MI gán ba servers, grant KV1 một lần. Runtime không nhúng secret.\n\nA sai vì RBAC một mình không thay identity dùng chung và thường rộng hơn Get secret. B sai vì system-assigned cần ba grants. D sai vì service principal phải xoay credentials thủ công.\n\nKeywords phản xạ nhanh (AZ-400)\n\"three web servers\" + \"one Key Vault\" + minimize grants → user-assigned managed identity.\n"
  },
  "191": {
    "explanation": "Đáp án: A — Microsoft Defender for Containers\n\nĐề bài: build và deploy lên Kubernetes; scan app image cho vulnerabilities trước khi image lên cluster.\n\nDefender for Containers quét images (thường trên ACR) và runtime Kubernetes, đúng lúc trước deploy.\n\nB sai vì Defender for App Service bảo vệ App Service runtime. C sai vì Defender for DevOps rộng (code, IaC), không phải tool chính scan image trước K8s. D sai vì Defender for Storage không liên quan container image.\n\nKeywords phản xạ nhanh (AZ-400)\n\"scan image\" + \"before deployed\" + Kubernetes → Microsoft Defender for Containers.\n"
  },
  "192": {
    "explanation": "Đáp án: Pull OWASP ZAP weekly → Start a container → Run the baseline → Report the results\n\nĐề bài: thêm OWASP ZAP vào Pipeline1, bốn bước theo thứ tự.\n\nPull image ZAP bản weekly. Start container scanner. Run the baseline (passive/baseline scan phù hợp CI). Report results về pipeline.\n\nKhông full scan trước khi container chạy. Không report trước khi baseline xong.\n\nKeywords phản xạ nhanh (AZ-400)\n\"OWASP ZAP\" + Azure Pipelines → pull weekly + start container + baseline + report.\n"
  },
  "193": {
    "explanation": "Đáp án: A — Mend Bolt\n\nĐề bài: App1 trên Azure Pipelines, source Azure Repos có open source libraries; cần identify security vulnerabilities trong open source code.\n\nMend Bolt (WhiteSource Bolt) scan OSS trên Azure Repos/Pipelines: CVE và license.\n\nB sai vì Rollbar là error tracking production. C sai vì Code Climate tập trung quality. D sai vì DeepSource là static bugs/smells, không phải SCA OSS chuẩn đề này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source\" + \"security vulnerabilities\" + Azure Repos/Pipelines → Mend Bolt.\n"
  },
  "200": {
    "explanation": "Đáp án: B — Add a status check to the policies of the main branch\n\nĐề bài: trước khi deploy App1, mọi code phải qua security validation bằng custom tool.\n\nMain là nhánh deploy. Branch policy status check bắt PR vào main chạy custom tool; fail thì không merge, code chưa validate không vào bản deploy.\n\nA sai vì status check trên development branch không bảo vệ main. C sai vì service hook không chặn merge. D sai vì job authorization scope hạn chế token pipeline, không chạy security tool.\n\nKeywords phản xạ nhanh (AZ-400)\n\"security validation before deploy\" + custom tool → status check on main branch policy.\n"
  },
  "281": {
    "explanation": "Đáp án: Simulation — nguồn không có nội dung\n\nĐề trong source để trống (\"Câu này trống\"), không có goal, option hay lab step để chấm.\n\nKhông có hành động Azure DevOps hay GitHub nào được chỉ định, nên không có cấu hình đúng hoặc sai để biện luận.\n\nCác bước simulation của câu liền kề không được suy ra cho id này vì stem không mô tả yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"empty stem\" + \"simulation\" → no actionable configuration.\n"
  },
  "506": {
    "stem": "Bạn dùng Azure pipeline để build một .NET app có NuGet dependencies.\nBạn cần đảm bảo pipeline cache các NuGet packages cần thiết.\nBạn nên cấu hình pipeline như thế nào? Kéo giá trị phù hợp vào đúng vị trí. Mỗi giá trị có thể dùng một lần, nhiều lần, hoặc không dùng.",
    "boxes": {
      "1": {
        "answer": "$(Build.SourcesDirectory)/**/packages.lock.json'"
      },
      "2": {
        "answer": "$(Agent.OS)"
      },
      "3": {
        "answer": "$(NUGET_PACKAGES)"
      }
    },
    "answerText": "$(Build.SourcesDirectory)/**/packages.lock.json', $(Agent.OS), $(NUGET_PACKAGES)",
    "explanation": "Đáp án: $(Build.SourcesDirectory)/**/packages.lock.json'; $(Agent.OS); $(NUGET_PACKAGES)\n\nĐề hỏi cách cấu hình Cache@2 trong Azure Pipelines để cache NuGet packages khi build .NET app.\n\nCache key phải gồm identifier nuget, hệ điều hành agent và file khóa package. restoreKeys dùng nuget cùng $(Agent.OS) để tái sử dụng cache cùng OS khi lock file đổi. path trỏ $(NUGET_PACKAGES) vì đó là thư mục NuGet global-packages trên agent.\n\n$(Agent.Id) gắn cache vào một agent cụ thể, không tái sử dụng giữa agent. $(Build.ArtifactStagingDirectory) là nơi staging artifact, không phải NuGet cache. cache/packages là đường dẫn tự đặt, không phải biến NuGet chuẩn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Cache@2\" + \"NuGet\" + \"packages.lock.json\" → lock file + $(Agent.OS) + $(NUGET_PACKAGES)."
  },
  "507": {
    "stem": "Bạn có Azure pipeline dùng để deploy app tên App1.\nBạn cần đảm bảo phiên bản mới của App1 chỉ được release khi vượt performance baselines. Giải pháp phải giảm tối đa administrative effort.\nBạn nên cấu hình gì?",
    "options": {
      "A": "an Azure Pipelines release artifact",
      "B": "an Azure Repos branch policy",
      "C": "an Azure Monitor alert",
      "D": "an Azure Pipelines deployment gate"
    },
    "answerText": "C",
    "explanation": "Đáp án: an Azure Monitor alert\n\nĐề cần chỉ release App1 khi vượt performance baselines và giảm administrative effort.\n\nAzure Monitor alert theo dõi metric so với baseline (response time, CPU, throughput). Khi metric đạt hoặc vượt ngưỡng, alert là tín hiệu tự động để pipeline biết phiên bản đủ chuẩn hiệu năng, không phải ngồi duyệt tay từng release.\n\nAzure Pipelines release artifact chỉ là gói build, không đo performance. Azure Repos branch policy kiểm soát merge code, không so baseline lúc release. Azure Pipelines deployment gate có thể gọi kiểm tra sức khỏe, nhưng đáp án nguồn chọn Azure Monitor alert là thành phần cấu hình trực tiếp cho baseline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"performance baselines\" + \"minimize administrative effort\" → Azure Monitor alert."
  },
  "508": {
    "stem": "Bạn có Azure subscription.\nBạn có các standard trong bảng sau. Standard1 là Security requirements. Standard2 là Software prerequisites. Bạn định dùng Azure Pipelines để build và release web apps.\nBạn cần đề xuất cách xây pipeline thỏa:\n• Mọi pipeline mới phải đáp ứng security requirements trong Standard1.\n• Stage đầu của mọi pipeline mới phải chứa software prerequisites trong Standard2.\n• Giảm tối đa administrative effort.\nDùng gì để triển khai từng standard? Kéo option phù hợp vào từng standard.",
    "boxes": {
      "1": {
        "answer": "An extends template"
      },
      "2": {
        "answer": "An includes template"
      }
    },
    "answerText": "An extends template, An includes template",
    "explanation": "Đáp án: Standard1: An extends template; Standard2: An includes template\n\nĐề cần bắt buộc security trên mọi pipeline mới, đồng thời nhúng software prerequisites vào first stage, ít thao tác quản trị.\n\nextends template khóa cấu trúc pipeline con: consumer phải tuân thủ stage, job và bước security đã định, không bỏ qua requirement của Standard1. includes template chèn sẵn bước cài software prerequisites vào first stage mà không ép toàn bộ schema pipeline, đủ cho Standard2.\n\nPipeline permission chỉ phân quyền chạy pipeline, không nhúng security task hay prerequisite. Self-hosted agent là nơi chạy job, không phải chuẩn YAML. Một stage rời không tái sử dụng chuẩn cho mọi pipeline mới.\n\nKeywords phản xạ nhanh (AZ-400)\n\"security requirements\" + \"all new pipelines\" → extends template.\n\"software prerequisites\" + \"first stage\" → includes template."
  },
  "509": {
    "stem": "Bạn có Azure subscription. Bạn tạo hai Bicep templates tên Template1 và Template2 để tạo virtual machine và website. Bạn cần tạo template tên Template3 tái sử dụng logic từ Template1 và Template2. Bạn phải định nghĩa gì trước?",
    "options": {
      "A": "outputs",
      "B": "resources",
      "C": "modules",
      "D": "parameters"
    },
    "answerText": "C",
    "explanation": "Đáp án: modules\n\nĐề hỏi bước đầu để Template3 tái sử dụng logic của Template1 và Template2.\n\nTrong Bicep, module là đơn vị deployment tái sử dụng. Phải khai báo Template1 và Template2 là modules trong Template3 thì compiler mới gọi được resource và cấu hình của chúng, không copy YAML trùng.\n\noutputs chỉ xuất giá trị sau khi module đã được định nghĩa. resources là hạ tầng bên trong từng file, không phải cách Template3 gọi file khác. parameters tùy biến module sau khi đã có lời gọi module. Cả ba đều dùng sau, không phải thứ định nghĩa trước để reuse.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Bicep\" + \"reuse logic\" + \"Template3\" → modules."
  },
  "510": {
    "stem": "Bạn có Azure subscription. Bạn dùng Bicep templates để deploy websites và Azure SQL infrastructure. Bạn cần tự động hóa deployments bằng Azure Pipelines và self-hosted agent chạy trên hai virtual machines. Giải pháp phải giảm tối đa administrative effort. Bạn nên làm gì trước?",
    "options": {
      "A": "Create a service principal.",
      "B": "Create an Azure Automation account.",
      "C": "Create a user-assigned managed identity.",
      "D": "On each virtual machine, enable a system-assigned managed identity."
    },
    "answerText": "A",
    "explanation": "Đáp án: Create a service principal.\n\nĐề cần bước đầu để Azure Pipelines với self-hosted agent deploy Bicep lên websites và Azure SQL, ít công quản trị.\n\nService principal là identity cho automation. Tạo service principal rồi gắn Azure Resource Manager service connection giúp pipeline authenticate một lần, gán role vừa đủ, không hard-code credential trong template.\n\nAzure Automation account chạy runbook, không cấp auth cho self-hosted agent của Azure Pipelines. User-assigned managed identity và system-assigned managed identity trên từng VM phức tạp hơn: phải bind identity vào hai máy, xoay vòng khi thay agent, không phải cách phổ biến nhất để service connection deploy Bicep từ pipeline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"self-hosted agent\" + \"Bicep\" + \"automate deployments\" → service principal."
  },
  "511": {
    "stem": "Bạn có Azure subscription chứa user tên User1.\nBạn có Azure Resource Manager (ARM) template tên Template1.\nBạn định làm các việc sau:\n• Deploy Azure Key Vault tên KV1.\n• Deploy Azure resources bằng Template1 để lấy secrets từ KV1.\nBạn cần đảm bảo User1 deploy được Template1 theo nguyên tắc least privilege.\nNên cấp permission nào cho User1, và parameter nào phải chỉ định khi tạo KV1?",
    "boxes": {
      "1": {
        "answer": "Microsoft.KeyVault/vaults/deploy/action"
      },
      "2": {
        "answer": "--enabled-for-template-deployment"
      }
    },
    "answerText": "Microsoft.KeyVault/vaults/deploy/action, --enabled-for-template-deployment",
    "explanation": "Đáp án: Microsoft.KeyVault/vaults/deploy/action; --enabled-for-template-deployment\n\nĐề cần User1 deploy ARM template lấy secrets từ KV1 với least privilege.\n\nMicrosoft.KeyVault/vaults/deploy/action đúng là quyền ARM dùng secret trong template deployment, không mở quyền quản trị vault. --enabled-for-template-deployment bật Key Vault cho ARM reference secrets lúc deploy.\n\nMicrosoft.KeyVault/vaults/keys/read chỉ đọc key, không đủ cho secret reference khi deploy. Microsoft.Resources/subscriptions/resourceGroups/read chỉ đọc resource group. --enabled-for-deployment dành cho VM lấy certificate từ Key Vault, không phải ARM template. --enable-rbac-authorization đổi model quyền, không thay permission deploy. --bypass là network bypass, không liên quan least privilege cho User1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ARM template\" + \"retrieve secrets\" + \"least privilege\" → deploy/action + --enabled-for-template-deployment."
  },
  "512": {
    "stem": "Bạn có Azure subscription chứa Azure Traffic Manager profile tên ATM1 và web app tên App1. ATM1 quản lý traffic của App1 và đang route caller tới endpoint có latency thấp nhất.\nBạn cần cấu hình ATM1 để mọi traffic từ Asia đi tới một endpoint ở Australia.\nBa hành động nào phải thực hiện theo thứ tự từ Azure portal?",
    "boxes": {
      "1": {
        "answer": "Delete all the existing endpoints."
      },
      "2": {
        "answer": "Configure performance routing."
      },
      "3": {
        "answer": "Add new endpoints that have geographic region mapping."
      }
    },
    "answerText": "Delete all the existing endpoints., Configure performance routing., Add new endpoints that have geographic region mapping.",
    "explanation": "Đáp án: Delete all the existing endpoints.; Configure performance routing.; Add new endpoints that have geographic region mapping.\n\nĐề đang dùng Traffic Manager theo lowest latency và muốn toàn bộ traffic từ Asia về endpoint Australia.\n\nTheo key nguồn, thứ tự là xóa endpoint hiện có (chúng gắn routing method cũ), cấu hình performance routing, rồi thêm endpoint mới có geographic region mapping để gán vùng Asia cho endpoint Australia.\n\nDecrease the TTL value of the DNS records for App1 chỉ rút cache DNS, không đổi hướng theo châu lục. Các bước khác trong pool không nằm trong đáp án nguồn nên không dùng.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Traffic Manager\" + \"Asia\" + \"Australia\" → delete endpoints + performance routing + geographic region mapping."
  },
  "513": {
    "stem": "Bạn định deploy giải pháp gồm nhiều microservices.\nBạn cần recommend deployment strategy thỏa:\n• User test feature mới bằng một URL cụ thể.\n• Giảm effort khi promote bản test lên production.\n• Giảm effort khi revert production về phiên bản trước.\nBạn nên recommend strategy nào?",
    "options": {
      "A": "A/B",
      "B": "feature toggle",
      "C": "progressive exposure",
      "D": "blue/green"
    },
    "answerText": "D",
    "explanation": "Đáp án: blue/green\n\nĐề cần URL riêng để test, promote nhanh lên production, và rollback nhanh về bản cũ trên nhiều microservices.\n\nBlue/green giữ hai môi trường giống nhau. Môi trường idle nhận bản mới và mở bằng URL riêng để test. Promote chỉ cần chuyển traffic (load balancer hoặc DNS). Revert là chuyển traffic ngược lại môi trường đang giữ bản cũ.\n\nA/B so sánh hành vi user giữa hai biến thể, không tối ưu promote/rollback cả stack. Feature toggle bật tắt feature trong cùng bản deploy, không cho URL môi trường tách và không revert cả production bằng một chuyển traffic. Progressive exposure (canary) tăng dần tỷ lệ user, tốn bước theo dõi từng vòng, không phải promote/revert một lần như đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"specific URL\" + \"promote\" + \"revert\" → blue/green."
  },
  "514": {
    "stem": "Bạn có ba work items với ID 456, 457 và 458. Bạn cần tạo pull request được link tới cả ba work items. Giải pháp phải đặt state của work item 456 thành done. Bạn nên thêm gì vào commit message?",
    "options": {
      "A": "Done #456, #457, #458",
      "B": "Fixes #456, #457, #458",
      "C": "Fixes #AB456, #A8457, #A8458",
      "D": "#AB456, #AB457, #AB458 Completed #AB456"
    },
    "answerText": "C",
    "explanation": "Đáp án: Fixes #AB456, #A8457, #A8458\n\nĐề cần commit/PR link work items 456, 457, 458 và chuyển work item 456 sang done.\n\nTheo key nguồn, option C dùng keyword Fixes kèm mention các ID theo định dạng trong đề. Fixes (cùng Fix, Fixed, Closes) là từ khóa Azure Boards/GitHub dùng để đóng hoặc chuyển work item khi merge.\n\nDone #456, #457, #458 có mention nhưng Done không phải trigger chuẩn để đổi state. Fixes #456, #457, #458 dùng Fixes nhưng thiếu prefix ID như đáp án nguồn. #AB456, #AB457, #AB458 Completed #AB456 không có Fixes và Completed không đóng work item tự động.\n\nKeywords phản xạ nhanh (AZ-400)\n\"commit message\" + \"set state to done\" + \"link work items\" → Fixes #AB456."
  },
  "515": {
    "stem": "Bạn định deploy giải pháp gồm nhiều microservices. Bạn cần recommend deployment strategy thỏa:\n• Cho phép testing và monitoring trong gradual rollout.\n• Kiểm soát số user nhận bản code mới.\nBạn nên recommend strategy nào?",
    "options": {
      "A": "progressive exposure",
      "B": "A/B",
      "C": "feature toggle",
      "D": "blue/green"
    },
    "answerText": "A",
    "explanation": "Đáp án: progressive exposure\n\nĐề cần rollout dần, vừa test vừa monitor, và khống chế số user thấy bản mới.\n\nProgressive exposure (canary, ring-based) tăng dần phần traffic hoặc nhóm user. Mỗi vòng đều đo lỗi và performance, có thể dừng trước khi ảnh hưởng cả hệ.\n\nA/B so sánh conversion giữa hai biến thể, không phải kiểm soát rollout theo tỷ lệ an toàn. Feature toggle bật feature trong cùng deploy, không thay thế việc lộ dần một phiên bản service. Blue/green chuyển gần như toàn bộ traffic một lần, thiếu gradual monitoring và kiểm soát số user như đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"gradual rollout\" + \"control the number of users\" → progressive exposure."
  },
  "516": {
    "stem": "Bạn có Azure Pipelines pipeline tên Pipeline1 với YAML definition như trong exhibit.\nVới mỗi statement, chọn Yes nếu đúng. Chọn No nếu sai.",
    "statements": {
      "1": "Pipeline1 gồm three stages.",
      "2": "$(BuildPlatform) là predefined variable.",
      "3": "$(System.DefaultWorkingDirectory) là predefined variable."
    },
    "answerText": "Yes, No, Yes",
    "explanation": "Đáp án: Yes; No; Yes\n\nĐề đọc YAML của Pipeline1 và đánh giá ba statement.\n\nTheo key nguồn, Pipeline1 consists of three stages nên statement 1 là Yes. $(BuildPlatform) xuất hiện như biến tự đặt (cùng kiểu $(BuildConfiguration), $(Parameters.Solution)), không nằm danh sách predefined variables của Azure Pipelines nên statement 2 là No. $(System.DefaultWorkingDirectory) là predefined variable trỏ working directory trên agent nên statement 3 là Yes.\n\nNếu coi BuildPlatform là predefined thì sai. Nếu phủ nhận System.DefaultWorkingDirectory là predefined thì sai.\n\nKeywords phản xạ nhanh (AZ-400)\n\"$(BuildPlatform)\" → not predefined.\n\"$(System.DefaultWorkingDirectory)\" → predefined."
  },
  "517": {
    "stem": "Bạn dùng Azure Pipelines để build và test code. Bạn cần phân tích agent pool usage. Hai cách nào đạt mục tiêu? Mỗi đáp án đúng là một giải pháp đầy đủ. LƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "options": {
      "A": "Review the historical graph for the agent pools.",
      "B": "Review the Pipeline duration report.",
      "C": "Query the TaskAgentPoolSizeSnapshot/TaskAgentPoolSizeSnapshots endpoint.",
      "D": "Query the PipelineRun/PipelineRuns endpoint."
    },
    "answerText": "A,C",
    "explanation": "Đáp án: Review the historical graph for the agent pools.; Query the TaskAgentPoolSizeSnapshot/TaskAgentPoolSizeSnapshots endpoint.\n\nĐề cần phân tích agent pool usage, không phải thời gian pipeline.\n\nHistorical graph trên agent pool settings vẽ số agent rảnh, job đang chạy và queue theo thời gian. REST TaskAgentPoolSizeSnapshot/TaskAgentPoolSizeSnapshots cho snapshot kích thước và utilization để phân tích theo chương trình.\n\nPipeline duration report đo thời gian chạy pipeline, không phải mức dùng agent pool. PipelineRun/PipelineRuns mô tả lần chạy pipeline, không phải thống kê pool.\n\nKeywords phản xạ nhanh (AZ-400)\n\"analyze agent pool usage\" → historical graph + TaskAgentPoolSizeSnapshot."
  },
  "518": {
    "stem": "Bạn có GitHub organization. Bạn đang tạo GitHub Actions workflow. Bạn cần thực hiện authenticated API requests bằng GitHub App tên App1.\nBốn hành động nào phải làm theo thứ tự?",
    "boxes": {
      "1": {
        "answer": "Register App1 and store the app ID as a GitHub Actions secret."
      },
      "2": {
        "answer": "Generate a private key and store the key as a secret."
      },
      "3": {
        "answer": "Install App1 in your organization."
      },
      "4": {
        "answer": "Generate an installation access token."
      }
    },
    "answerText": "Register App1 and store the app ID as a GitHub Actions secret., Generate a private key and store the key as a secret., Install App1 in your organization., Generate an installation access token.",
    "explanation": "Đáp án: Register App1 and store the app ID as a GitHub Actions secret.; Generate a private key and store the key as a secret.; Install App1 in your organization.; Generate an installation access token.\n\nĐề cần GitHub Actions gọi API với tư cách GitHub App App1.\n\nPhải đăng ký App1 và lưu app ID vào secret, tạo private key rồi lưu secret, cài App1 vào organization, sau đó mới generate installation access token để gọi API.\n\nCreate an app manifest không đủ thay bước register và lưu secret. Generate a JSON Web Token (JWT) là bước trung gian khi mint token nhưng không nằm trong bốn bước của đáp án nguồn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub App\" + \"authenticated API\" + \"GitHub Actions\" → register + private key + install + installation access token."
  },
  "519": {
    "stem": "Bạn dùng Azure Pipelines pipeline để build và deploy một app.\nBạn có custom test task với các input sau:\n• testResultsFiles: **/TEST-*.trx\n• searchFolder: $(System.DefaultWorkingDirectory)\n• mergeTestResults: true\nBạn nên dùng format nào cho input data của testResultsFiles?",
    "options": {
      "A": "VSTest",
      "B": "NUnit",
      "C": "CTest",
      "D": "JUnit"
    },
    "answerText": "A",
    "explanation": "Đáp án: VSTest\n\nĐề hỏi format kết quả test khi testResultsFiles là **/TEST-*.trx.\n\nFile .trx là kết quả Visual Studio Test (VSTest). Publish Test Results với pattern TEST-*.trx phải chọn VSTest thì pipeline mới parse và merge đúng.\n\nNUnit, CTest và JUnit xuất XML theo schema riêng, không phải .trx. Chọn các format đó với file .trx sẽ lỗi hoặc không ra report.\n\nKeywords phản xạ nhanh (AZ-400)\n\"TEST-*.trx\" + \"testResultsFiles\" → VSTest."
  },
  "520": {
    "stem": "Bạn dùng Azure Pipelines pipeline để build, test và deploy app tên App1.\nBạn cần rút thời gian chạy unit tests và integration tests của App1. Giải pháp phải giữ nguyên code coverage testing ratio.\nBạn nên làm gì?",
    "options": {
      "A": "Enable flaky test management",
      "B": "Purchase additional parallel jobs.",
      "C": "Enable Test Impact Analysis (TIA).",
      "D": "Add an agent pool."
    },
    "answerText": "C",
    "explanation": "Đáp án: Enable Test Impact Analysis (TIA).\n\nĐề cần chạy unit và integration tests nhanh hơn nhưng vẫn giữ code coverage ratio.\n\nTest Impact Analysis chỉ chạy test bị ảnh hưởng bởi thay đổi code. Tập test liên quan vẫn cover phần vừa sửa nên thời gian giảm mà tỷ lệ coverage trên phần đổi không bị bỏ.\n\nFlaky test management xử lý test lúc pass lúc fail, không giảm số test phải chạy. Additional parallel jobs và thêm agent pool chạy song song nhiều test hơn, tốn tài nguyên, không cắt tập test theo impact và không phải cách giữ coverage bằng cách chọn đúng test.\n\nKeywords phản xạ nhanh (AZ-400)\n\"reduce test time\" + \"code coverage\" → Test Impact Analysis (TIA)."
  },
  "521": {
    "stem": "Bạn có app được deploy tới hai environments tên Production-A và Production-B bằng Azure Pipelines. Bạn cần cấu hình release pipeline đánh dấu app complete và sẵn sàng release vào Production-B. Giải pháp phải:\n• Không còn Azure Monitor alerts đang active trên Production-A trước khi đánh complete.\n• Giảm tối đa administrative effort.\nBạn nên làm gì?",
    "options": {
      "A": "To the Production-B environment stage, add a pre-deployment gate that will query Azure Monitor.",
      "B": "To the Production-A environment stage, add a post-deployment gate that will query Azure Monitor.",
      "C": "To the Production-A environment stage, add a post-deployment approval.",
      "D": "To the Production-A environment stage, add a pre-deployment gate that will query Azure Monitor."
    },
    "answerText": "B",
    "explanation": "Đáp án: To the Production-A environment stage, add a post-deployment gate that will query Azure Monitor.\n\nĐề cần tự động xác nhận Production-A hết active alerts rồi mới coi app ready cho Production-B.\n\nPost-deployment gate trên stage Production-A chạy sau khi deploy xong A, query Azure Monitor, chặn chuyển tiếp nếu còn alert. Không cần người duyệt.\n\nPre-deployment gate trên Production-B kiểm trước khi vào B nhưng không gắn mốc complete trên A sau deploy. Post-deployment approval trên A là duyệt tay, trái minimize administrative effort. Pre-deployment gate trên Production-A chạy trước khi deploy A, chưa có tín hiệu alert sau khi app lên A.\n\nKeywords phản xạ nhanh (AZ-400)\n\"no active Azure Monitor alerts\" + \"Production-A\" + \"ready for Production-B\" → post-deployment gate on Production-A."
  },
  "522": {
    "stem": "Bạn định tạo package feed mới gồm các views: @Local, @Latest, @Release, @Prerelease. View nào phải tạo thủ công?",
    "options": {
      "A": "@Local",
      "B": "@Latest",
      "C": "@Release",
      "D": "@Prerelease"
    },
    "answerText": "B",
    "explanation": "Đáp án: @Latest\n\nĐề hỏi view nào trên Azure Artifacts feed phải tạo tay.\n\nFeed mới mặc định có @Local, @Prerelease và @Release. @Latest không được tạo sẵn nên phải tạo thủ công nếu muốn dùng.\n\n@Local luôn có, chứa package publish thẳng lên feed hoặc lấy từ upstream. @Prerelease và @Release là view mặc định cho luồng promote. Không cần tạo ba view này bằng tay.\n\nKeywords phản xạ nhanh (AZ-400)\n\"package feed views\" + \"create manually\" → @Latest."
  },
  "523": {
    "stem": "Bạn định tạo image chứa .NET Core application. Bạn có Dockerfile với các dòng sau (số dòng chỉ để tham chiếu):\n01 FROM mcr.microsoft.com/dotnet/sdk:7.0\n02 COPY . /\n03 RUN dotnet publish -c Release -o out\n04 FROM mcr.microsoft.com/dotnet/sdk:7.0\n05 COPY --from=0 /out /\n06 WORKDIR /\n07 ENTRYPOINT [\"dotnet\", \"app1.dll\"]\nBạn cần image nhỏ nhất khi build. Nên sửa dòng nào?",
    "options": {
      "A": "1",
      "B": "3",
      "C": "4",
      "D": "7"
    },
    "answerText": "C",
    "explanation": "Đáp án: 4\n\nĐề dùng multi-stage Dockerfile và cần image cuối nhỏ nhất.\n\nDòng 4 đang FROM mcr.microsoft.com/dotnet/sdk:7.0 cho runtime stage. SDK chứa compiler và SDK tools, rất nặng. Đổi dòng 4 sang runtime image (aspnet hoặc runtime) thì layer cuối chỉ còn runtime để chạy app1.dll.\n\nDòng 1 phải giữ SDK để publish. Dòng 3 là publish Release, đã tối ưu output chứ không phải chỗ giảm base image. Dòng 7 ENTRYPOINT chỉ lệnh chạy, không đổi kích thước image.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Dockerfile\" + \"image as small as possible\" + \"second FROM sdk\" → change line 4 to runtime."
  },
  "524": {
    "stem": "Bạn có Azure subscription gồm app tên App1. Bạn có Azure DevOps project với hai environments tên Staging và Production. Bạn dùng Azure Pipelines để deploy App1. Bạn cần validate performance của App1 trên Staging trước khi deploy lên Production. Giải pháp phải giảm tối đa administrative effort. Bạn nên làm gì trong Azure DevOps project?",
    "options": {
      "A": "In the production branch policy, add a status check to query Azure Monitor Alerts for active alerts.",
      "B": "In the Production environment, add a check to query Azure Monitor Alerts for active alerts.",
      "C": "In the Production environment stage, add a post-deployment approval for the Azure Monitor Alerts group.",
      "D": "In the Staging environment add a check to query Azure Monitor Alerts for active alerts."
    },
    "answerText": "D",
    "explanation": "Đáp án: In the Staging environment add a check to query Azure Monitor Alerts for active alerts.\n\nĐề cần kiểm performance trên Staging trước khi lên Production, ít thao tác tay.\n\nCheck trên Staging environment query Azure Monitor Alerts. Còn alert thì chặn promote. Đây là cổng tự động đúng chỗ validate.\n\nProduction branch policy status check gắn với PR/code, không đo app đang chạy trên Staging. Check hoặc post-deployment approval trên Production để app tới Production rồi mới soi, trễ hơn yêu cầu và approval tốn người duyệt.\n\nKeywords phản xạ nhanh (AZ-400)\n\"validate performance\" + \"Staging before Production\" → Staging environment Azure Monitor Alerts check."
  },
  "525": {
    "stem": "Lưu ý: Câu này thuộc series cùng kịch bản. Mỗi câu có một solution riêng. Một số bộ có nhiều đáp án đúng, một số không. Sau khi trả lời bạn không quay lại được câu này.\n\nBạn cần dùng Azure Pipelines để build, test app và test database. Giải pháp phải thỏa:\n• Các test stages chạy song song.\n• Stage Publish_Test_Results luôn chạy.\n• Các test stages chỉ chạy sau khi build stage thành công.\n• Publish_Test_Results chạy sau khi mọi test stages kết thúc.\n\nSolution: Bạn đưa các phần tử sau vào YAML (như exhibit): Build_App; Test_App dependsOn Build_App; Test_Database dependsOn Build_App; Publish_Test_Results không dependsOn các test stages và không có condition: always().\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "answerText": "B",
    "explanation": "Đáp án: No\n\nĐề cần test song song sau build thành công, rồi Publish_Test_Results luôn chạy sau mọi test.\n\nYAML exhibit để Test_App và Test_Database dependsOn Build_App nên hai test có thể song song sau build. Publish_Test_Results không dependsOn các test stages và không có condition: always(), nên không chờ hết test và không đảm bảo luôn chạy.\n\nThiếu dependsOn test stages và always() nên solution không đủ bốn yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Publish_Test_Results\" + \"no always()\" + \"no dependsOn tests\" → No."
  },
  "526": {
    "stem": "Lưu ý: Câu này thuộc series cùng kịch bản. Mỗi câu có một solution riêng. Một số bộ có nhiều đáp án đúng, một số không. Sau khi trả lời bạn không quay lại được câu này.\n\nBạn cần dùng Azure Pipelines để build, test app và test database. Giải pháp phải thỏa:\n• Các test stages chạy song song.\n• Stage Publish_Test_Results luôn chạy.\n• Các test stages chỉ chạy sau khi build stage thành công.\n• Publish_Test_Results chạy sau khi mọi test stages kết thúc.\n\nSolution: Bạn đưa các phần tử sau vào YAML (như exhibit): Test_App và Test_Database có dependsOn: []; Publish_Test_Results dependsOn Build_App, Test_App, Test_Database với condition: succeededOrFailed().\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "answerText": "B",
    "explanation": "Đáp án: No\n\nĐề cần test chỉ chạy sau build thành công, chạy song song, và Publish_Test_Results luôn chạy sau mọi test.\n\ndependsOn: [] trên Test_App và Test_Database nghĩa là hai stage đó không chờ Build_App, có thể chạy cùng lúc với build, phá yêu cầu “test after successful build”. condition: succeededOrFailed() khác always(): không chạy khi pipeline bị canceled.\n\nSolution không đạt vì test không phụ thuộc build thành công và Publish không dùng always().\n\nKeywords phản xạ nhanh (AZ-400)\n\"dependsOn: []\" + \"test after build\" → No."
  },
  "527": {
    "stem": "Lưu ý: Câu này thuộc series cùng kịch bản. Mỗi câu có một solution riêng. Một số bộ có nhiều đáp án đúng, một số không. Sau khi trả lời bạn không quay lại được câu này.\n\nBạn cần dùng Azure Pipelines để build, test app và test database. Giải pháp phải thỏa:\n• Các test stages chạy song song.\n• Stage Publish_Test_Results luôn chạy.\n• Các test stages chỉ chạy sau khi build stage thành công.\n• Publish_Test_Results chạy sau khi mọi test stages kết thúc.\n\nSolution: Bạn đưa các phần tử sau vào YAML (như exhibit): Test_App và Test_Database đều dependsOn Build_App; Publish_Test_Results dependsOn Build_App, Test_App, Test_Database và condition: always().\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "answerText": "A",
    "explanation": "Đáp án: Yes\n\nĐề cần bốn ràng buộc stage cho build, hai test và Publish_Test_Results.\n\nTest_App và Test_Database cùng dependsOn Build_App, không phụ thuộc lẫn nhau, nên chạy song song sau khi build thành công. Publish_Test_Results dependsOn cả build và hai test nên chờ hết test. condition: always() bảo stage publish vẫn chạy dù test fail.\n\nĐây đủ bốn yêu cầu, khác các solution thiếu always() hoặc để test dependsOn rỗng.\n\nKeywords phản xạ nhanh (AZ-400)\n\"dependsOn Build_App\" + \"condition: always()\" + \"Publish_Test_Results\" → Yes."
  },
  "528": {
    "stem": "Bạn có Azure Pipelines pipeline với definition như exhibit (jobs A–E và dependsOn). Với mỗi statement, chọn Yes nếu đúng. Chọn No nếu sai.",
    "statements": {
      "1": "Job E có thể bắt đầu trước khi job C hoàn tất.",
      "2": "Job B có thể chạy đồng thời với job C.",
      "3": "Job D có thể bắt đầu trước khi job B hoàn tất."
    },
    "answerText": "No, Yes, No",
    "explanation": "Đáp án: No; Yes; No\n\nĐề đọc dependsOn: A không phụ thuộc; B và C đều dependsOn A; D dependsOn B và C; E dependsOn B và D.\n\nE chờ D, D chờ C, nên E không thể start trước khi C xong. B và C chỉ chờ A nên chạy song song được. D liệt kê B trong dependsOn nên không start trước khi B xong.\n\nStatement 1 và 3 đảo quan hệ phụ thuộc nên là No. Statement 2 đúng nên là Yes.\n\nKeywords phản xạ nhanh (AZ-400)\n\"dependsOn B, D\" + \"D dependsOn B, C\" → E waits for C.\n\"B and C depend on A\" → concurrent."
  },
  "529": {
    "stem": "Bạn đang phát triển Azure Pipelines pipeline. Bạn cần cấu hình check để query Azure Boards, bảo đảm không còn active work item issues trước khi pipeline deploy build lên production. Bạn nên triển khai loại check nào?",
    "options": {
      "A": "post-deployment approvals",
      "B": "manual validations",
      "C": "pre-deployment gates",
      "D": "pre-deployment approvals"
    },
    "answerText": "C",
    "explanation": "Đáp án: pre-deployment gates\n\nĐề cần check tự động hỏi Azure Boards về work item issues trước khi deploy production.\n\nPre-deployment gates chạy tự động trước stage, gọi REST hoặc function để query Azure Boards và fail nếu còn issue mở.\n\nPost-deployment approvals và pre-deployment approvals cần người bấm, không tự query Boards. Manual validations cũng là bước người xác nhận, thường sau job, không phải cổng tự động trước production.\n\nKeywords phản xạ nhanh (AZ-400)\n\"query Azure Boards\" + \"no active work items\" + \"before production\" → pre-deployment gates."
  },
  "530": {
    "stem": "Bạn có Azure Resource Manager (ARM) template chứa expression: [if(parameters('isComplete'), '1a', '2a')]. Bạn cần migrate template sang Bicep. Bạn nên dùng expression nào?",
    "options": {
      "A": "iif(isComplete, '1a', '2a')",
      "B": "if(isComplete, '1a', '2a')",
      "C": "if('isComplete') '1a' else '2a'",
      "D": "isComplete ? '1a' '2a'"
    },
    "answerText": "D",
    "explanation": "Đáp án: isComplete ? '1a' '2a'\n\nĐề chuyển ARM if(parameters('isComplete'), '1a', '2a') sang Bicep.\n\nBicep dùng toán tử điều kiện dạng ternary trên tham số isComplete. Đáp án nguồn là option D: isComplete ? '1a' '2a'.\n\niif(...) không phải hàm điều kiện chuẩn trong Bicep. if(isComplete, '1a', '2a') sao chép chữ ký hàm ARM, sai cú pháp Bicep. if('isComplete') '1a' else '2a' vừa sai cú pháp vừa dùng chuỗi 'isComplete' thay vì giá trị parameter.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ARM if(parameters())\" + \"migrate to Bicep\" → ternary isComplete ? ..."
  },
  "531": {
    "stem": "Lưu ý: Câu này thuộc series cùng kịch bản. Mỗi câu có một solution riêng. Một số bộ có nhiều đáp án đúng, một số không. Sau khi trả lời bạn không quay lại được câu này.\n\nBạn dùng Azure Pipelines để build và release web apps.\nBạn cần cấu hình pipeline thỏa:\n• Chỉ chạy khi có thay đổi trong folder /webapp.\n• Chỉ chạy khi một PR được tạo.\n\nSolution: Bạn cấu hình YAML như exhibit: trigger.paths include /webapp và trigger.branches include refs/head/pr.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "answerText": "B",
    "explanation": "Đáp án: No\n\nĐề chỉ muốn pipeline chạy khi đổi /webapp và chỉ khi tạo PR.\n\nExhibit dùng khối trigger (CI) với path /webapp và branch refs/head/pr. Đó là CI trên nhánh tên giống PR, không phải khối pr:. Pipeline vẫn chạy theo push CI, không đúng “only run when a PR is created”.\n\nCần trigger: none và khối pr: với paths /webapp. Solution này không đạt.\n\nKeywords phản xạ nhanh (AZ-400)\n\"only when a PR is created\" + \"trigger: paths\" → No."
  },
  "532": {
    "stem": "Lưu ý: Câu này thuộc series cùng kịch bản. Mỗi câu có một solution riêng. Một số bộ có nhiều đáp án đúng, một số không. Sau khi trả lời bạn không quay lại được câu này.\n\nBạn dùng Azure Pipelines để build và release web apps.\nBạn cần cấu hình pipeline thỏa:\n• Chỉ chạy khi có thay đổi trong folder /webapp.\n• Chỉ chạy khi một PR được tạo.\n\nSolution: Bạn cấu hình YAML như exhibit: trigger.paths include /webapp và trigger.branches include pr.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "answerText": "B",
    "explanation": "Đáp án: No\n\nĐề chỉ chạy khi đổi /webapp và chỉ khi tạo PR.\n\nExhibit vẫn là CI trigger, path /webapp và branch tên pr. Nhánh pr không phải sự kiện pull request. Thiếu khối pr: và thiếu trigger: none nên push lên nhánh đó vẫn chạy pipeline.\n\nSolution không thỏa “only run when a PR is created”.\n\nKeywords phản xạ nhanh (AZ-400)\n\"trigger branches: pr\" + \"only when a PR is created\" → No."
  },
  "533": {
    "stem": "Lưu ý: Câu này thuộc series cùng kịch bản. Mỗi câu có một solution riêng. Một số bộ có nhiều đáp án đúng, một số không. Sau khi trả lời bạn không quay lại được câu này.\n\nBạn dùng Azure Pipelines để build và release web apps.\nBạn cần cấu hình pipeline thỏa:\n• Chỉ chạy khi có thay đổi trong folder /webapp.\n• Chỉ chạy khi một PR được tạo.\n\nSolution: Bạn cấu hình YAML như exhibit: pr.paths include /pr và pr.branches include refs/head/webapp.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "answerText": "B",
    "explanation": "Đáp án: No\n\nĐề lọc path /webapp và chỉ chạy cho PR.\n\nExhibit có khối pr: nhưng paths là /pr chứ không phải /webapp, còn branches lại là refs/head/webapp. Path và branch bị đảo, không bắt thay đổi trong /webapp khi mở PR đúng nghĩa đề.\n\nSolution không đạt hai yêu cầu cùng lúc.\n\nKeywords phản xạ nhanh (AZ-400)\n\"pr: paths: /pr\" + \"/webapp folder\" → No."
  },
  "534": {
    "stem": "Bạn đang dùng Azure Pipelines để build và deploy web app.\nBạn cần testing strategy thỏa:\n• Validate scalability của app.\n• Test một code module mà không test dependencies của module đó.\n• Validate tương tác và dependencies giữa app và các dependent services.",
    "boxes": {
      "1": {
        "answer": "Load"
      },
      "2": {
        "answer": "Unit"
      },
      "3": {
        "answer": "Integration"
      }
    },
    "answerText": "Load, Unit, Integration",
    "explanation": "Đáp án: Load; Unit; Integration\n\nĐề khớp từng yêu cầu với loại test.\n\nLoad test tạo tải để kiểm scalability. Unit test cô lập một module, mock dependencies. Integration test kiểm tương tác giữa app và service phụ thuộc.\n\nAcceptance gắn tiêu chí nghiệp vụ end-to-end, không phải scalability hay unit isolation. Smoke chỉ kiểm đường đi chính còn sống, không đo scale và không thay integration đầy đủ.\n\nKeywords phản xạ nhanh (AZ-400)\n\"scalability\" → Load.\n\"without testing dependencies\" → Unit.\n\"interactions and dependent services\" → Integration."
  },
  "535": {
    "stem": "Bạn có Azure subscription chứa 50 virtual machines.\nBạn quản lý cấu hình các virtual machines bằng Azure Automation State Configuration.\nBạn cần đảm bảo Windows Defender được cài trên mỗi virtual machine và Windows Defender service đang chạy.\nHoàn thiện Desired State Configuration (DSC) code như thế nào? Kéo giá trị phù hợp vào đúng vị trí.",
    "boxes": {
      "1": {
        "answer": "'Present'"
      },
      "2": {
        "answer": "'Running'"
      }
    },
    "answerText": "'Present', 'Running'",
    "explanation": "Đáp án: 'Present'; 'Running'\n\nĐề dùng Azure Automation State Configuration / DSC để Windows Defender vừa được cài vừa có service đang chạy trên 50 VM.\n\nWindowsFeature (hoặc package tương đương) dùng Ensure = 'Present' để role/feature tồn tại. Service dùng State = 'Running' để dịch vụ Windows Defender chạy.\n\n'Absent' gỡ feature. 'Stopped' để service dừng. Hai giá trị đó trái yêu cầu installed and running.\n\nKeywords phản xạ nhanh (AZ-400)\n\"DSC\" + \"Windows Defender installed\" + \"service is running\" → 'Present' + 'Running'."
  },
  "536": {
    "stem": "Khởi tạo default main branch nếu chưa có.\nTrong organization User1-12345678, cài Microsoft Security DevOps extension.\nTiếp theo, tạo starter pipeline mới tên starter1 dùng starter code cho sẵn. starter1 phải có task chạy extension với các input sau:\n• Command: run\n• Policy: azuredevops\n• Publish: true\nLưu pipeline vào branch mới tên starter.",
    "explanation": "Đáp án: Cài Microsoft Security DevOps extension, tạo starter pipeline starter1 có task MicrosoftSecurityDevOps với command run, policy azuredevops, publish true, rồi lưu trên branch starter.\n\nĐề là lab: cài extension bảo mật, tạo YAML starter pipeline và commit sang branch starter.\n\nMicrosoft Security DevOps (MicrosoftSecurityDevOps) quét secret, dependency và misconfiguration ngay trong Azure Pipelines. Task chính thức nhận command: run, policy: azuredevops và publish: true để chạy bộ rule Azure DevOps rồi đẩy kết quả lên pipeline. Lưu YAML trên branch starter đúng yêu cầu tách khỏi main.\n\nThiếu task hoặc sai input (policy khác azuredevops, publish false) thì pipeline không chạy đúng extension. Lưu lên main thay vì starter thì không đạt nhánh yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Microsoft Security DevOps\" + \"starter pipeline\" + \"policy azuredevops\" → MicrosoftSecurityDevOps command run, publish true, branch starter.",
    "answerText": "simulation"
  },
  "537": {
    "stem": "Khởi tạo default main branch nếu chưa có.\nTrong Project1, tạo Azure Pipelines YAML pipeline mới từ template ASP.NET.\nPipeline phải dùng Azure Repos làm hosting platform và phải được tạo trên branch mới tên azurepipelines.",
    "explanation": "Đáp án: Trong Project1, tạo YAML pipeline từ template ASP.NET, chọn Azure Repos, lưu trên branch azurepipelines.\n\nĐề lab yêu cầu pipeline ASP.NET mới, source trên Azure Repos, không commit thẳng main.\n\nWizard New pipeline → Azure Repos Git → chọn repo → template ASP.NET sinh YAML restore/build/test cho .NET. Tạo hoặc chọn branch azurepipelines khi save để tách định nghĩa pipeline khỏi default branch.\n\nChọn GitHub hoặc Bitbucket thì sai hosting platform. Dùng template khác ASP.NET thì không đúng stack. Lưu lên main thì thiếu branch azurepipelines.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ASP.NET template\" + \"Azure Repos\" + \"branch azurepipelines\" → YAML pipeline từ ASP.NET trên Azure Repos, branch azurepipelines.",
    "answerText": "simulation"
  },
  "538": {
    "stem": "Trong Project1, tạo variable group tên varGroup1 gồm các biến:\nserverName: server1\ndbName: db1",
    "explanation": "Đáp án: Tạo variable group varGroup1 với serverName=server1 và dbName=db1.\n\nĐề lab cần nhóm biến dùng chung cho pipeline, không hard-code tên server và database.\n\nVào Pipelines → Library → Variable groups → New. Đặt tên varGroup1, thêm serverName giá trị server1 và dbName giá trị db1, rồi Save. Pipeline tham chiếu group này để lấy connection name thống nhất.\n\nTạo hai variable lẻ trên một pipeline thì không phải variable group. Sai tên group hoặc sai key/value thì không khớp đề. Pipeline variables không tái sử dụng được như Library group.\n\nKeywords phản xạ nhanh (AZ-400)\n\"variable group\" + \"varGroup1\" → Library variable group serverName=server1, dbName=db1.",
    "answerText": "simulation"
  },
  "539": {
    "stem": "Với Project1, cần giữ artifacts, symbols và attachments trong 60 ngày.",
    "explanation": "Đáp án: Đặt project retention của artifacts, symbols và attachments thành 60 ngày.\n\nĐề lab siết thời gian giữ build output của Project1, không phải retention mặc định organization.\n\nVào Project settings → Pipelines → Settings (hoặc Retention). Đặt số ngày retain cho artifacts, symbols và attachments bằng 60 rồi lưu. Policy project ghi đè mặc định và áp cho các pipeline trong Project1.\n\nChỉ sửa retention một pipeline thì không cover cả project. Đặt 30 ngày hoặc để unlimited thì không đúng 60 ngày. Organization retention ảnh hưởng mọi project, rộng hơn phạm vi Project1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"artifacts, symbols, and attachments\" + \"60 days\" → Project settings pipeline retention 60 days.",
    "answerText": "simulation"
  },
  "540": {
    "stem": "Lưu ý: Câu này thuộc chuỗi cùng scenario, mỗi câu một giải pháp; có thể có nhiều đáp án đúng hoặc không có đáp án đúng. Trả lời xong không quay lại được.\n\nBạn cần dùng Azure Pipelines để test app, thỏa:\n• Pipeline phải fail nếu bất kỳ test nào fail.\n• Test results phải được publish lên pipeline.\n• Test của mọi lần chạy phải được trigger trừ khi pipeline bị cancel.\n\nGiải pháp: Đưa các phần tử sau vào YAML (PublishTestResults@2, condition: not(canceled()), failTaskOnFailedTests: true).\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: Yes\n\nĐề cần pipeline test fail khi test fail, publish kết quả, và vẫn chạy test trừ khi pipeline bị cancel. Solution dùng PublishTestResults@2 với failTaskOnFailedTests: true và condition: not(canceled()).\n\nPublishTestResults@2 đẩy file JUnit lên tab Tests. failTaskOnFailedTests: true làm task (và job) fail khi có test fail. not(canceled()) cho phép task chạy ở trạng thái succeeded hoặc failed, chỉ bỏ qua khi run bị cancel. Ba yêu cầu đều được đáp ứng.\n\nKhông thiếu publish task, không thiếu fail-on-failed-tests, không dùng condition chặn khi có test fail. Solution đạt mục tiêu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"failTaskOnFailedTests: true\" + \"PublishTestResults\" + \"not(canceled())\" → Yes.",
    "answerText": "A"
  },
  "541": {
    "stem": "Lưu ý: Câu này thuộc chuỗi cùng scenario, mỗi câu một giải pháp; có thể có nhiều đáp án đúng hoặc không có đáp án đúng. Trả lời xong không quay lại được.\n\nBạn cần dùng Azure Pipelines để test app, thỏa:\n• Pipeline phải fail nếu bất kỳ test nào fail.\n• Test results phải được publish lên pipeline.\n• Test của mọi lần chạy phải được trigger trừ khi pipeline bị cancel.\n\nGiải pháp: Đưa các phần tử sau vào YAML (PublishTestResults@2, condition: succeededOrFailed(), failTaskOnFailureToPublishResults: true).\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: No\n\nĐề cùng ba yêu cầu test. Solution publish kết quả nhưng đặt failTaskOnFailureToPublishResults: true và không có failTaskOnFailedTests: true.\n\nfailTaskOnFailureToPublishResults chỉ fail khi không publish được file kết quả. Test fail vẫn có thể để task succeeded nếu file JUnit publish thành công. Như vậy pipeline không bắt buộc fail khi test fail — thiếu yêu cầu đầu.\n\nsucceededOrFailed() vẫn chạy khi job trước fail và không chạy khi cancel, nên điều kiện trigger gần đúng, nhưng thiếu fail-on-failed-tests nên cả solution không đạt.\n\nKeywords phản xạ nhanh (AZ-400)\n\"failTaskOnFailureToPublishResults\" + thiếu \"failTaskOnFailedTests\" → No.",
    "answerText": "B"
  },
  "542": {
    "stem": "Bạn có app tên App1 được build và deploy bằng containers.\nDockerfile của App1 có định nghĩa như exhibit (nhiều giai đoạn FROM mcr.microsoft.com/dotnet/sdk:8.0, restore/build/publish App1.csproj với -c Release, ENTRYPOINT dotnet App1.dll).\nVới mỗi phát biểu, chọn Yes nếu đúng, No nếu sai.",
    "statements": {
      "1": "App1 là ASP.NET Core app.",
      "2": "Build dùng debug configuration.",
      "3": "Dockerfile dùng Docker multi-stage build."
    },
    "explanation": "Đáp án: Yes; No; Yes\n\nĐề đọc Dockerfile exhibit của App1 rồi đánh giá ba phát biểu.\n\nApp1 là ASP.NET Core: image mcr.microsoft.com/dotnet/sdk:8.0, file App1.csproj và ENTRYPOINT dotnet App1.dll. Đó là pattern ASP.NET Core / .NET, nên Yes.\n\nBuild không dùng debug: các lệnh dotnet build và dotnet publish đều có -c Release. Configuration là Release, phát biểu debug là No.\n\nDockerfile có nhiều lệnh FROM (base, build, publish, final) và COPY --from giữa stage. Đó là multi-stage build, nên Yes.\n\nMột stage FROM duy nhất mới không phải multi-stage. -c Debug mới khớp phát biểu 2.\n\nKeywords phản xạ nhanh (AZ-400)\n\"dotnet/sdk\" + \"-c Release\" + nhiều \"FROM\" → ASP.NET Core Yes; debug No; multi-stage Yes.",
    "answerText": "Yes, No, Yes"
  },
  "543": {
    "stem": "Bạn có Azure DevOps subscription gồm các project trong bảng (Name, Number of users, Repository, Visibility).\nProject1 và Project2: public repository trên Azure Repos, visibility Public.\nProject3: Private GitHub repository, visibility Private.\nProject4: Public GitHub repository, visibility Public.\nProject5: Public GitHub repository, visibility Private.\nBạn build app bằng Azure Pipelines.\nHai project nào đủ điều kiện được cấp free parallel jobs? Mỗi đáp án đúng là một phần của giải pháp.",
    "options": {
      "A": "Project1",
      "B": "Project3",
      "C": "Project4",
      "D": "Project2",
      "E": "Project5"
    },
    "explanation": "Đáp án: Project1; Project2\n\nĐề chọn hai project đủ tiêu chí free parallel jobs của Azure Pipelines theo bảng visibility và loại repository.\n\nTheo đáp án chính thức, Project1 và Project2 là public Azure DevOps / Azure Repos projects nên nhận free Microsoft-hosted parallel jobs. Cả hai dùng Project1 public repository và visibility Public.\n\nProject3 visibility Private nên không được grant public. Project5 dù GitHub public nhưng visibility project Private nên không thuộc cặp được chọn. Project4 là Public GitHub / Public nhưng không nằm trong hai keys; đề chỉ lấy Project1 và Project2.\n\nKeywords phản xạ nhanh (AZ-400)\n\"free parallel jobs\" + \"Public\" + \"Azure Repos\" → Project1 + Project2.",
    "answerText": "A,D"
  },
  "544": {
    "stem": "Bạn có Azure Pipelines với định nghĩa jobs như exhibit:\njob A không dependsOn;\njob B dependsOn: [];\njob C dependsOn: [];\njob D dependsOn: C.\nVới mỗi phát biểu, chọn Yes nếu đúng, No nếu sai.",
    "statements": {
      "1": "Job B có thể chạy đồng thời với job A.",
      "2": "Job D có thể chạy đồng thời với job B.",
      "3": "Job C có thể chạy đồng thời với job D."
    },
    "explanation": "Đáp án: Yes; Yes; No\n\nĐề đọc đồ thị phụ thuộc YAML rồi xét job nào chạy song song được.\n\nJob B có dependsOn: [] nghĩa là không phụ thuộc job nào, kể cả A. A cũng không khai báo dependsOn. A và B có thể start cùng lúc, nên Yes.\n\nJob D chỉ dependsOn C, không phụ thuộc B. B và D độc lập nên có thể chồng thời gian, Yes.\n\nJob D chờ C xong mới chạy. C và D không concurrent, nên No.\n\ndependsOn: [] khác với việc kế thừa job đứng trước. Nhầm D phụ thuộc mọi job trước sẽ trả lời sai phát biểu 2.\n\nKeywords phản xạ nhanh (AZ-400)\n\"dependsOn: []\" + \"dependsOn: C\" → B song song A; D song song B; C không song song D.",
    "answerText": "Yes, Yes, No"
  },
  "545": {
    "stem": "Bạn dùng Azure Pipelines để build và test app tên App1. Bộ phận development làm việc trên feature branches.\nBạn cần pull request chỉ merge vào main khi testing cover hơn 90 percent code.\nBạn nên làm gì?",
    "options": {
      "A": "Configure a branch policy for the feature branches.",
      "B": "Configure a branch policy for the main branch.",
      "C": "Create a Publish Test Results task,",
      "D": "Create a code coverage configuration YAML file."
    },
    "explanation": "Đáp án: Configure a branch policy for the main branch.\n\nĐề chặn merge vào main trừ khi code coverage vượt 90 percent. Development đang làm trên feature branches.\n\nBranch policy gắn trên target branch của pull request. Policy Build validation trên main chạy pipeline coverage và có thể yêu cầu threshold; PR không complete được nếu coverage dưới 90 percent. Đó là chỗ enforce đúng.\n\nPolicy trên feature branches chỉ siết nhánh nguồn, không chặn merge vào main. Publish Test Results chỉ hiện kết quả, không gate PR. File YAML coverage hỗ trợ đo, nhưng không tự cấm merge nếu không có branch policy trên main.\n\nKeywords phản xạ nhanh (AZ-400)\n\"pull request\" + \"main\" + \"code coverage 90 percent\" → branch policy on main.",
    "answerText": "B"
  },
  "546": {
    "stem": "Bạn định build app tên App1 trên GitHub.\nCần recommend giải pháp build và deployment thỏa:\n• Code của App1 chỉ được đưa đi test khi build đã completed successfully.\n• Build phải được change management team approve trước khi release.\nChọn option phù hợp cho từng yêu cầu.",
    "boxes": {
      "1": {
        "label": "Code chỉ submit test khi build completed successfully:",
        "answer": "Jobs"
      },
      "2": {
        "label": "Build được change management approve trước khi release:",
        "answer": "Pull requests"
      }
    },
    "explanation": "Đáp án: Jobs; Pull requests\n\nĐề chọn thành phần GitHub cho thứ tự build-then-test và cho bước approve trước release.\n\nJobs cho phép job test khai báo needs tới job build. Job phụ thuộc chỉ chạy khi job trước succeeded, đúng “test only after successful build”.\n\nPull requests bắt change management review và approve trước khi merge/release. Đó là cổng phê duyệt trên GitHub đúng yêu cầu thứ hai theo keys.\n\nEnvironments có required reviewers cũng dùng cho deploy, nhưng đáp án chính thức là Pull requests. Matrices nhân biến thể build, không tạo cổng approve. Packages phân phối artifact, không điều kiện test hay approve.\n\nKeywords phản xạ nhanh (AZ-400)\n\"test only when build succeeded\" + \"approved before released\" → Jobs + Pull requests.",
    "answerText": "Jobs, Pull requests"
  },
  "547": {
    "stem": "Bạn có Azure Pipelines tên Pipeline1 và user User1. Pipeline1 có temporary final stage tên final1.\nCần User1 xóa được final1 khi testing xong, theo nguyên tắc least privilege.\nNên cấp quyền cho User1 ở cấp nào?",
    "options": {
      "A": "pipeline",
      "B": "organization",
      "C": "stage",
      "D": "project"
    },
    "explanation": "Đáp án: pipeline\n\nĐề cho User1 quyền xóa temporary stage final1 trên Pipeline1, phạm vi nhỏ nhất có thể.\n\nQuyền Manage / Edit tại pipeline cho phép sửa YAML hoặc classic release và xóa stage final1, chỉ trong Pipeline1. Đó là mức least privilege còn thao tác được.\n\nOrganization mở quyền mọi project và pipeline, vượt nhu cầu. Azure DevOps không có permission delete stage riêng ở cấp stage; stage chủ yếu có check approve/deploy. Project cho User1 đụng nhiều pipeline khác, rộng hơn cần thiết.\n\nKeywords phản xạ nhanh (AZ-400)\n\"delete\" + \"temporary stage\" + \"least privilege\" → pipeline-level permission.",
    "answerText": "A"
  },
  "548": {
    "stem": "Bạn đang cấu hình Azure DevOps dashboard cho đúng technical requirements.\nWidget nào cho từng metric? Kéo widget phù hợp vào từng metric. Mỗi widget dùng một lần, nhiều lần, hoặc không dùng.",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Sprint burndown"
      },
      "2": {
        "label": "Zone 2",
        "answer": "Release pipeline overview"
      },
      "3": {
        "label": "Zone 3",
        "answer": "Query tile"
      }
    },
    "explanation": "Đáp án: Sprint burndown; Release pipeline overview; Query tile\n\nĐề map widget dashboard với metric trong technical requirements (tiến độ sprint, trạng thái environment của release, số work item theo query).\n\nSprint burndown vẽ remaining work theo ngày trong sprint hiện tại, đúng metric tiến độ iteration. Release pipeline overview hiện status từng environment trong một release definition. Query tile hiện tổng số kết quả của một work item query, ví dụ số item trạng thái New.\n\nVelocity đo story point hoàn thành qua nhiều sprint, không phải burndown ngày. Query results liệt kê hàng work item, không phải một con số tile. Cumulative flow diagram theo trạng thái kanban, không phải release environment.\n\nKeywords phản xạ nhanh (AZ-400)\n\"sprint remaining work\" + \"release environments\" + \"work item count\" → Sprint burndown + Release pipeline overview + Query tile.",
    "answerText": "Sprint burndown, Release pipeline overview, Query tile"
  },
  "549": {
    "stem": "Bạn định deploy môi trường database mới. Giải pháp phải thỏa technical requirements.\nCần chuẩn bị database cho deployment.\nNên format bản export thế nào?",
    "options": {
      "A": "NDF",
      "B": "BACPAC",
      "C": "DACPAC",
      "D": "MDF"
    },
    "explanation": "Đáp án: BACPAC\n\nĐề chuẩn bị export database để đưa sang môi trường mới, thường là Azure SQL Database, gồm schema và data.\n\nBACPAC đóng gói schema plus data thành một file, import được lên Azure SQL Database mà không cần file system của SQL Server. Đó là format migrate/deploy đầy đủ cho technical requirement kiểu “chuẩn bị database cho deployment”.\n\nDACPAC chủ yếu là schema (data-tier application), thiếu data nếu đề cần cả dữ liệu. MDF và NDF là data file vật lý on-prem, không import trực tiếp lên Azure SQL và phụ thuộc lẫn nhau.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prepare the database\" + \"format the export\" + Azure SQL → BACPAC.",
    "answerText": "B"
  },
  "550": {
    "stem": "Bạn định deploy môi trường database mới. Giải pháp phải thỏa technical requirements. Cần chuẩn bị database cho deployment. Nên format bản export thế nào?",
    "options": {
      "A": "NDF",
      "B": "BACPAC",
      "C": "DACPAC",
      "D": "MDF"
    },
    "explanation": "Đáp án: BACPAC\n\nĐề trùng yêu cầu chuẩn bị export database cho môi trường mới theo technical requirements.\n\nBACPAC mang schema và data, phù hợp đưa database lên Azure SQL Database hoặc instance khác mà không mount file vật lý. Keys chọn B nên đáp án là BACPAC.\n\nDACPAC dùng cho schema deployment/versioning, không thay BACPAC khi cần cả data. NDF là secondary data file, MDF là primary file; cả hai không phải gói vận chuyển sang Azure SQL.\n\nKeywords phản xạ nhanh (AZ-400)\n\"database\" + \"format the export\" → BACPAC.",
    "answerText": "B"
  },
  "551": {
    "stem": "=== Case study description ===\n\nContoso, Ltd. là công ty sản xuất, trụ sở Chicago. Contoso triển khai Azure DevOps trên Azure subscription. Organization có Docker extension, deployment pool Pool7 (10 Azure VM Windows Server 2016) và Azure Automation account.\n\nPlanned projects gồm Project5: Git repository chứa Dockerfile và application source; CI pipeline build/push Docker image. Pipeline phải trigger khi có thay đổi, trừ thay đổi trong /folder1. Có thể include path gốc / và exclude /folder1.\n\nYêu cầu chung: dùng Azure resources khi có thể, tránh deprecated, tự động hóa, giảm administrative effort.\n\nBạn nên cấu hình filters cho trigger của Project5 như thế nào? Chọn option trong answer area.",
    "boxes": {
      "1": {
        "label": "Set [ ] /folder1.",
        "answer": "path filter to exclude"
      },
      "2": {
        "label": "Set a [ ] /.",
        "answer": "path filter to include"
      }
    },
    "explanation": "Đáp án: path filter to exclude; path filter to include\n\nĐề cấu hình CI trigger Project5: chạy khi source đổi, nhưng thay đổi trong /folder1 không được kích hoạt pipeline.\n\nPath filter to exclude trên /folder1 loại commit chỉ đụng thư mục đó. Path filter to include trên / nhận mọi path còn lại trong repo. Kết hợp include gốc và exclude folder1 đúng “trigger all except folder1”.\n\nBranch filter include/exclude theo tên nhánh, không theo thư mục. Exclude / sẽ tắt cả repo. Include /folder1 thì chỉ folder1 mới trigger, đảo yêu cầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Project5 trigger\" + \"/folder1\" + \"/\" → path filter to exclude + path filter to include.",
    "answerText": "path filter to exclude, path filter to include"
  },
  "552": {
    "stem": "Trong Azure DevOps, bạn tạo Project3.\nCần đáp ứng requirements của project.\nBạn nên làm gì trước tiên?",
    "options": {
      "A": "From Azure DevOps, modify the build definition.",
      "B": "From SonarQube, obtain an authentication token.",
      "C": "From Azure DevOps, create a service endpoint.",
      "D": "From SonarQube, create a project."
    },
    "explanation": "Đáp án: From SonarQube, obtain an authentication token.\n\nĐề Project3 (Contoso) phải tích hợp SonarQube. Hỏi bước đầu tiên.\n\nService connection và prepare analysis task cần credential. Authentication token lấy từ SonarQube là secret để Azure DevOps gọi API. Không có token thì không tạo được service endpoint hợp lệ và không chạy được analysis trên build.\n\nSửa build definition khi chưa có token/endpoint thì task SonarQube không authenticate được. Tạo service endpoint thiếu token thì connection fail. Tạo project trên SonarQube hữu ích nhưng vẫn cần token trước để Azure DevOps nói chuyện với server.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Project3\" + \"SonarQube\" + \"first\" → obtain an authentication token.",
    "answerText": "B"
  },
  "553": {
    "stem": "Bạn cần implement Project4. Việc đầu tiên nên làm là gì?",
    "options": {
      "A": "Add the FROM instruction in the Dockerfile file.",
      "B": "Add a Copy and Publish Build Artifacts task to the build pipeline.",
      "C": "Add a Docker task to the build pipeline.",
      "D": "Add the MAINTAINER instruction in the Dockerfile file."
    },
    "explanation": "Đáp án: Add a Docker task to the build pipeline.\n\nĐề Project4 phải build Docker image và push lên Azure Container Registry. Case cho biết Dockerfile đã tồn tại. Hỏi bước first.\n\nDocker task (hoặc Docker@2) trên build pipeline mới gọi docker build/push, gắn service connection tới ACR và trỏ tới Dockerfile sẵn có. Đó là bước mở pipeline cho container.\n\nThêm FROM khi Dockerfile đã có là thừa và không phải first. MAINTAINER đã deprecated, trái “avoid deprecated technologies”. Copy and Publish Build Artifacts dành cho file build, không push image lên ACR.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Project4\" + \"Docker images\" + \"Azure Container Registry\" → add a Docker task first.",
    "answerText": "C"
  },
  "554": {
    "stem": "=== Case study description ===\n\nContoso triển khai Azure DevOps. Technical requirements: implement build agents cho Project1; dùng Azure resources khi có thể; tránh deprecated; giảm administrative effort.\n\nBạn cần recommend quy trình implement build agent cho Project1.\nBa action nào theo thứ tự đúng?",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Sign in to Azure DevOps by using an account that is assigned the Administrator service connection security role."
      },
      "2": {
        "label": "Zone 2",
        "answer": "Create a personal access token in the Azure DevOps organization of Contoso."
      },
      "3": {
        "label": "Zone 3",
        "answer": "Install and register the Azure Pipelines agent on an Azure virtual machine."
      }
    },
    "explanation": "Đáp án: Sign in bằng account có Administrator service connection security role; Create a personal access token trong organization Contoso; Install and register Azure Pipelines agent trên Azure virtual machine.\n\nĐề Project1 cần self-hosted build agent, ưu tiên Azure VM.\n\nPhải đăng nhập bằng identity đủ quyền agent pool / service connection (Administrator service connection security role) rồi mới tạo PAT. PAT là authorization credentials khi config.sh / config.cmd đăng ký agent. Sau đó cài agent trên Azure VM và register vào pool. Thứ tự này khớp unattended/self-hosted setup.\n\nCài agent trước khi có PAT thì register không authenticate được. Tạo PAT khi chưa sign in đúng role thì thiếu quyền cấp token đủ scope. Đăng ký agent trên máy không phải Azure VM trái “use Azure resources”.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Project1 build agent\" + \"Azure VM\" → sign in Admin role + PAT + install/register agent.",
    "answerText": "Sign in to Azure DevOps by using an account that is assigned the Administrator service connection security role., Create a personal access token in the Azure DevOps organization of Contoso., Install and register the Azure Pipelines agent on an Azure virtual machine."
  },
  "555": {
    "stem": "=== Case study description ===\n\nContoso, Ltd. là công ty sản xuất, trụ sở Chicago. Contoso cải thiện IT development và operations bằng Azure DevOps.\nContoso có Azure subscription và Azure DevOps organization gồm Docker extension và deployment pool Pool7 (10 Azure virtual machine Windows Server 2016). Subscription có Azure Automation account.\n\nPlanned projects và technical requirements: implement build agents cho Project1; dùng Azure resources khi có thể; tránh deprecated; code flow Project2 để Team2 gửi pull request, làm việc độc lập trên bản copy, mọi thay đổi trung gian chịu cùng build policy; tự động hóa và giảm administrative effort; implement Project3, Project5, Project6, Project7; Project4 push Docker images lên Azure Container Registry.\n\nBạn đã thêm các virtual machine như managed nodes trong Azure Automation State Configuration.\nCần cấu hình managed computers trong Pool7.\nBước tiếp theo nên làm gì?",
    "options": {
      "A": "Modify the RefreshMode property of the Local Configuration Manager (LCM).",
      "B": "Run the Register-AzureRmAutomationDscNode Azure Powershell cmdlet.",
      "C": "Modify the ConfigurationMode property of the Local Configuration Manager (LCM).",
      "D": "Install PowerShell Core."
    },
    "explanation": "Đáp án: Run the Register-AzureRmAutomationDscNode Azure Powershell cmdlet.\n\nĐề đã thêm VM Pool7 như managed nodes. Hỏi next step để Azure Automation State Configuration quản được chúng.\n\nRegister-AzureRmAutomationDscNode đăng ký Azure VM thành DSC node của Automation account. Node mới pull configuration từ pull server. Đây là bước gắn máy vào State Configuration sau khi đánh dấu managed.\n\nSửa LCM RefreshMode hoặc ConfigurationMode chỉ đổi cách node pull/apply sau khi đã register. Chưa register thì LCM không trỏ Automation account. PowerShell Core không phải bước đăng ký DSC node Windows Server 2016.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Pool7\" + \"Automation State Configuration\" + \"managed nodes\" → Register-AzureRmAutomationDscNode.",
    "answerText": "B"
  },
  "556": {
    "stem": "=== Case study description ===\n\nContoso Project2 cần code flow: Team2 gửi được pull request; Team2 làm việc độc lập trên bản copy của Project2; mọi thay đổi trung gian trên bản copy phải chịu cùng restriction với build policy của Project2.\n\nBạn cần implement code flow strategy cho Project2 trên Azure DevOps.\nBa action nào theo thứ tự đúng?",
    "boxes": {
      "1": {
        "label": "Step 1",
        "answer": "Create a fork"
      },
      "2": {
        "label": "Step 2",
        "answer": "Create a branch"
      },
      "3": {
        "label": "Step 3",
        "answer": "Add a build policy for the master branch"
      }
    },
    "explanation": "Đáp án: Create a fork; Create a branch; Add a build policy for the master branch.\n\nĐề Team2 cần bản copy độc lập, gửi PR về Project2, và mọi commit trung gian vẫn dính build policy như repo gốc.\n\nFork tạo copy repo cho Team2 làm việc độc lập. Branch trên fork chứa thay đổi từng feature trước khi mở pull request. Build policy trên master (default branch của Project2) bắt PR từ fork phải qua cùng build validation như nội bộ Team Contoso.\n\nChỉ tạo branch trên repo gốc thì Team2 không có copy độc lập. Policy trên feature branch của fork không bảo vệ master Project2. Thứ tự fork → branch → policy trên master khớp scenario.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Team2\" + \"copy of Project2\" + \"same build policy\" → fork + branch + build policy on master.",
    "answerText": "Create a fork, Create a branch, Add a build policy for the master branch"
  },
  "557": {
    "stem": "=== Case study description ===\n\nContoso có Azure Automation account và Pool7 gồm 10 Azure VM Windows Server 2016. Cần dùng Azure Automation State Configuration (DSC) để cấu hình các máy này. Ưu tiên Azure resources và automation.\n\nBạn cần cấu hình Azure Automation cho computers trong Pool7.\nBa action nào theo thứ tự đúng?",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Create a Desired State Configuration (DSC) configuration file that has an extension of .ps1."
      },
      "2": {
        "label": "Zone 2",
        "answer": "Run the Import-AzureRmAutomationDscConfiguration Azure PowerShell cmdlet."
      },
      "3": {
        "label": "Zone 3",
        "answer": "Run the Start-AzureRmAutomationDscCompilationJob Azure PowerShell cmdlet."
      }
    },
    "explanation": "Đáp án: Tạo DSC configuration file đuôi .ps1; Import-AzureRmAutomationDscConfiguration; Start-AzureRmAutomationDscCompilationJob.\n\nĐề soạn và nạp configuration cho Pool7 trên Azure Automation State Configuration.\n\nFile .ps1 chứa block Configuration là artifact DSC. Import-AzureRmAutomationDscConfiguration đưa script vào Automation account. Start-AzureRmAutomationDscCompilationJob compile configuration thành MOF để node pull. Thứ tự create → import → compile là luồng chuẩn.\n\nCompile trước khi import thì account chưa có source. Import mà chưa có file .ps1 thì cmdlet không có SourcePath. Đăng ký node (Register-AzureRmAutomationDscNode) là bước gắn máy, không thay compilation của configuration.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Pool7\" + \"Azure Automation DSC\" → .ps1 + Import-AzureRmAutomationDscConfiguration + Start-AzureRmAutomationDscCompilationJob.",
    "answerText": "Create a Desired State Configuration (DSC) configuration file that has an extension of .ps1., Run the Import-AzureRmAutomationDscConfiguration Azure PowerShell cmdlet., Run the Start-AzureRmAutomationDscCompilationJob Azure PowerShell cmdlet."
  },
  "558": {
    "stem": "=== Case study description ===\n\nLitware, Inc. là ISV, một trụ sở chính và năm chi nhánh. Ứng dụng chính là retirement fund management monolithic (ASP.NET Web Forms, VB.NET, một phần C#), hơn 80 branches, source trên TFS.\n\nLitware xây investment planning applications suite: một multi-tier web application và hai ứng dụng iOS (nhân viên và khách hàng), tích hợp nhẹ với hệ thống cũ. Ứng dụng mobile phải gọi share pricing service; service hiện chỉ basic authentication over HTTPS.\n\nBạn cần cấu hình release retention policy cho investment planning applications suite.\nChọn option trong answer area.",
    "boxes": {
      "1": {
        "label": "Required secrets:",
        "answer": "Personal access token"
      },
      "2": {
        "label": "Storage location:",
        "answer": "Azure Storage with HTTPS access"
      }
    },
    "explanation": "Đáp án: Personal access token; Azure Storage with HTTPS access\n\nTheo keys và các ô answer area, đề chọn secret bắt buộc và nơi lưu cho suite (kể cả khi stem nêu release retention).\n\nPersonal access token là secret Azure DevOps dùng để pipeline hoặc service gọi API / package feed / repo mà không nhúng password user. Azure Storage with HTTPS access là nơi lưu artifact hoặc dữ liệu trung gian, bắt buộc HTTPS cho đúng ràng buộc bảo mật trên đường truyền.\n\nUsername and password của hệ thống cũ thuộc câu secrets mobile khác. Azure Key Vault là lựa chọn lưu secret doanh nghiệp nhưng không phải key của câu này. Shared Access Authorization token xuất hiện ở một số lời giải lệch keys.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Required secrets\" + \"Storage location\" → Personal access token + Azure Storage with HTTPS access.",
    "answerText": "Personal access token, Azure Storage with HTTPS access"
  },
  "559": {
    "stem": "=== Case study description ===\n\nLitware xây investment planning applications suite gồm web multi-tier và hai ứng dụng iOS. Ứng dụng mobile phải gọi share pricing service của retirement fund management system hiện tại. Cho đến khi hệ thống được upgrade, service chỉ hỗ trợ basic authentication over HTTPS.\n\nBạn cần cấu hình cloud service để lưu secrets mà mobile applications dùng khi gọi share pricing service.\nNên đưa gì vào giải pháp?",
    "boxes": {
      "1": {
        "label": "Required secrets:",
        "answer": "Username and password"
      },
      "2": {
        "label": "Storage location:",
        "answer": "Azure Key Vault"
      }
    },
    "explanation": "Đáp án: Username and password; Azure Key Vault\n\nĐề lưu credential để iOS apps gọi share pricing service, service chỉ basic authentication over HTTPS.\n\nBasic authentication cần username and password. Chưa upgrade nên không dùng certificate, managed identity hay OAuth. Azure Key Vault là nơi tập trung, mã hóa và kiểm soát truy cập secret trên Azure, đúng “cloud service to store the secrets”.\n\nPersonal access token phục vụ Azure DevOps, không phải basic auth của share pricing. Azure Storage chứa blob, không phải secret store chuẩn. Để password trong app config trái cloud secret store.\n\nKeywords phản xạ nhanh (AZ-400)\n\"basic authentication\" + \"share pricing\" + \"store the secrets\" → Username and password + Azure Key Vault.",
    "answerText": "Username and password, Azure Key Vault"
  },
  "560": {
    "stem": "=== Case study description ===\n\nLitware tách shared code của investment planning applications suite thành packages trên Azure Artifacts. Members nhóm Developers phải cài được packages. Members nhóm Team Leaders phải tạo package mới và sửa permissions của package feeds.\n\nPackage feed access levels nào nên gán cho Developers và Team Leaders? Kéo access level phù hợp vào từng group.",
    "boxes": {
      "1": {
        "label": "Developers:",
        "answer": "Reader"
      },
      "2": {
        "label": "Team Leaders:",
        "answer": "Owner"
      }
    },
    "explanation": "Đáp án: Reader; Owner\n\nĐề gán quyền Azure Artifacts feed theo least privilege cho hai group.\n\nReader được restore/install package, đủ cho Developers “must be able to install packages”. Owner được administer feed, gồm tạo package và sửa permissions, đúng việc Team Leaders.\n\nContributor push package nhưng không quản trị permission feed như Owner. Collaborator chủ yếu consume kèm một số quyền hạn hẹp, không edit feed permissions. Gán Owner cho Developers vượt “chỉ cài package”.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Developers install packages\" + \"Team Leaders edit feed permissions\" → Reader + Owner.",
    "answerText": "Reader, Owner"
  },
  "561": {
    "stem": "Bạn cần đáp ứng technical requirements về kiểm soát truy cập Azure DevOps.\nBạn nên dùng gì?",
    "options": {
      "A": "Azure Multi-Factor Authentication (MFA)",
      "B": "on-premises firewall rules",
      "C": "conditional access policies in Azure AD",
      "D": "Azure role-based access control (Azure RBAC)"
    },
    "explanation": "Đáp án: conditional access policies in Azure AD\n\nĐề kiểm soát ai, từ đâu, trên thiết bị nào được vào Azure DevOps (thường hạn chế user theo vị trí, ví dụ United Kingdom).\n\nConditional Access đánh giá user, location, device và risk rồi allow, block hoặc yêu cầu MFA trước khi vào Azure DevOps. Đó là lớp control access vào SaaS đúng technical requirement.\n\nMFA chỉ là một control, không tự lọc theo quốc gia hay điều kiện khác. On-premises firewall không chặn user Internet vào Azure DevOps cloud. Azure RBAC quản trị resource Azure, không phải cổng đăng nhập Azure DevOps.\n\nKeywords phản xạ nhanh (AZ-400)\n\"controlling access to Azure DevOps\" + location/identity → Conditional Access in Azure AD.",
    "answerText": "C"
  },
  "562": {
    "stem": "Bạn cần cấu hình Azure Pipelines để kiểm soát builds của App2.\nNên dùng authentication method nào?",
    "options": {
      "A": "Windows NTLM",
      "B": "certificate",
      "C": "SAML",
      "D": "personal access token (PAT)"
    },
    "explanation": "Đáp án: personal access token (PAT)\n\nĐề pipeline (App2 builds) phải authenticate tới Azure DevOps hoặc GitHub để queue/control build.\n\nPAT là secret scoped cho REST API, Git và pipeline, thu hồi được, không cần interactive login. Azure Pipelines và agent dùng PAT (hoặc OAuth tương đương) để gọi Azure DevOps. Đó là method chuẩn cho automation.\n\nWindows NTLM gắn domain on-prem, không phù hợp hosted pipeline. Certificate dùng cho service/app hoặc TLS, không phải cách phổ biến để user/pipeline gọi Azure DevOps. SAML phục vụ SSO người dùng, không gắn vào YAML build authentication.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Pipelines\" + \"control App2 builds\" + authentication → personal access token (PAT).",
    "answerText": "D"
  },
  "563": {
    "stem": "=== Case study description ===\n\nWoodgrove Bank là công ty tài chính, trụ sở United Kingdom. Planned changes: dùng Azure DevOps cho project tracking; source trên private GitHub repositories; Azure Pipelines cho build và release.\nIdentity: deploy Azure AD tenant woodgrovebank.com; sync Active Directory lên Azure AD; cấu hình App1 dùng Azure AD (app registration, secret, rồi gán ID và secret cho App1).\n\nBạn cần cấu hình authentication cho App1, hỗ trợ planned changes.\nBa action nào theo thứ tự đúng?",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Create an app."
      },
      "2": {
        "label": "Zone 2",
        "answer": "Add a secret."
      },
      "3": {
        "label": "Zone 3",
        "answer": "Configure the ID and secret for App1."
      }
    },
    "explanation": "Đáp án: Create an app; Add a secret; Configure the ID and secret for App1.\n\nĐề App1 phải authenticate bằng Azure AD theo planned identity changes.\n\nCreate an app (app registration) trên tenant woodgrovebank.com tạo application ID. Add a secret phát client credential. Configure the ID and secret for App1 đưa hai giá trị vào cấu hình ứng dụng để App1 xin token. Thứ tự create → secret → configure là luồng service principal trên portal.\n\nGán ID/secret trước khi tạo app thì chưa có giá trị. Tạo secret trước app registration thì không có object để gắn credential. Bỏ bước configure thì App1 chưa dùng được identity mới.\n\nKeywords phản xạ nhanh (AZ-400)\n\"App1\" + \"Azure AD\" + authentication → Create an app + Add a secret + Configure ID and secret.",
    "answerText": "Create an app., Add a secret., Configure the ID and secret for App1."
  },
  "564": {
    "stem": "Công ty xây multi-tier web application. Bạn dùng Azure DevOps và host production trên Azure virtual machines.\nTeam chuẩn bị Azure Resource Manager template của virtual machine để test feature mới.\nCần tạo staging environment trên Azure thỏa:\n• Giảm chi phí Azure hosting\n• Provision virtual machines tự động\n• Dùng custom Azure Resource Manager template để provision virtual machines\nBạn nên làm gì?",
    "options": {
      "A": "In Azure Cloud Shell, run Azure CLI commands to create and delete the new virtual machines in a staging resource group.",
      "B": "In Azure DevOps, configure new tasks in the release pipeline to deploy to Azure Cloud Services.",
      "C": "From Azure Cloud Shell, run Azure PowerShell commands to create and delete the new virtual machines in a staging resource group.",
      "D": "In Azure DevOps, configure new tasks in the release pipeline to create and delete the virtual machines in Azure DevTest Labs."
    },
    "explanation": "Đáp án: In Azure DevOps, configure new tasks in the release pipeline to create and delete the virtual machines in Azure DevTest Labs.\n\nĐề staging rẻ, tự provision/xóa, và dùng custom ARM template, gắn với Azure DevOps.\n\nAzure DevTest Labs nhận custom ARM template, auto-shutdown và policy chống resource sprawl nên giảm cost. Release pipeline tạo/xóa lab VM theo từng release, đủ “provisions automatically”. Đó là một chỗ thỏa cả ba yêu cầu.\n\nAzure CLI hoặc Azure PowerShell trong Cloud Shell tạo/xóa VM được nhưng thiếu sẵn cost policy và phải script tay, không minimize cost/admin như DevTest Labs. Azure Cloud Services (classic/PaaS) không phải chỗ deploy custom VM template, đã deprecated.\n\nKeywords phản xạ nhanh (AZ-400)\n\"minimize cost\" + \"ARM template\" + \"staging VMs\" → DevTest Labs tasks in release pipeline.",
    "answerText": "D"
  },
  "565": {
    "stem": "Bạn có Azure DevOps project chứa build pipeline. Pipeline dùng khoảng 50 open source libraries.\nCần đảm bảo mọi open source library tuân thủ licensing standards của công ty.\nNên dùng service nào?",
    "options": {
      "A": "NuGet",
      "B": "Maven",
      "C": "Black Duck",
      "D": "Helm"
    },
    "explanation": "Đáp án: Black Duck\n\nĐề quét khoảng 50 open source libraries trên build và đối chiếu license policy công ty.\n\nBlack Duck là software composition analysis (SCA): nhận diện component, license và lỗ hổng, rồi so với policy (cho phép / cấm license). Pipeline có thể fail khi license không compliant. Đó là đúng loại service.\n\nNuGet và Maven là package manager, kéo dependency chứ không enforce license policy. Helm đóng gói Kubernetes chart, không phải SCA license.\n\nKeywords phản xạ nhanh (AZ-400)\n\"open source libraries\" + \"licensing standards\" → Black Duck.",
    "answerText": "C"
  },
  "566": {
    "stem": "Bạn có ứng dụng multi-tier với front end Azure Web Apps và back end Azure SQL Database.\nBạn cần recommend giải pháp capture và store telemetry. Giải pháp phải đáp ứng:\n- Hỗ trợ ad-hoc queries để xác định baselines.\n- Trigger alerts khi metrics vượt baseline.\n- Store application metrics và database metrics ở một central location.\nBạn nên đưa gì vào recommendation?",
    "options": {
      "A": "Azure Event Hubs",
      "B": "Azure SQL Database Intelligent Insights",
      "C": "Azure Application Insights",
      "D": "Azure Log Analytics"
    },
    "answerText": "D",
    "explanation": "Đáp án: Azure Log Analytics\n\nĐề multi-tier gồm Azure Web Apps và Azure SQL Database. Cần một chỗ tập trung cho application và database metrics, query ad-hoc để tìm baseline, rồi alert khi vượt baseline.\n\nAzure Log Analytics (Azure Monitor Logs) nhận performance metrics từ PaaS như Web Apps và Azure SQL. Workspace là central store. KQL dùng cho ad-hoc analysis và xác định baseline. Alert rule gắn trên query hoặc metric khi giá trị lệch baseline.\n\nAzure Event Hubs chỉ ingest stream, không phải nơi phân tích baseline và alert sẵn. Azure SQL Database Intelligent Insights chỉ nhìn database workload so với baseline bảy ngày, không store application metrics. Azure Application Insights mạnh APM cho app, không phải central store chung cho cả database metrics như Log Analytics theo khóa đáp án.\n\nKeywords phản xạ nhanh (AZ-400)\n\"ad-hoc queries\" + \"baselines\" + \"application and database metrics\" → Azure Log Analytics."
  },
  "567": {
    "stem": "Lưu ý: Câu hỏi này thuộc một nhóm câu có cùng bối cảnh nhưng mỗi câu có kết quả riêng. Một số nhóm có nhiều giải pháp đúng, một số không có giải pháp đúng.\nSau khi trả lời, bạn không quay lại được câu này. Các câu này không xuất hiện trên màn hình review.\n\nCông ty có project trong Azure DevOps cho web application mới.\nBạn cần đảm bảo khi code được check in thì build chạy tự động.\nGiải pháp: Trên tab Triggers của build pipeline, bạn chọn Enable continuous integration.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "answerText": "A",
    "explanation": "Đáp án: Yes\n\nĐề cần build chạy tự động khi code được check in. Solution bật Enable continuous integration trên tab Triggers của build pipeline.\n\nEnable continuous integration là CI trigger chuẩn của Azure Pipelines. Pipeline theo dõi branch đã cấu hình. Khi có check-in hoặc push, một build được queue theo định nghĩa pipeline. Đây đúng mục tiêu Continuous Integration.\n\nNo sai vì setting này chính là cách Azure DevOps gắn build với check-in. Không cần scheduled trigger hay chạy tay để đạt mục tiêu này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"code is checked in\" + \"Enable continuous integration\" → Yes."
  },
  "568": {
    "stem": "Bạn đang tự động hóa build process cho ứng dụng Java bằng Azure DevOps.\nBạn cần thêm code coverage testing và publish kết quả vào pipeline.\nBạn nên dùng gì?",
    "options": {
      "A": "Cobertura",
      "B": "Bullseye Coverage",
      "C": "MSTest",
      "D": "Coverlet"
    },
    "answerText": "C",
    "explanation": "Đáp án: MSTest\n\nĐề Java-based application trên Azure DevOps. Cần code coverage testing và publish outcomes vào pipeline. Khóa đáp án chọn MSTest.\n\nTheo khóa, MSTest là công cụ được dùng trong pipeline để chạy test và publish coverage results lên Azure Pipelines. Azure DevOps đọc coverage từ test run rồi hiện trên tab Code Coverage của build.\n\nCobertura thường gắn Java coverage report, nhưng không phải lựa chọn được khóa. Bullseye Coverage dành C/C++, không khớp khóa. Coverlet dành .NET, không phải đáp án được chọn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Java-based application\" + \"code coverage\" + \"publish the outcomes\" → MSTest."
  },
  "569": {
    "stem": "Bạn cần recommend giải pháp tạo báo cáo hàng ngày chứa thông tin exceptions thu thập từ web application. Giải pháp phải gửi báo cáo vào một Microsoft Teams channel.\nBạn nên đưa những gì vào recommendation? (Chọn hai.)",
    "options": {
      "A": "Azure Logic Apps and",
      "B": "Azure Pipelines",
      "C": "Microsoft Visual Studio App Center",
      "D": "Azure DevOps Project",
      "E": ".Azure Application Insights"
    },
    "answerText": "A, E",
    "explanation": "Đáp án: Azure Logic Apps; Azure Application Insights\n\nĐề cần daily summary về exceptions của web application và gửi vào Microsoft Teams channel.\n\nAzure Application Insights là APM: thu exceptions, performance và usage, rồi cho query khoảng 24 giờ gần nhất. Azure Logic Apps là workflow: recurrence hàng ngày, query Application Insights, format summary, post vào Teams. Một bên là nguồn dữ liệu exception, một bên là automation gửi báo cáo.\n\nAzure Pipelines làm CI/CD, không phải daily exception report sang Teams. Microsoft Visual Studio App Center nghiêng crash mobile, không phải cặp chuẩn cho web exceptions cộng Teams. Azure DevOps Project chỉ khung project, không monitor exceptions hay post Teams.\n\nKeywords phản xạ nhanh (AZ-400)\n\"daily\" + \"exceptions\" + \"Microsoft Teams\" → Azure Logic Apps + Azure Application Insights."
  },
  "570": {
    "stem": "Để giải quyết current technical issue, bạn phải làm gì với lệnh Register-AzureRmAutomationDscNode?",
    "options": {
      "A": "Change the value of the ConfigurationMode parameter",
      "B": "Replace the Register-AzureRmAutomationDscNode cmdlet with RegisterAzureRmAutomationScheduledRunbook",
      "C": "Add the AllowModuleOverwrite parameter",
      "D": "Add the DefaultProfile parameter"
    },
    "answerText": "A",
    "explanation": "Đáp án: Change the value of the ConfigurationMode parameter\n\nĐề current technical issue trên node đăng ký bằng Register-AzureRmAutomationDscNode. Test servers đúng lúc deploy nhưng bị configuration drift; Azure Automation State Configuration không tự sửa.\n\nConfigurationMode quyết định DSC xử lý drift thế nào. ApplyOnly chỉ apply một lần. ApplyAndMonitor chỉ ghi nhận lệch. ApplyAndAutoCorrect apply rồi tự kéo node về desired state. Đổi ConfigurationMode (thường sang ApplyAndAutoCorrect) để State Configuration sửa drift, đúng technical issue.\n\nRegister-AzureRmAutomationScheduledRunbook dùng để schedule runbook, không đăng ký DSC node. AllowModuleOverwrite liên quan ghi đè module, không đổi cách LCM xử lý drift. DefaultProfile chỉ chọn Azure context/profile, không sửa configuration mode.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Register-AzureRmAutomationDscNode\" + \"configuration drift\" → Change ConfigurationMode (ApplyAndAutoCorrect)."
  },
  "571": {
    "stem": "=== Case study description ===\n\nLitware, Inc. là ISV, có trụ sở chính và năm chi nhánh. Ứng dụng chính là hệ thống quản lý quỹ hưu trí monolithic (ASP.NET Web Forms, một phần C#), nhiều hơn 80 code branches. Source nằm trên Team Foundation Server; chi nhánh dùng TFS proxy. Merge lâu, bug khó tìm, chi phí ownership tăng.\n\nLitware sẽ làm investment planning applications suite: một multi-tier web application và hai iOS mobile applications (nhân viên và khách hàng). Shared code tách thành packages. Dùng cloud khi phù hợp. Cần chủ động phát hiện failures.\n\nTechnical requirements gồm giảm incoming firewall connections, Developers cài packages, least privilege, branching cho new functionality in isolation, Team leaders tạo packages và sửa permission của feeds, Visual Studio App Center tập trung reporting mobile crashes và device types, không deploy tiếp giữa các stage nếu còn active bugs, mobile gọi share pricing service (basic authentication). Test servers dùng Azure Automation State Configuration; OS config đổi hàng tuần. Hiện node được cấu hình đúng lúc tạo nhưng drift theo thời gian và State Configuration không tự sửa.\n\nBạn hoàn thành code khởi tạo App Center trong mobile application thế nào? Chọn các lựa chọn phù hợp trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "boxes": {
      "1": {
        "answer": "[MSAnalytics.self"
      },
      "2": {
        "answer": "MSCrashes.self]"
      }
    },
    "answerText": "[MSAnalytics.self, MSCrashes.self]",
    "explanation": "Đáp án: [MSAnalytics.self; MSCrashes.self]\n\nĐề Litware: Visual Studio App Center phải centralize reporting của mobile application crashes và device types. Cần hoàn thành MSAppCenter.start trong AppDelegate.\n\nSDK App Center không bật service mặc định. Phải opt-in từng service khi start. MSAnalytics.self gửi telemetry gồm device types và usage. MSCrashes.self báo crash. Cặp này khớp requirement.\n\nMSDistribute.self dùng distribute build, không phải crash hay device reporting. MSPush.self dùng push notification, không đáp ứng App Center reporting trong đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"App Center\" + \"crashes\" + \"device types\" → MSAnalytics.self + MSCrashes.self."
  },
  "572": {
    "stem": "Bạn đã thêm các virtual machines làm managed nodes trong Azure Automation State Configuration.\nBạn cần cấu hình các máy trong Group7.\nBạn nên làm gì?",
    "options": {
      "A": "Modify the RefreshMode property of the Local Configuration Manager (LCM)",
      "B": "Run the Register-AzureRmAutomationDscNode Azure Powershell cmdlet.",
      "C": "Modify the ConfigurationMode property of the Local Configuration Manager (LCM",
      "D": "Install PowerShell Core."
    },
    "answerText": "B",
    "explanation": "Đáp án: Run the Register-AzureRmAutomationDscNode Azure Powershell cmdlet.\n\nĐề đã định hướng thêm VM vào Azure Automation State Configuration và cần cấu hình máy Group7. Bước then chốt là đăng ký máy như DSC node của Automation account.\n\nRegister-AzureRmAutomationDscNode gắn VM (Azure hoặc on-premises) với Azure Automation DSC. Sau khi register, node nhận configuration, pull/push theo LCM, và được quản lý như managed node. Đây là cmdlet đúng để onboard Group7.\n\nRefreshMode của LCM (Push/Pull) chỉnh sau khi node đã register, không thay bước đăng ký. ConfigurationMode xử lý drift trên node đã join, không phải việc đầu để đưa Group7 vào State Configuration. PowerShell Core không phải yêu cầu để register Azure Automation DSC node trên Windows Server điển hình của đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"managed nodes\" + \"Group7\" + Azure Automation State Configuration → Register-AzureRmAutomationDscNode."
  },
  "573": {
    "stem": "Bạn cần cấu hình Azure Automation cho các máy trong Group7.\nBa hành động nào bạn phải thực hiện theo thứ tự? Kéo các actions phù hợp vào answer area và sắp xếp đúng thứ tự.",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Create a Desired State Configuration (DSC) configuration file that has an extension of .ps1."
      },
      "2": {
        "label": "Zone 2",
        "answer": "Run the Import-Azure RmAutomation DscConfiguration Azure PowerShell cmdlet."
      },
      "3": {
        "label": "Zone 3",
        "answer": "Run the Start-AzureRmAutomationDscCompilationJob Azure PowerShell cmdlet."
      }
    },
    "answerText": "Create a Desired State Configuration (DSC) configuration file that has an extension of .ps1., Run the Import-Azure RmAutomation DscConfiguration Azure PowerShell cmdlet., Run the Start-AzureRmAutomationDscCompilationJob Azure PowerShell cmdlet.",
    "explanation": "Đáp án: Create a Desired State Configuration (DSC) configuration file that has an extension of .ps1.; Run the Import-Azure RmAutomation DscConfiguration Azure PowerShell cmdlet.; Run the Start-AzureRmAutomationDscCompilationJob Azure PowerShell cmdlet.\n\nĐề cấu hình Azure Automation cho máy Group7. Cần đưa DSC configuration vào Automation rồi compile trước khi gán node.\n\nTrước hết viết configuration bằng PowerShell DSC, file .ps1. Tiếp theo Import-AzureRmAutomationDscConfiguration nhập script đó vào Automation account. Cuối cùng Start-AzureRmAutomationDscCompilationJob compile configuration thành MOF để node áp dụng.\n\nKhông compile trước khi import vì job chạy trên configuration đã có trong account. Không đảo import và tạo file vì cmdlet cần SourcePath tới .ps1. Register node là bước onboard máy, không nằm trong chuỗi ba bước được khóa.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Automation\" + \"DSC\" + Group7 sequence → .ps1 + Import-AzureRmAutomationDscConfiguration + Start-AzureRmAutomationDscCompilationJob."
  },
  "574": {
    "stem": "=== Case study description ===\n\nContoso, Ltd. là công ty sản xuất ở Chicago. Contoso triển khai Azure DevOps trên Azure subscription. Organization có Docker extension và deployment pool Pool7 (10 Azure VM Windows Server 2016), cùng Azure Automation account. Các project Planned Changes gồm Project5: Git repository chứa source của web application, trong đó có folder folder1. Thay đổi trong folder1 không được trigger build; mọi thay đổi khác phải trigger build.\n\nBạn cấu hình filters cho trigger của Project5 thế nào? Chọn các lựa chọn phù hợp trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "boxes": {
      "1": {
        "answer": "path filter to exclude"
      },
      "2": {
        "answer": "path filter to include"
      }
    },
    "answerText": "path filter to exclude, path filter to include",
    "explanation": "Đáp án: path filter to exclude; path filter to include\n\nĐề Project5: CI trigger phải bỏ qua thay đổi trong folder1 và vẫn build khi có thay đổi path khác. Branch filter chỉ nhận tên branch (master, branch1), không mô tả path như /folder1 hay /.\n\nPath filter to exclude loại /folder1 nên commit chỉ đụng folder đó không queue build. Path filter to include với / (hoặc toàn bộ repo) để mọi path còn lại vẫn kích hoạt pipeline. Hai filter đi cùng nhau mới đúng planned change.\n\nChỉ exclude thì chưa nói rõ phần còn lại có vào CI không theo khóa. Chỉ include một folder khác sẽ bỏ sót file ngoài folder1. Branch filter không thay path filter cho /folder1.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Project5\" + \"folder1\" + trigger → path filter to exclude + path filter to include."
  },
  "575": {
    "stem": "=== Case study description ===\n\nContoso, Ltd. là công ty sản xuất, trụ sở Chicago. Contoso cải thiện IT development và operations bằng Azure DevOps. Contoso có Azure subscription và Azure DevOps organization gồm Docker extension và deployment pool Pool7 chứa 10 Azure virtual machines chạy Windows Server 2016. Subscription có Azure Automation account.\n\nContoso sẽ tạo các project theo planned changes. Technical requirements: implement build agents cho Project1; ưu tiên Azure resources; tránh deprecated technologies; code flow cho Project2 để Team 2 gửi pull requests và làm việc độc lập trên bản sao Project2, mọi thay đổi trung gian vẫn chịu cùng restriction như build policy của Project2; tự động hóa và giảm administrative effort; implement Project3, Project5, Project6 và Project7; Project4 push Docker images lên Azure Container Registry.\n\nBạn dùng Git repository trong Azure Repos cho source của web application. Developers đang commit thẳng vào master.\nBạn cần change management theo các yêu cầu sau:\n- Master phải được bảo vệ; thay đổi mới phải được build trên feature branches trước.\n- Thay đổi phải được review và approve bởi ít nhất một release manager trước mỗi merge.\n- Thay đổi vào master phải đi qua pull requests.\nBạn nên cấu hình gì trong Azure Repos?",
    "options": {
      "A": "branch policies of the master branch",
      "B": "Services in Project Settings",
      "C": "Deployment pools in Project Settings",
      "D": "branch security of the master branch"
    },
    "answerText": "A",
    "explanation": "Đáp án: branch policies of the master branch\n\nĐề bảo vệ master, bắt build trên feature branches, bắt pull request, và yêu cầu ít nhất một release manager approve trước khi merge.\n\nBranch policies trên master khóa direct push, bắt PR, bắt build validation trên source branch, và bắt minimum number of reviewers. Gán release manager làm required reviewer thì đủ ba yêu cầu trong một chỗ.\n\nServices trong Project Settings là service hooks/integration, không enforce PR hay reviewer. Deployment pools phục vụ deploy lên máy, không phải change management trên Git. Branch security quyết định ai được contribute hay bypass, không tự tạo required review và build trên feature branch như policy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"protect master\" + \"pull requests\" + \"release manager\" → branch policies of the master branch."
  },
  "576": {
    "stem": "Bạn có Azure DevOps organization Contoso ở free tier. Contoso có 10 private projects. Mỗi project có nhiều jobs không phụ thuộc nhau.\nBạn thường chạy jobs trên năm self-hosted agents nhưng gặp build lâu và builds bị queue thường xuyên.\nBạn cần giảm số queued builds và thời gian chạy builds.\nBạn nên làm gì?",
    "options": {
      "A": "Configure the pipelines to use the Microsoft-hosted agents.",
      "B": "Register additional self-hosted agents.",
      "C": "Purchase self-hosted parallel jobs.",
      "D": "Purchase Microsoft-hosted parallel jobs"
    },
    "answerText": "C",
    "explanation": "Đáp án: Purchase self-hosted parallel jobs.\n\nĐề free tier, 10 private projects, năm self-hosted agents, jobs độc lập nhưng queue dài. Cần giảm queued builds và thời gian chạy.\n\nFree tier giới hạn parallel jobs, kể cả self-hosted. Agent rảnh vẫn phải chờ một parallel job trống. Mua self-hosted parallel jobs tăng số job chạy đồng thời trên đúng hạ tầng agent sẵn có, giảm queue và wall-clock time.\n\nChuyển Microsoft-hosted agents trên private projects vẫn cần parallel jobs trả phí; free grant cho private rất thấp nên không giải quyết. Thêm self-hosted agents khi chưa mua parallel jobs chỉ tạo thêm agent idle. Mua Microsoft-hosted parallel jobs tăng concurrency nhưng bỏ phí hạ tầng đã có, không tối ưu như mua self-hosted parallel jobs.\n\nKeywords phản xạ nhanh (AZ-400)\n\"free tier\" + \"self-hosted agents\" + \"queued builds\" → Purchase self-hosted parallel jobs."
  },
  "577": {
    "stem": "Bạn có Azure DevOps organization Contoso ở free tier. Contoso có 10 private projects. Mỗi project có nhiều jobs không phụ thuộc nhau. Bạn thường chạy jobs trên năm self-hosted agents nhưng gặp build lâu và builds bị queue thường xuyên. Bạn cần giảm số queued builds và thời gian chạy builds. Bạn nên làm gì?",
    "options": {
      "A": "Configure the pipelines to use the Microsoft-hosted agents.",
      "B": "Register additional self-hosted agents.",
      "C": "Purchase self-hosted parallel jobs.",
      "D": "Purchase Microsoft-hosted parallel jobs."
    },
    "answerText": "C",
    "explanation": "Đáp án: Purchase self-hosted parallel jobs.\n\nĐề trùng kịch bản free tier Contoso: nhiều private jobs trên năm self-hosted agents, queue nhiều. Cần giảm queue và thời gian build.\n\nParallel jobs quyết định bao nhiêu build chạy cùng lúc. Free tier siết concurrent jobs. Mua self-hosted parallel jobs cho phép nhiều job chạy song song trên các agent hiện có, đúng bottleneck.\n\nMicrosoft-hosted agents cho private project không miễn phí đủ để hết queue. Đăng ký thêm self-hosted agents không tăng slot parallel. Microsoft-hosted parallel jobs có thêm chi phí compute hosted, kém tối ưu khi đã có năm self-hosted agents.\n\nKeywords phản xạ nhanh (AZ-400)\n\"private projects\" + \"self-hosted agents\" + \"queued builds\" → Purchase self-hosted parallel jobs."
  },
  "578": {
    "stem": "Bạn có Microsoft ASP.NET Core web app trên Azure, được truy cập toàn cầu.\nBạn cần chạy URL ping test mỗi năm phút và tạo alert khi web app không available từ các Azure regions cụ thể. Giải pháp phải giảm development time.\nBạn nên làm gì?",
    "options": {
      "A": "Create an Azure Monitor Availability metric and alert",
      "B": "Create an Azure Application Insights availability test and alert.",
      "C": "Write an Azure function and deploy the function to the specific regions.",
      "D": ".Create an Azure Service Health alert for the specific regions."
    },
    "answerText": "B",
    "explanation": "Đáp án: Create an Azure Application Insights availability test and alert.\n\nĐề ASP.NET Core app toàn cầu. Cần URL ping mỗi năm phút từ Azure regions chỉ định, alert khi unavailable, và ít dev time.\n\nApplication Insights availability tests (URL ping / standard test) chạy theo lịch từ nhiều locations, đo HTTP thành công, rồi gắn alert. Không viết probe riêng. Đúng tần suất, đúng region, đúng minimize development time.\n\nAzure Monitor Availability metric không phải URL ping đa region sẵn cho app tùy ý; phải custom metric thì tốn effort. Azure Function tự ping rồi alert là tự viết, deploy nhiều region, trái minimize development time. Azure Service Health báo sự cố hạ tầng Azure, không ping URL app của bạn từ region chỉ định.\n\nKeywords phản xạ nhanh (AZ-400)\n\"URL ping\" + \"every five minutes\" + \"specific Azure regions\" → Application Insights availability test and alert."
  },
  "579": {
    "stem": "=== Case study description ===\n\nTổ chức đang dùng Trello để theo dõi work, Bamboo cho CI/CD, và Bitbucket làm Git repository. Planned changes yêu cầu thay các DevOps tools hiện tại bằng dịch vụ Azure / GitHub tương đương, vẫn giữ board, pipeline và source control.\n\nBạn cần thay existing DevOps tools để hỗ trợ planned changes.\nBạn nên dùng gì? Kéo tool phù hợp tới từng target. Mỗi tool có thể dùng một lần, nhiều lần, hoặc không dùng.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "boxes": {
      "1": {
        "label": "Trello:",
        "answer": "Azure Boards"
      },
      "2": {
        "label": "Bamboo:",
        "answer": "Azure Pipelines"
      },
      "3": {
        "label": "BitBucket:",
        "answer": "GitHub repositories"
      }
    },
    "answerText": "Azure Boards, Azure Pipelines, GitHub repositories",
    "explanation": "Đáp án: Azure Boards; Azure Pipelines; GitHub repositories\n\nĐề map Trello, Bamboo và Bitbucket sang stack mới.\n\nTrello là Kanban/work tracking nên thay bằng Azure Boards (backlogs, boards, dashboards). Bamboo là CI/CD nên thay bằng Azure Pipelines (build, test, deploy). Bitbucket là Git hosting nên thay bằng GitHub repositories theo khóa, vẫn là distributed Git cho source.\n\nKhông để Trello map sang Pipelines vì board không phải CI. Không để Bamboo map sang Boards vì Bamboo không quản lý work items. Không giữ Bitbucket nếu planned change đòi repository trên GitHub.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Trello\" + \"Bamboo\" + \"Bitbucket\" → Azure Boards + Azure Pipelines + GitHub repositories."
  },
  "580": {
    "stem": "Bạn cần merge nhánh POC vào default branch. Giải pháp phải đáp ứng technical requirements. Bạn nên chạy lệnh nào?",
    "options": {
      "A": "git rebase",
      "B": "git merge --squash",
      "C": "git push",
      "D": "git merge --allow-unrelated-histories"
    },
    "answerText": "A",
    "explanation": "Đáp án: git rebase\n\nĐề đưa commits từ POC vào default branch và khớp technical requirements (thường là lịch sử tuyến tính, phát triển tính năng tách biệt rồi integrate sạch).\n\ngit rebase đặt các commit POC lên tip của default. History sau rebase là linear, dễ đọc, merge về default thường fast-forward. Đây là lệnh được khóa cho yêu cầu đó.\n\ngit merge --squash gộp hết thành một commit, mất từng commit trên POC. git push chỉ đẩy remote, không merge hai nhánh. git merge --allow-unrelated-histories dành hai history không chung ancestor, không phải trường hợp POC/default thông thường và làm history rối hơn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"merge the POC branch\" + \"default branch\" + technical requirements → git rebase."
  },
  "581": {
    "stem": "Bạn cần thực hiện GitHub code migration. Giải pháp phải hỗ trợ planned changes cho DevOps environment. Bạn nên dùng gì?",
    "options": {
      "A": "git clone",
      "B": "GitHub Importer",
      "C": "Import repository in Azure Repos",
      "D": "git-tfs"
    },
    "answerText": "B",
    "explanation": "Đáp án: GitHub Importer\n\nĐề migrate code liên quan GitHub và phải phục vụ planned changes của DevOps environment. Khóa chọn GitHub Importer.\n\nGitHub Importer chuyển repository (history, branches, tags) theo luồng import gắn GitHub. Tool này được khóa là cách migration chính thức cho kịch bản, giữ lịch sử để pipeline và work tracking mới bám được repo.\n\ngit clone chỉ copy working copy, chưa hoàn thành migration có kiểm soát vào môi trường DevOps mới. Import repository in Azure Repos là import generic; không phải đáp án được chọn. git-tfs dành TFVC sang Git, không migrate từ GitHub.\n\nKeywords phản xạ nhanh (AZ-400)\n\"GitHub code migration\" + \"DevOps environment\" → GitHub Importer."
  },
  "582": {
    "stem": "=== Case study description ===\n\nContoso triển khai Azure DevOps. Project5 dùng Git repository cho web application, có folder folder1. CI trigger: thay đổi trong folder1 không chạy build; mọi path khác phải chạy build.\n\nBạn cấu hình filters cho trigger của Project5 thế nào? Chọn các lựa chọn phù hợp trong answer area.",
    "boxes": {
      "1": {
        "label": "Set a [dropdown] /folder1.",
        "answer": "path filter to exclude"
      },
      "2": {
        "label": "Set a [dropdown] /.",
        "answer": "path filter to include"
      }
    },
    "answerText": "path filter to exclude, path filter to include",
    "explanation": "Đáp án: path filter to exclude; path filter to include\n\nĐề hoàn thành trigger: Set a … /folder1 và Set a … /.\n\nPath filter to exclude áp cho /folder1 để commit chỉ trong folder đó không queue build. Path filter to include áp cho / để phần còn lại của repo vẫn trigger CI. Branch filter không nhận path dạng /folder1.\n\nExclude / sẽ chặn cả repo, sai. Include /folder1 sẽ chỉ build khi đụng folder1, ngược requirement. Thiếu một trong hai filter thì không vừa loại trừ folder1 vừa nhận mọi path khác.\n\nKeywords phản xạ nhanh (AZ-400)\n\"/folder1\" + \"/.\" + Project5 trigger → exclude folder1 + include /."
  },
  "583": {
    "stem": "=== Case study description ===\n\nContoso, Ltd. là công ty sản xuất ở Chicago. Contoso áp dụng Azure DevOps trên Azure subscription. Organization có Docker extension và deployment pool Pool7 (10 Azure VM Windows Server 2016). Subscription có Azure Automation account.\n\nPlanned changes tạo nhiều project. Technical requirements: build agents cho Project1; ưu tiên Azure resources; tránh deprecated technologies; code flow Project2 cho Team 2 (pull requests, làm việc trên bản sao, cùng restriction với build policy); tự động hóa; implement Project3, Project5, Project6, Project7; Project4 đẩy Docker images lên Azure Container Registry. Project3 gắn phân tích chất lượng mã với SonarQube.\n\nTrong Azure DevOps bạn tạo Project3. Bạn cần đáp ứng requirements của project. Việc đầu tiên bạn nên làm là gì?",
    "options": {
      "A": "From Azure DevOps, modify the build definition.",
      "B": "From SonarQube, obtain an authentication token.",
      "C": "From Azure DevOps, create a service endpoint.",
      "D": "From SonarQube, create a project."
    },
    "answerText": "B",
    "explanation": "Đáp án: From SonarQube, obtain an authentication token.\n\nĐề Project3 cần tích hợp SonarQube. Hỏi việc làm first.\n\nService connection và task phân tích cần credential. Authentication token lấy từ SonarQube là secret để Azure DevOps gọi server. Không có token thì chưa tạo được service endpoint dùng được, chưa chạy analysis trong build.\n\nModify build definition là bước sau, khi đã có connection. Create a service endpoint cần token (hoặc tương đương) trước. Create a project trên SonarQube hữu ích nhưng không phải first step theo khóa; token mới là điều kiện tiên quyết cho automation.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Project3\" + \"SonarQube\" + first → obtain an authentication token."
  },
  "584": {
    "stem": "Bạn cần implement Project4. Việc đầu tiên bạn nên làm là gì?",
    "options": {
      "A": "Add the FROM instruction in the Dockerfile file.",
      "B": "Add a Copy and Publish Build Artifacts task to the build pipeline.",
      "C": "Add a Docker task to the build pipeline.",
      "D": "Add the MAINTAINER instruction in the Dockerfile file."
    },
    "answerText": "C",
    "explanation": "Đáp án: Add a Docker task to the build pipeline.\n\nĐề Project4 phải push Docker images lên Azure Container Registry. Hỏi first step.\n\nDocker task trên Azure Pipelines build image, tag và push ACR. Đây là cầu nối pipeline với Docker engine và registry. Không có task này thì Dockerfile hay artifact task không đẩy image theo planned change.\n\nFROM trong Dockerfile là nội dung image, cần nhưng không phải bước pipeline đầu theo khóa. Copy and Publish Build Artifacts xuất file build, không push container image. MAINTAINER là metadata cũ, không implement Project4.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Project4\" + \"Docker images\" + ACR + first → Add a Docker task to the build pipeline."
  },
  "585": {
    "stem": "=== Case study description ===\n\nContoso có Azure DevOps organization và Azure subscription. Technical requirements: implement build agents cho Project1; ưu tiên Azure resources; giảm administrative effort. Organization đã có hạ tầng Azure virtual machines.\n\nBạn cần recommend quy trình implement build agent cho Project1.\nBa hành động nào nên thực hiện theo thứ tự? Kéo các actions phù hợp vào answer area.",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Sign in to Azure DevOps by using an account that is assigned the agent pool administrator role."
      },
      "2": {
        "label": "Zone 2",
        "answer": "Create a personal access token in the Azure DevOps organization of Contoso."
      },
      "3": {
        "label": "Zone 3",
        "answer": "Install and register the Azure Pipelines agent on an Azure virtual machine."
      }
    },
    "answerText": "Sign in to Azure DevOps by using an account that is assigned the agent pool administrator role., Create a personal access token in the Azure DevOps organization of Contoso., Install and register the Azure Pipelines agent on an Azure virtual machine.",
    "explanation": "Đáp án: Sign in to Azure DevOps by using an account that is assigned the agent pool administrator role.; Create a personal access token in the Azure DevOps organization of Contoso.; Install and register the Azure Pipelines agent on an Azure virtual machine.\n\nĐề Project1 cần build agents, ưu tiên Azure resources. Self-hosted agent trên Azure VM khớp requirement.\n\nĐăng nhập bằng tài khoản Agent pool Administrator để tạo/quản lý pool và lấy quyền register. Tạo PAT (scope Agent Pools) để agent authenticate lúc config. Cài và register Azure Pipelines agent trên Azure VM để job Project1 chạy trên Azure, không phụ thuộc Microsoft-hosted nếu đề muốn control agent.\n\nKhông cài agent trước khi có PAT vì config agent cần token. Không dùng tài khoản thiếu agent pool admin vì không quản lý pool. Không chọn máy on-prem nếu planned change ưu tiên Azure VM.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Project1\" + \"build agent\" + Azure VM → Agent pool admin + PAT + install and register agent."
  },
  "586": {
    "stem": "=== Case study description ===\n\nContoso planned changes cho Project6: trong release, deployments không được đi tiếp giữa các stage nếu còn active bugs gắn với release. Cần gate tự động trên release pipeline.\n\nBạn cần implement Project6.\nBa hành động nào bạn phải thực hiện theo thứ tự? Kéo các actions vào answer area và sắp xếp đúng thứ tự.",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Open the release pipeline editor."
      },
      "2": {
        "label": "Zone 2",
        "answer": "Enable Gates."
      },
      "3": {
        "label": "Zone 3",
        "answer": "Add Query Work Items."
      }
    },
    "answerText": "Open the release pipeline editor., Enable Gates., Add Query Work Items.",
    "explanation": "Đáp án: Open the release pipeline editor.; Enable Gates.; Add Query Work Items.\n\nĐề Project6 chặn deploy khi còn active bugs. Cách chuẩn trên classic release là pre-deployment gate Query Work Items.\n\nMở release pipeline editor để sửa definition. Bật Gates trên stage (thường Production). Add Query Work Items và trỏ query các bug Active của release. Gate fail thì stage không deploy.\n\nKhông add Query Work Items trước khi Enable Gates vì UI gate chưa mở. Không bắt đầu bằng approval thủ công nếu planned change muốn automation. Trigger chỉ khởi chạy release, không đánh giá work items.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Project6\" + \"active bugs\" + release → Open editor + Enable Gates + Query Work Items."
  },
  "587": {
    "stem": "=== Case study description ===\n\nContoso, Ltd. là công ty sản xuất ở Chicago. Contoso dùng Azure DevOps và Azure Automation. Organization có Docker extension và deployment pool Pool7 (10 Azure VM Windows Server 2016).\n\nPlanned changes và technical requirements gồm build agents Project1, Azure resources, code flow Project2, implement Project3–Project7, Project4 push image lên Azure Container Registry. Current technical issue: test servers đúng lúc deploy nhưng configuration drift theo thời gian; Azure Automation State Configuration không tự sửa. Nodes đăng ký bằng Register-AzureRmAutomationDscNode.\n\nĐể giải quyết current technical issue, bạn phải làm gì với lệnh Register-AzureRmAutomationDscNode?",
    "options": {
      "A": "Change the value of the ConfigurationMode parameter.",
      "B": "Replace the Register-AzureRmAutomationDscNode cmdlet with Register- AzureRmAutomationScheduledRunbook",
      "C": "Add the AllowModuleOverwrite parameter.",
      "D": "Add the DefaultProfile parameter."
    },
    "answerText": "A",
    "explanation": "Đáp án: Change the value of the ConfigurationMode parameter.\n\nĐề State Configuration không sửa drift trên node đã register. Hỏi chỉnh lệnh Register-AzureRmAutomationDscNode.\n\nConfigurationMode là tham số quyết định LCM chỉ apply, monitor, hay autocorrect. Đổi sang ApplyAndAutoCorrect thì node định kỳ kiểm tra và tự remediate, khớp current technical issue.\n\nRegister-AzureRmAutomationScheduledRunbook schedule runbook, không quản lý DSC node. AllowModuleOverwrite xử lý conflict module, không bật autocorrect. DefaultProfile chọn context đăng nhập Azure, không đổi cách áp configuration.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Register-AzureRmAutomationDscNode\" + \"fails to correct\" → Change ConfigurationMode."
  },
  "588": {
    "stem": "Bạn nên recommend branching strategy nào cho investment planning applications suite?",
    "options": {
      "A": "release isolation",
      "B": "main only",
      "C": "development isolation",
      "D": "feature isolation"
    },
    "answerText": "D",
    "explanation": "Đáp án: feature isolation\n\nĐề Litware/investment planning: technical requirement là branching strategy hỗ trợ developing new functionality in isolation, nhiều team, giảm merge rủi ro trên monolithic legacy.\n\nFeature isolation (feature branches) để mỗi tính năng sống trên nhánh riêng, build và test tách, rồi merge qua pull request. Khớp isolation, code review và hướng agile của suite mới.\n\nRelease isolation dành nhánh theo release/hotfix, không tối ưu cho phát triển feature song song. Main only (mọi người commit thẳng main) không isolation. Development isolation không phải chiến lược chuẩn được khóa; không mô tả feature-level isolation như đề.\n\nKeywords phản xạ nhanh (AZ-400)\n\"new functionality in isolation\" + investment planning suite → feature isolation."
  },
  "589": {
    "stem": "Bạn nên dùng gì để implement code quality restriction trên release pipeline của investment planning applications suite?",
    "options": {
      "A": "a pre-deployment approval",
      "B": "a deployment gate",
      "C": "a post-deployment approval",
      "D": "a trigger"
    },
    "answerText": "B",
    "explanation": "Đáp án: a deployment gate\n\nĐề code quality (và thường là không còn active bugs) phải chặn release giữa các stage, tự động.\n\nDeployment gate đánh giá điều kiện trước khi stage chạy: Query Work Items, Azure Monitor, Azure Function, REST. Không đạt threshold thì deploy dừng. Đây là primitive đúng cho quality restriction trên release pipeline.\n\nPre-deployment approval là người bấm Approve, không tự đo quality. Post-deployment approval xảy ra sau khi đã deploy, không ngăn mã kém vào môi trường. Trigger chỉ start pipeline, không enforce policy giữa các stage.\n\nKeywords phản xạ nhanh (AZ-400)\n\"code quality restriction\" + \"release pipeline\" → deployment gate."
  },
  "590": {
    "stem": "=== Case study description ===\n\nInvestment planning applications suite của Litware: mặc định mọi releases phải còn available 30 ngày; production releases phải giữ 60 ngày.\n\nBạn cấu hình release retention policy cho suite thế nào? Chọn các lựa chọn phù hợp trong answer area.",
    "boxes": {
      "1": {
        "label": "Global release:",
        "answer": "Set the default retention policy to 30 days."
      },
      "2": {
        "label": "Production stage:",
        "answer": "Set the stage retention policy to 60 days."
      }
    },
    "answerText": "Set the default retention policy to 30 days., Set the stage retention policy to 60 days.",
    "explanation": "Đáp án: Set the default retention policy to 30 days.; Set the stage retention policy to 60 days.\n\nĐề mặc định giữ release 30 ngày, riêng production 60 ngày.\n\nDefault (global) retention 30 ngày áp cho mọi release chưa bị stage override. Stage retention trên Production 60 ngày giữ bản đã deploy production lâu hơn. Hai mức này tách đúng scenario.\n\nĐặt default 60 ngày làm mọi môi trường giữ quá lâu, trái “by default 30 days”. Đặt Production 30 ngày thiếu yêu cầu 60. Build retention khác release retention, không trả lời ô Global release / Production stage.\n\nKeywords phản xạ nhanh (AZ-400)\n\"releases 30 days\" + \"production 60 days\" → default 30 + stage retention 60."
  },
  "591": {
    "stem": "=== Case study description ===\n\nLitware investment planning applications suite gồm một multi-tier web application và hai iOS mobile applications (nhân viên và khách hàng). Cần chọn nơi chạy build agent và release agent theo planned changes / technical requirements.\n\nBuild và release agents của suite nên chạy ở đâu? Chọn các lựa chọn phù hợp trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "boxes": {
      "1": {
        "label": "Build agent:",
        "answer": "A source control system"
      },
      "2": {
        "label": "Release agent:",
        "answer": "A hosted service"
      }
    },
    "answerText": "A source control system, A hosted service",
    "explanation": "Đáp án: A source control system; A hosted service\n\nĐề hỏi nơi build agent và release agent của investment planning suite chạy. Khóa đáp án lần lượt là A source control system và A hosted service.\n\nTheo khóa, build agent gắn với source control system nơi pipeline lấy code và chạy build. Release agent chạy trên hosted service để deploy web và iOS mà không tự vận hành farm agent riêng, khớp hướng dùng cloud khi phù hợp.\n\nSelf-hosted only cho cả hai ô không khớp khóa. Đảo hai giá trị sai vì build được khóa là source control system, release là hosted service. On-premises agent pool không được chọn cho release theo đáp án.\n\nKeywords phản xạ nhanh (AZ-400)\n\"build agent\" + \"release agent\" + investment planning suite → A source control system + A hosted service."
  },
  "592": {
    "stem": "Bạn đang cấu hình Azure DevOps dashboard. Giải pháp phải đáp ứng technical requirements.\nWidget nào bạn nên dùng cho từng metric? Kéo widget phù hợp tới từng metric. Mỗi widget có thể dùng một lần, nhiều lần, hoặc không dùng.",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Velocity"
      },
      "2": {
        "label": "Zone 2",
        "answer": "Release pipeline overview"
      },
      "3": {
        "label": "Zone 3",
        "answer": "Query tile"
      }
    },
    "answerText": "Velocity, Release pipeline overview, Query tile",
    "explanation": "Đáp án: Velocity; Release pipeline overview; Query tile\n\nĐề gán widget dashboard theo technical requirements (thường là throughput team, trạng thái release/environment, và số work items theo query).\n\nVelocity cho thấy team delivered so với plan qua các iteration. Release pipeline overview hiện status các environments trong release definition. Query tile hiện tổng số kết quả của một work item query (ví dụ bugs Active).\n\nCycle time đo lead time một item, không phải widget được khóa cho ô 1. Deployment widget khác không thay Release pipeline overview theo khóa. Chart tùy ý không thay Query tile khi cần một con số từ query.\n\nKeywords phản xạ nhanh (AZ-400)\n\"dashboard\" + team throughput + release status + work item count → Velocity + Release pipeline overview + Query tile."
  },
  "593": {
    "stem": "Bạn định deploy một database environment mới. Giải pháp phải đáp ứng technical requirements. Bạn cần chuẩn bị database cho deployment. Bạn nên format export thế nào?",
    "options": {
      "A": "NDF",
      "B": "BACPAC",
      "C": "DACPAC",
      "D": "MDF"
    },
    "answerText": "B",
    "explanation": "Đáp án: BACPAC\n\nĐề chuẩn bị database để deploy environment mới. Cần artifact portable, thường gồm schema và data, để import Azure SQL hoặc instance khác.\n\nBACPAC đóng schema, data và nhiều setting thành một package. Upload rồi import lên target, phù hợp migrate cả môi trường. Format này làm việc với Azure SQL và pipeline DevOps.\n\nNDF là secondary data file, không phải gói deploy. DACPAC chỉ schema (project model), cố ý bỏ user data, thiếu khi cần nguyên database state. MDF là primary file SQL Server, không import trực tiếp như artifact có versioning và validation của BACPAC.\n\nKeywords phản xạ nhanh (AZ-400)\n\"prepare the database\" + \"export\" + full environment → BACPAC."
  },
  "594": {
    "stem": "Bạn cần đáp ứng technical requirements cho monitoring App1. Bạn nên dùng gì?",
    "options": {
      "A": "Splunk",
      "B": "Azure Application Insights",
      "C": "Azure Advisor",
      "D": "App Service logs"
    },
    "answerText": "B",
    "explanation": "Đáp án: Azure Application Insights\n\nĐề monitoring App1 (thường là App Service / web app trên Azure) theo technical requirements: telemetry, exceptions, performance, alert.\n\nAzure Application Insights là APM native: requests, exceptions, metrics, distributed tracing, Smart Detection và alert. Tích hợp App Service, đủ production monitoring.\n\nSplunk có thể ingest log nhưng không phải native Azure APM, thêm license và overhead. Azure Advisor đưa best-practice cost/reliability, không phải runtime telemetry của App1. App Service logs là file/HTTP log cơ bản, thiếu dashboard, custom metric và alerting đầy đủ như Application Insights.\n\nKeywords phản xạ nhanh (AZ-400)\n\"monitoring App1\" + Azure web app → Azure Application Insights."
  },
  "595": {
    "stem": "Bạn cần recommend giải pháp deploy charts bằng Helm và Tiller lên Azure Kubernetes Service (AKS) trong cluster đã bật RBAC.\nBa lệnh nào nên chạy theo thứ tự? Kéo các commands phù hợp vào answer area và sắp xếp đúng thứ tự.",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "kubectl create"
      },
      "2": {
        "label": "Zone 2",
        "answer": "helm init"
      },
      "3": {
        "label": "Zone 3",
        "answer": "helm install"
      }
    },
    "answerText": "kubectl create, helm init, helm install",
    "explanation": "Đáp án: kubectl create; helm init; helm install\n\nĐề Helm 2 với Tiller trên AKS bật RBAC. Tiller cần service account và role binding trước khi init.\n\nkubectl create (ví dụ kubectl create -f rbac-config.yaml) tạo ServiceAccount tiller và ClusterRoleBinding. helm init --service-account tiller cài Tiller đúng RBAC. helm install mới deploy chart.\n\nhelm init trước kubectl create sẽ fail vì Tiller chưa có identity cluster-admin/tiller. helm install trước init thì chưa có Tiller. helm repo add không thay ba lệnh được khóa cho RBAC-enabled cluster.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Helm\" + \"Tiller\" + \"RBAC-enabled\" AKS → kubectl create + helm init + helm install."
  },
  "596": {
    "stem": "Bạn cần cấu hình quyền truy cập Azure DevOps agent pools để đáp ứng các yêu cầu sau:\n- Dùng project agent pool khi soạn build hoặc release pipelines.\n- Xem được agent pool và agents của organization.\n- Tuân nguyên tắc least privilege.\n\nRole membership nào cần ở cấp Azure DevOps organization và ở cấp project? Kéo role membership phù hợp vào đúng ô. Mỗi role có thể dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: Organization: Reader; Project: User\n\nĐề cần least privilege: vừa xem organization agent pool và agents, vừa dùng project agent pool khi author pipeline.\n\nỞ organization, Reader cho phép xem pool và agents để theo dõi sức khỏe agent, không được quyền quản trị pool. Ở project, User cho phép chọn và dùng project agent pool khi viết build hoặc release pipeline.\n\nAdministrator vượt least privilege vì quản trị toàn bộ pool. Service Account dùng khi tạo project agent pool từ organization, không phải role để author pipeline ở project. User ở organization không đủ để xem pool cấp org. Reader ở project không cho dùng pool khi soạn pipeline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"project agent pool\" + \"view the agent pool\" + \"least privilege\" → Organization Reader + Project User.",
    "boxes": {
      "1": {
        "label": "Organization:",
        "answer": "Reader"
      },
      "2": {
        "label": "Project:",
        "answer": "User"
      }
    },
    "answerText": "Reader, User"
  },
  "597": {
    "stem": "Công ty đang tạo bộ ba mobile applications.\nBạn cần kiểm soát ai được nhận application builds. Giải pháp phải quản lý ở cấp organization.\n\nBạn nên dùng gì? Chọn option phù hợp trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: Microsoft Visual Studio App Center distribution groups; Shared\n\nĐề kiểm soát access tới builds của ba mobile apps và quản lý nhóm ở organization, không lặp lại từng app.\n\nApp Center distribution groups gom tester hoặc ring (QA, External Beta, Staging) và cấp quyền nhận release. Shared distribution group dùng chung cho nhiều app trong một organization, khớp yêu cầu quản lý tập trung.\n\nActive Directory groups và Azure Active Directory groups không phải cơ chế phân phối build của App Center. Private chỉ gắn một app. Public mở rộng hơn cần thiết và không giải bài toán dùng chung ba app ở organization.\n\nKeywords phản xạ nhanh (AZ-400)\n\"three mobile applications\" + \"control access\" + \"organization level\" → App Center distribution groups + Shared.",
    "boxes": {
      "1": {
        "label": " Groups to control the build access:",
        "answer": "Microsoft Visual Studio App Center distribution groups"
      },
      "2": {
        "label": "Group type:",
        "answer": "Shared"
      }
    },
    "answerText": "Microsoft Visual Studio App Center distribution groups, Shared"
  },
  "598": {
    "stem": "Bạn đang cấu hình Azure DevOps build pipelines và định dùng hosted build agents.\n\nAgent pool nào dùng để compile từng loại application? Kéo build agent pool phù hợp vào đúng loại ứng dụng. Mỗi pool có thể dùng một lần, nhiều lần, hoặc không dùng.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: An application that runs on iOS: Hosted; An IIS web application that runs in Docker: Hosted\n\nĐề chọn hosted build agent pool để compile app iOS và app IIS chạy trong Docker.\n\nTheo khóa đáp án, cả hai workload dùng Hosted pool. Hosted là built-in pool gồm Microsoft-hosted agents; exam chấp nhận Hosted cho cả iOS và web/Docker khi không bắt buộc pool chuyên biệt.\n\nDefault pool dành self-hosted agents do bạn đăng ký, không phải hosted pool đề yêu cầu. Hosted Windows Container chỉ khi build bên trong Windows containers; khóa không chọn pool này. Hosted Linux hay Hosted macOS không nằm trong đáp án được ghi.\n\nKeywords phản xạ nhanh (AZ-400)\n\"hosted build agents\" + iOS + \"IIS\" + Docker → Hosted + Hosted.",
    "boxes": {
      "1": {
        "label": "An application that runs on iOS:",
        "answer": "Hosted"
      },
      "2": {
        "label": "An Internet Information Services (IIS) web application that runs in Docker.",
        "answer": "Hosted"
      }
    },
    "answerText": "Hosted, Hosted"
  },
  "599": {
    "stem": "Bạn cần dùng Azure Automation State Configuration để giữ cấu hình virtual machine luôn nhất quán theo thời gian.\n\nNăm hành động nào phải làm theo thứ tự? Kéo action phù hợp vào answer area và sắp xếp đúng thứ tự.",
    "explanation": "Đáp án: Assign the node configuration. → Upload a configuration to Azure Automation State Configuration. → Compile a configuration into a node configuration. → Onboard the virtual machines to Azure Automation State Configuration. → Check the compliance status of the node.\n\nĐề quản lý ongoing consistency của VM bằng Azure Automation State Configuration và hỏi năm bước theo khóa đề.\n\nAssign the node configuration xác định node sẽ nhận desired state nào (ví dụ có hay không feature Web-Server). Upload configuration đưa DSC configuration vào Automation account. Compile biến configuration thành node configuration (MOF) trên pull server. Onboard đưa VM vào State Configuration để node kéo desired state. Check the compliance status xem node Compliant, Failed, hay Not Compliant sau consistency check.\n\nCreate a management group không thuộc quy trình DSC. Assign tags to the virtual machines không thay cho onboard hay assign node configuration. Bỏ bước compile thì không có MOF để apply.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Automation State Configuration\" + \"five actions\" → Assign → Upload → Compile → Onboard → Check compliance.",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Assign the node configuration."
      },
      "2": {
        "label": "Zone 2",
        "answer": "Upload a configuration to Azure Automation State Configuration."
      },
      "3": {
        "label": "Zone 3",
        "answer": "Compile a configuration into a node configuration."
      },
      "4": {
        "label": "Zone 4",
        "answer": "Onboard the virtual machines to Azure Automation State Configuration."
      },
      "5": {
        "label": "Zone 5",
        "answer": "Check the compliance status of the node."
      }
    },
    "answerText": "Assign the node configuration., Upload a configuration to Azure Automation State Configuration., Compile a configuration into a node configuration., Onboard the virtual machines to Azure Automation State Configuration., Check the compliance status of the node."
  },
  "600": {
    "stem": "Bạn có project trong Azure DevOps.\nBạn định tạo build pipeline deploy tài nguyên bằng Azure Resource Manager templates. Templates sẽ tham chiếu secrets lưu trong Azure Key Vault.\nBạn cần bảo đảm có thể sinh động resource ID của key vault trong lúc template deployment.",
    "explanation": "Đáp án: Microsoft.Resources/deployment; templateLink\n\nĐề deploy ARM templates có secret Key Vault mà resource ID của vault được generate động lúc deployment, không hard-code ID tĩnh.\n\nNested deployment kiểu Microsoft.Resources/deployment (deployments) cho phép template con nhận parameter chứa resource ID vừa tính. templateLink trỏ parent tới linked template và truyền ID động đó vào, để reference secret theo ID hiện tại của vault.\n\nMicrosoft.KeyVault/vaults mô tả bản thân vault, không phải cơ chế linked deployment để truyền ID động. Microsoft.Subscription/subscriptions không reference secret. Thuộc tính deployment hoặc template không thay templateLink khi gắn linked template.\n\nKeywords phản xạ nhanh (AZ-400)\n\"dynamically generate\" + \"key vault\" + \"resource ID\" → Microsoft.Resources/deployment + templateLink.",
    "boxes": {
      "1": {
        "label": "",
        "answer": "'Microsoft.Resources/deployment '"
      },
      "2": {
        "label": "",
        "answer": "'templateLink '"
      }
    },
    "answerText": "'Microsoft.Resources/deployment ', 'templateLink '"
  },
  "601": {
    "stem": "Công ty định deploy một application tới các endpoint sau:\n- Mười virtual machines trên Azure\n- Mười virtual machines tại on-premises data center\n\nMọi virtual machine đã có Azure Pipelines agent.\nBạn cần chiến lược release để deploy application tới các endpoint đó.\n\nNên dùng thành phần nào cho từng endpoint? Kéo component phù hợp vào đúng endpoint. Mỗi component có thể dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: Ten virtual machines hosted in Azure: A deployment group; on-premises data center: A deployment group\n\nĐề deploy cùng một app lên mười Azure VM và mười VM on-premises; tất cả đã cài Azure Pipelines agent.\n\nDeployment group là tập máy đã đăng ký agent, dùng làm target của deployment job trong release pipeline. Cùng một mô hình chạy được trên Azure VM và máy on-premises vì agent đã có trên cả hai.\n\nA management group quản lý subscription Azure, không phải máy cài app. A resource group nhóm tài nguyên Azure, không deploy agent job tới on-prem. Application roles là phân quyền ứng dụng, không phải target deploy.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Pipelines agent\" + Azure VMs + on-premises → deployment group + deployment group.",
    "boxes": {
      "1": {
        "label": "Ten virtual machines hosted in Azure:",
        "answer": "A deployment group"
      },
      "2": {
        "label": "an on-premises data center environment:",
        "answer": "A deployment group"
      }
    },
    "answerText": "A deployment group, A deployment group"
  },
  "602": {
    "stem": "Bạn có Azure Kubernetes Service (AKS) đã bật RBAC.\nBạn định dùng Azure Container Instances làm hosted development environment để chạy containers trong AKS đó.\nBạn cần cấu hình Azure Container Instances thành hosted environment cho containers trên AKS.\n\nBa hành động nào phải làm theo thứ tự? Kéo action phù hợp vào answer area và sắp xếp đúng thứ tự.",
    "explanation": "Đáp án: Run az aks install-connector. → Run az role assignment create → Run kubectl apply.\n\nĐề gắn Azure Container Instances vào AKS đã RBAC-enabled để chạy container trên virtual node (ACI).\n\naz aks install-connector cài Virtual Kubelet, nối AKS với ACI. Vì cluster bật RBAC, az role assignment create cấp quyền Azure để connector tạo và quản lý ACI trong resource group. kubectl apply triển khai YAML; nodeSelector hướng workload tới virtual node ACI.\n\nKhông apply YAML trước khi connector và role assignment xong vì virtual node chưa sẵn hoặc thiếu quyền. Không bỏ role assignment trên cluster RBAC. Các bước khác ngoài ba lệnh khóa không thuộc trình tự đề ghi.\n\nKeywords phản xạ nhanh (AZ-400)\n\"AKS\" + \"RBAC-enabled\" + ACI → az aks install-connector + az role assignment create + kubectl apply.",
    "boxes": {
      "1": {
        "label": "Zone 1",
        "answer": "Run az aks install-connector."
      },
      "2": {
        "label": "Zone 2",
        "answer": "Run az role assignment create"
      },
      "3": {
        "label": "Zone 3",
        "answer": "Run kubectl apply."
      }
    },
    "answerText": "Run az aks install-connector., Run az role assignment create, Run kubectl apply."
  },
  "603": {
    "stem": "Bạn cần cấu hình cloud service để lưu secrets mà mobile applications dùng khi gọi share pricing service.\n\nGiải pháp nên gồm gì? Chọn option phù hợp trong answer area.",
    "explanation": "Đáp án: Required secrets: Username and password; Storage location: Azure Key Vault\n\nĐề chọn loại secret mobile apps cần để gọi share pricing service và nơi lưu secret đó trên cloud.\n\nShare pricing service xác thực bằng username and password, đây là secret cơ bản app phải gửi kèm. Azure Key Vault là nơi tập trung, mã hóa, có access policy hoặc RBAC và audit cho secrets.\n\nCertificate phức tạp hơn nhu cầu username/password. Personal access token thường cho Git hoặc Azure DevOps, không phải generic share pricing API. Shared Access Authorization token (SAS) dành Azure Storage, không phải dịch vụ giá cổ phiếu. Azure Storage (HTTP hoặc HTTPS) và Azure Data Lake lưu data, không phải secret store chuẩn; để password trong storage là anti-pattern.\n\nKeywords phản xạ nhanh (AZ-400)\n\"share pricing service\" + mobile secrets → Username and password + Azure Key Vault.",
    "boxes": {
      "1": {
        "label": "Required secrets:",
        "answer": "Username and password"
      },
      "2": {
        "label": "Storage location:",
        "answer": "Azure Key Vault"
      }
    },
    "answerText": "Username and password, Azure Key Vault"
  },
  "604": {
    "stem": "Bạn nên cấu hình release retention policy cho bộ investment planning applications như thế nào? Chọn option phù hợp trong answer area.",
    "explanation": "Đáp án: Global release: Set the default retention policy to 30 days.; Production stage: Set the stage retention policy to 60 days.\n\nKịch bản yêu cầu mặc định mọi release giữ 30 ngày, riêng production giữ 60 ngày.\n\nDefault retention policy (global) đặt 30 ngày cho mọi release pipeline; author vẫn có thể override. Stage retention trên Production đặt 60 ngày để bản đã lên production giữ lâu hơn các stage khác.\n\nĐặt default 60 ngày làm mọi stage giữ quá lâu, không khớp \"by default 30 days\". Chỉ sửa global mà không sửa stage thì production cũng 30 ngày. Không dùng artifact retention của build thay cho release retention.\n\nKeywords phản xạ nhanh (AZ-400)\n\"default\" 30 days + production 60 days → default retention 30 + stage retention 60.",
    "boxes": {
      "1": {
        "label": "Global release:",
        "answer": "Set the default retention policy to 30 days."
      },
      "2": {
        "label": "Production stage:",
        "answer": "Set the stage retention policy to 60 days."
      }
    },
    "answerText": "Set the default retention policy to 30 days., Set the stage retention policy to 60 days."
  },
  "605": {
    "stem": "Công ty đang xây web application mới.\nBạn định thu thập feedback từ pilot users về các tính năng đang deliver.\nMọi pilot user có máy corporate cài Google Chrome và extension Microsoft Test & Feedback; họ test app bằng Chrome.\nBạn cần xác định access levels để developers request và thu feedback từ pilot users, theo nguyên tắc least privilege.\n\nAccess levels nào trong Azure DevOps? Chọn option phù hợp trong answer area.",
    "explanation": "Đáp án: Developers: Basic; Pilot Users: Stakeholder\n\nĐề dùng Test & Feedback trên Chrome: developers gửi request, pilot users trả feedback, least privilege.\n\nBasic cho developers quyền tạo request feedback và làm việc với work items. Stakeholder đủ để pilot users nhận request và gửi feedback, không mất license Basic.\n\nStakeholder cho developers thì thiếu quyền request đầy đủ. Basic cho toàn bộ pilot users vượt least privilege. Visual Studio Enterprise không cần cho tester hay cho yêu cầu này.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Test & Feedback\" + \"least privilege\" + \"pilot users\" → Basic + Stakeholder.",
    "boxes": {
      "1": {
        "label": "Developers:",
        "answer": "Basic"
      },
      "2": {
        "label": "Pilot Users:",
        "answer": "Stakeholder"
      }
    },
    "answerText": "Basic, Stakeholder"
  },
  "606": {
    "stem": "Bạn cần đề xuất project metrics cho dashboards trong Azure DevOps. Chart widget nào cho từng metric? Kéo chart widget phù hợp vào đúng metric. Mỗi widget có thể dùng một lần, nhiều lần, hoặc không dùng.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: The elapsed time from the creation of work items to their completion: Lead time; The elapsed time to complete work items once they are active: Cycle time; The remaining work: Burndown\n\nĐề gắn đúng widget dashboard với từng định nghĩa metric.\n\nLead time đo thời gian từ lúc tạo work item đến lúc hoàn thành. Cycle time đo thời gian từ khi item chuyển Active đến khi xong. Burndown thể hiện remaining work trong một khoảng thời gian (sprint hoặc backlog).\n\nVelocity phục vụ forecast và đánh giá commitment, không phải elapsed time hay remaining work theo đúng ba ô. Không gán Cycle time cho \"from creation\" vì đó là Lead time. Không gán Lead time cho \"once they are active\".\n\nKeywords phản xạ nhanh (AZ-400)\n\"creation to completion\" + \"once they are active\" + \"remaining work\" → Lead time + Cycle time + Burndown.",
    "boxes": {
      "1": {
        "label": " The elapsed time from the creation of work items to their completion:",
        "answer": "Lead time"
      },
      "2": {
        "label": "The elapsed time to complete work items once they are active:",
        "answer": "Cycle time"
      },
      "3": {
        "label": "The remaining work:",
        "answer": "Burndown"
      }
    },
    "answerText": "Lead time, Cycle time, Burndown"
  },
  "607": {
    "stem": "Bạn cần tăng security cho quy trình development của team.\n\nLoại security tool nào cho từng giai đoạn? Kéo tool phù hợp vào đúng target. Mỗi tool có thể dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: Pull request: Static code analysis; Continuous integration: Static code analysis; Continuous delivery: Penetration testing\n\nĐề chọn tool bảo mật theo giai đoạn PR, CI và CD.\n\nỞ pull request, static code analysis (SAST) quét diff trước khi merge, chặn lỗ hổng vào nhánh chính. Ở continuous integration, cùng SAST chạy trên build để xác nhận code đã commit không đưa vulnerability vào pipeline. Ở continuous delivery, ứng dụng đã deploy trên môi trường thấp nên chạy penetration testing (hoặc DAST tự động) trên app đang chạy.\n\nPenetration testing ở PR hoặc CI không phù hợp vì chưa có bản deploy ổn định để tấn công. Chỉ SAST ở CD thì bỏ qua lỗ hổng runtime. Không thay SAST bằng tool khác khi khóa ghi static code analysis cho hai giai đoạn đầu.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Pull request\" + \"Continuous integration\" + \"Continuous delivery\" → Static code analysis + Static code analysis + Penetration testing.",
    "boxes": {
      "1": {
        "label": "Pull request:",
        "answer": "Static code analysis"
      },
      "2": {
        "label": "Continuous integration:",
        "answer": "Static code analysis"
      },
      "3": {
        "label": "Continuous delivery:",
        "answer": "Penetration testing"
      }
    },
    "answerText": "Static code analysis, Static code analysis, Penetration testing"
  },
  "608": {
    "stem": "Công ty đang dùng Team Foundation Server 2013 (TFS 2013).\nBạn định migrate sang Azure DevOps.\nCần chiến lược migration thỏa:\n- Giữ dates của Team Foundation Version Control changesets\n- Giữ change dates của work item revisions\n- Giảm effort migrate\n- Migrate mọi TFS artifacts\n\nBạn nên đề xuất gì? Chọn option phù hợp trong answer area.",
    "explanation": "Đáp án: On the TFS server: Upgrade TFS to the most recent RTW release.; To perform the migration: Use the TFS Database Import Service.\n\nĐề migrate TFS 2013 sang Azure DevOps, giữ changeset dates và work item revision dates, migrate đủ artifacts, giảm effort.\n\nDatabase Import Service chỉ nhận schema gần với Azure DevOps Services, nên phải upgrade TFS lên bản RTW/RTM mới nhất được hỗ trợ. Sau đó Import Service đưa cả database (TFVC history, work items, dates, artifacts) sang cloud, ít thao tác hơn migrate từng project bằng tool khác.\n\nKhông migrate trực tiếp từ TFS 2013 vì schema quá cũ. Không dùng chỉ Git import vì mất TFVC changeset dates. Các cách clone/export thủ công không giữ đủ artifact và timestamps như Import Service.\n\nKeywords phản xạ nhanh (AZ-400)\n\"TFS 2013\" + \"preserves dates\" + \"all TFS artifacts\" → upgrade latest RTW + TFS Database Import Service.",
    "boxes": {
      "1": {
        "label": "On the TFS server:",
        "answer": "Upgrade TFS to the most recent RTW release."
      },
      "2": {
        "label": " To perform the migration:",
        "answer": "Use the TFS Database Import Service."
      }
    },
    "answerText": "Upgrade TFS to the most recent RTW release., Use the TFS Database Import Service."
  },
  "609": {
    "stem": "Bạn cần cấu hình quyền truy cập Azure DevOps agent pools để đáp ứng các yêu cầu sau:\n- Dùng project agent pool khi soạn build hoặc release pipelines.\n- Xem được agent pool và agents của organization.\n- Tuân nguyên tắc least privilege.\n\nRole membership nào cần ở cấp Azure DevOps organization và ở cấp project? Kéo role membership phù hợp vào đúng ô. Mỗi role có thể dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: Organization: Reader; Project: User\n\nĐề cần least privilege: xem organization agent pool và agents, đồng thời dùng project agent pool khi author pipeline.\n\nReader ở organization cho phép xem pool và agents để theo dõi sức khỏe, không quản trị pool. User ở project cho phép dùng project agent pool khi viết pipeline.\n\nAdministrator vượt least privilege. Service Account dùng khi tạo project agent pool từ organization, không phải role author pipeline. User ở organization không đủ quyền xem pool cấp org. Reader ở project không cho dùng pool khi soạn pipeline.\n\nKeywords phản xạ nhanh (AZ-400)\n\"project agent pool\" + \"view the agent pool\" + \"least privilege\" → Organization Reader + Project User.",
    "boxes": {
      "1": {
        "label": "Organization:",
        "answer": "Reader"
      },
      "2": {
        "label": "Project:",
        "answer": "User"
      }
    },
    "answerText": "Reader, User"
  },
  "610": {
    "stem": "Công ty đang tạo bộ ba mobile applications.\nBạn cần kiểm soát ai được nhận application builds. Giải pháp phải quản lý ở cấp organization.\n\nBạn nên dùng gì? Chọn option phù hợp trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: Microsoft Visual Studio App Center distribution groups; Shared\n\nĐề kiểm soát access tới builds của ba mobile apps và quản lý nhóm ở organization.\n\nApp Center distribution groups gom user (QA, External Beta, Staging) để cấp quyền nhận release. Shared distribution group dùng chung nhiều app trong một organization, tránh nhân bản nhóm trên từng app.\n\nActive Directory groups và Azure Active Directory groups không phân phối build App Center. Private chỉ gắn một app. Public không giải bài toán quản lý tập trung ba app.\n\nKeywords phản xạ nhanh (AZ-400)\n\"three mobile applications\" + \"control access\" + \"organization level\" → App Center distribution groups + Shared.",
    "boxes": {
      "1": {
        "label": "Groups to control the build access:",
        "answer": "Microsoft Visual Studio App Center distribution groups"
      },
      "2": {
        "label": "Group type:",
        "answer": "Shared"
      }
    },
    "answerText": "Microsoft Visual Studio App Center distribution groups, Shared"
  },
  "611": {
    "stem": "Bạn đang cấu hình Azure DevOps build pipelines và định dùng hosted build agents.\n\nAgent pool nào dùng để compile từng loại application? Kéo build agent pool phù hợp vào đúng loại ứng dụng. Mỗi pool có thể dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: An application that runs on iOS: Hosted; An IIS web application that runs in Docker: Hosted\n\nĐề chọn hosted build agent pool để compile app iOS và app IIS chạy trong Docker.\n\nTheo khóa đáp án, cả hai dùng Hosted pool. Hosted là built-in pool Microsoft-hosted agents; exam chấp nhận Hosted cho cả hai workload khi không bắt buộc pool chuyên biệt.\n\nDefault pool dành self-hosted agents. Hosted Windows Container dành build trong Windows containers; khóa không chọn. Hosted Linux hay Hosted macOS không nằm trong đáp án được ghi.\n\nKeywords phản xạ nhanh (AZ-400)\n\"hosted build agents\" + iOS + \"IIS\" + Docker → Hosted + Hosted.",
    "boxes": {
      "1": {
        "label": "An application that runs on iOS:",
        "answer": "Hosted"
      },
      "2": {
        "label": "An Internet Information Services (IIS) web application that runs in Docker:",
        "answer": "Hosted"
      }
    },
    "answerText": "Hosted, Hosted"
  },
  "612": {
    "stem": "Bạn cần dùng Azure Automation State Configuration để giữ cấu hình virtual machine luôn nhất quán theo thời gian.\n\nNăm hành động nào phải làm theo thứ tự? Kéo action phù hợp vào answer area và sắp xếp đúng thứ tự.\nLƯU Ý: Có thể có nhiều thứ tự đúng. Bạn được điểm nếu chọn một thứ tự đúng.",
    "explanation": "Đáp án: Assign the node configuration. → Upload a configuration to Azure Automation State Configuration. → Compile a configuration into a node configuration. → Onboard the virtual machines to Azure Automation State Configuration. → Check the compliance status of the node.\n\nĐề quản lý ongoing consistency của VM bằng Azure Automation State Configuration; khóa ghi năm bước theo thứ tự trên.\n\nAssign the node configuration xác định desired state từng node. Upload đưa DSC configuration vào Automation account. Compile tạo node configuration (MOF) trên pull server. Onboard đăng ký VM để node kéo configuration. Check the compliance status đọc báo cáo Compliant, Failed, hoặc Not Compliant sau consistency check.\n\nCreate a management group và assign tags không thay cho upload, compile, hay onboard. Thiếu compile thì không có MOF để apply.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Azure Automation State Configuration\" + \"five actions\" → Assign → Upload → Compile → Onboard → Check compliance.",
    "boxes": {
      "1": {
        "label": "Step 1",
        "answer": "Assign the node configuration."
      },
      "2": {
        "label": "Step 2",
        "answer": "Upload a configuration to Azure Automation State Configuration."
      },
      "3": {
        "label": "Step 3",
        "answer": "Compile a configuration into a node configuration."
      },
      "4": {
        "label": "Step 4",
        "answer": "Onboard the virtual machines to Azure Automation State Configuration."
      },
      "5": {
        "label": "Step 5",
        "answer": "Check the compliance status of the node."
      }
    },
    "answerText": "Assign the node configuration., Upload a configuration to Azure Automation State Configuration., Compile a configuration into a node configuration., Onboard the virtual machines to Azure Automation State Configuration., Check the compliance status of the node."
  },
  "613": {
    "stem": "Bạn cần cấu hình cloud service để lưu secrets mà mobile applications dùng khi gọi share pricing service.\n\nGiải pháp nên gồm gì? Chọn option phù hợp trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: Required secrets: Username and password; Storage location: Azure Key Vault\n\nĐề chọn loại secret mobile apps cần để gọi share pricing service và nơi lưu secret.\n\nDịch vụ share pricing xác thực bằng username and password. Azure Key Vault lưu secrets, keys và certificates với mã hóa, access control và audit.\n\nCertificate dư cho lời gọi đơn giản bằng user/password. Personal access token dành Git hoặc Azure DevOps. Shared Access Authorization token dành Azure Storage. Azure Storage (HTTP hoặc HTTPS) và Azure Data Lake không phải secret store; để password trong storage là anti-pattern.\n\nKeywords phản xạ nhanh (AZ-400)\n\"share pricing service\" + mobile secrets → Username and password + Azure Key Vault.",
    "boxes": {
      "1": {
        "label": "Required secrets:",
        "answer": "Username and password"
      },
      "2": {
        "label": "Storage location:",
        "answer": "Azure Key Vault"
      }
    },
    "answerText": "Username and password, Azure Key Vault"
  },
  "614": {
    "stem": "Công ty có project trong Azure DevOps.\nBạn định tạo release pipeline deploy tài nguyên bằng Azure Resource Manager templates. Templates sẽ tham chiếu secrets trong Azure Key Vault.\nBạn cần đề xuất cách truy cập secrets lúc deploy, theo nguyên tắc least privilege.\n\nNên gồm cấu hình nào? Kéo configuration phù hợp vào đúng target. Mỗi configuration có thể dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: Restrict access to delete the key vault: RBAC; Restrict access to the secrets in Key Vault: An azure key vault access policy\n\nĐề vừa chặn xóa Key Vault vừa hạn chế ai đọc secrets khi ARM template deploy, least privilege.\n\nXóa Key Vault thuộc management plane (Azure Resource Manager). Chỉ Azure RBAC (hoặc lock kèm RBAC) quyết định ai được xóa resource vault. Access policy không kiểm soát tạo hay xóa vault. Theo khóa, quyền đọc secrets trên data plane dùng Azure Key Vault access policy: cấp Get/List secret cho identity của deployment, không phát PAT.\n\nPersonal access token (PAT) không phải cách ARM/Key Vault grant secret lúc deploy và không chặn xóa vault. Access policy không thay RBAC cho thao tác delete vault. RBAC không phải đáp án khóa cho ô secrets.\n\nKeywords phản xạ nhanh (AZ-400)\n\"delete the key vault\" + \"secrets in Key Vault\" + \"least privilege\" → RBAC + Key Vault access policy.",
    "boxes": {
      "1": {
        "label": "Restrict access to delete the key vault:",
        "answer": "RBAC"
      },
      "2": {
        "label": "Restrict access to the secrets in Key Vault by using:",
        "answer": "An azure key vault access policy"
      }
    },
    "answerText": "RBAC, An azure key vault access policy"
  },
  "615": {
    "stem": "Công ty có bốn project. Yêu cầu version control của từng project như bảng sau. Bạn định dùng Azure Repos cho mọi project.\n\nProject 1: Project leads phải restrict access tới từng file và folder trong repository.\nProject 2: Version control phải enforce trên server trước khi merge vào main branch: thay đổi được review bởi ít nhất hai project members, và gắn ít nhất một work item.\nProject 3: Project members phải làm việc với Azure Repos trực tiếp từ Xcode.\nProject 4: Release branch chỉ được xem hoặc sửa bởi project leads.\n\nNên dùng hệ version control nào cho từng project? Kéo hệ phù hợp vào đúng project. Mỗi hệ có thể dùng một lần, nhiều lần, hoặc không dùng.",
    "explanation": "Đáp án: Project 1: Team Foundation Version Control; Project 2: Git; Project 3: Git; Project 4: Team Foundation Version Control\n\nĐề chọn Git hoặc TFVC trên Azure Repos theo từng requirement.\n\nProject 1 cần chặn access theo từng file và folder. TFVC hỗ trợ permission theo path, khớp yêu cầu project leads. Project 2 cần server-side rule trước merge: hai reviewers và liên kết work item. Đó là Git branch policies trên pull request vào main. Project 3 cần Xcode làm việc trực tiếp với Azure Repos; Xcode dùng Git. Project 4, theo khóa, dùng TFVC để giới hạn ai xem và sửa nhánh hoặc cây release cho riêng project leads.\n\nPerforce và Subversion không phải lựa chọn Azure Repos. Git không phải đáp án khóa cho Project 1 vì đề nhấn path-level file/folder security kiểu TFVC. TFVC không có branch policy PR như Git cho Project 2. Xcode không làm việc kiểu TFVC như Git.\n\nKeywords phản xạ nhanh (AZ-400)\n\"restrict access to files and folders\" + \"reviewed by two\" + Xcode + \"release branch\" → TFVC + Git + Git + TFVC.",
    "boxes": {
      "1": {
        "label": "Project 1:",
        "answer": "Team Foundation Version Control"
      },
      "2": {
        "label": "Project 2:",
        "answer": "Git"
      },
      "3": {
        "label": "Project 3:",
        "answer": "Git"
      },
      "4": {
        "label": "Project 4:",
        "answer": "Team Foundation Version Control"
      }
    },
    "answerText": "Team Foundation Version Control, Git, Git, Team Foundation Version Control"
  },
  "616": {
    "stem": "Dùng drop-down để chọn đáp án cho từng câu dựa trên thông tin trong graphic.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: How many stages have triggers set?: 7; Which component should you modify to enable continuous delivery?: The Web Application artifact\n\nĐề đọc sơ đồ release (các stage Development, Internal Review, QA, Stakeholder Review, Pre-Prod, Load Test, Production) và hỏi số stage có trigger cùng thành phần cần sửa để bật continuous delivery.\n\nTheo khóa, bảy stage đều có trigger (mũi tên hoặc điều kiện pre-deployment trên mọi stage). Continuous delivery kích khi artifact mới xuất hiện: bật Continuous deployment trigger trên Web Application artifact, không phải sửa từng stage.\n\nSố 0 đến 6 thiếu stage đã có trigger trên sơ đồ. Sửa Development, Internal Review, hoặc Production chỉ đổi một stage, không bật CD từ artifact nguồn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"stages have triggers\" + \"enable continuous delivery\" → 7 + The Web Application artifact.",
    "boxes": {
      "1": {
        "label": "How many stages have triggers set?",
        "answer": "7"
      },
      "2": {
        "label": "Which component should you modify to enable continuous delivery?",
        "answer": "The Web Application artifact"
      }
    },
    "answerText": "7, The Web Application artifact"
  },
  "617": {
    "stem": "Bạn cần triển khai code flow strategy cho Project2 trong Azure DevOps.\nBa hành động nào phải làm theo thứ tự? Kéo action phù hợp vào answer area và sắp xếp đúng thứ tự.",
    "explanation": "Đáp án: Create a fork → Add a build policy for the master branch → Add an application access policy.\n\nĐề hiện thực code flow của Project2: contributor làm việc tách khỏi master, merge có kiểm soát, rồi siết quyền ứng dụng.\n\nCreate a fork tạo bản sao để phát triển mà không commit thẳng lên repository gốc. Add a build policy for the master branch bắt pull request phải build thành công trước khi vào master. Add an application access policy hạn chế identity nào được đụng repository hoặc app theo chiến lược Project2.\n\nCreate a branch không thay fork khi đề chọn fork. Add a build policy for the fork bảo vệ nhánh fork, không phải master. Create a repository tạo repo mới, không phải luồng fork-and-PR. Bỏ application access policy thì thiếu bước khóa ghi.\n\nKeywords phản xạ nhanh (AZ-400)\n\"code flow\" + Project2 → Create a fork + build policy on master + application access policy.",
    "boxes": {
      "1": {
        "label": "Box 1",
        "answer": "Create a fork"
      },
      "2": {
        "label": "The image shows the following stages",
        "answer": "Add a build policy for the master branch"
      },
      "3": {
        "label": "Zone 3",
        "answer": "Add an application access policy."
      }
    },
    "answerText": "Create a fork, Add a build policy for the master branch, Add an application access policy."
  },
  "618": {
    "stem": "Bạn đang tạo console application bằng C#. Bạn muốn upload một file mới vào container tên backup trên Azure Storage.\n\nBlobContainerClient container = new BlobContainerClient(connectionStri\ncontainer.CreateIfNotExists(PublicAccessType.Blob);\nvar blockBlob = container.GetBlobClient(\"pic.png\");\nusing (var fileStream = System.IO.File.OpenRead(@\"c:\\temp\\images\\pic.p\n<line>\n\nBạn nên viết gì thay cho chỗ còn thiếu?",
    "options": {
      "A": "BlockBlob.upload(blockBlob, fileStream, \"pic.png\")",
      "B": "blockBlob.Upload(fileStream)",
      "C": "blockBlob (filestream). Upload",
      "D": "fileStream.Upload(blockBlob)"
    },
    "explanation": "Đáp án: B — blockBlob.Upload(fileStream)\n\nĐề hoàn thiện đoạn Azure.Storage.Blobs: đã có BlobClient tên blockBlob và FileStream, cần upload pic.png vào container.\n\nBlobClient.Upload nhận Stream và đẩy nội dung lên blob. Đây là API đúng của SDK .NET.\n\nA sai vì không có static method BlockBlob.upload với ba tham số như vậy. C sai vì cú pháp C# không hợp lệ. D sai vì Stream không có method Upload; Upload nằm trên BlobClient.\n\nKeywords phản xạ nhanh (AZ-400)\n\"BlobContainerClient\" + \"GetBlobClient\" + Upload → blockBlob.Upload(fileStream).",
    "answerText": "B"
  },
  "619": {
    "stem": "Bạn muốn cho phép traffic giữa hai virtual networks khác nhau. Bạn nên làm gì?",
    "options": {
      "A": "Use Azure Application Gateway",
      "B": "Create a firewall rule to allow traffic between the two virtual networks",
      "C": "Configure a virtual network peering"
    },
    "explanation": "Đáp án: C — Configure a virtual network peering\n\nĐề cần hai Azure virtual networks trao đổi traffic với nhau.\n\nVirtual network peering nối hai VNet để tài nguyên nói chuyện với độ trễ thấp, băng thông cao, đây là cách chuẩn cho phép traffic giữa VNet.\n\nA sai vì Azure Application Gateway là Layer 7 load balancer HTTP/HTTPS, không nối hai VNet. B sai vì firewall rule chỉ lọc lưu lượng sau khi đã có đường đi; rule không tạo kết nối giữa hai VNet tách biệt.\n\nKeywords phản xạ nhanh (AZ-400)\n\"traffic between two virtual networks\" → virtual network peering.",
    "answerText": "C"
  },
  "620": {
    "stem": "Bạn có Azure subscription. Bạn định dùng Azure Pipelines để deploy giải pháp hạ tầng gồm app tên App1.\nBạn cần lưu secrets dùng lúc deploy, thỏa:\n- Database connection string phải dùng được cho cả deployment pipeline và App1.\n- Signing certificates chỉ được dùng trong deployment pipeline.\n- Giảm development effort.\n\nNên lưu từng loại secret ở đâu? Chọn option phù hợp trong answer area.\nLƯU Ý: Mỗi lựa chọn đúng được một điểm.",
    "explanation": "Đáp án: Signing certificates: Variable groups\n\nĐề hỏi nơi lưu signing certificates sao cho chỉ pipeline dùng được và ít effort. Khóa chỉ ghi một ô: Variable groups.\n\nVariable groups (Library) gắn secret vào pipeline, đánh dấu secret, pipeline đọc lúc deploy. Không cần viết thêm code lấy file từ store khác, khớp minimize development effort và phạm vi \"chỉ pipeline\".\n\nAzure Key Vault cũng chứa certificate nhưng phải tạo vault, access policy và link service connection, nhiều bước hơn so với khóa. Secure files phù hợp file chứng chỉ nhưng không phải đáp án được ghi. Variable groups không thay Key Vault cho connection string dùng chung App1; ô đó không có trong khóa nguồn.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Signing certificates\" + \"deployment pipeline\" + \"minimize development effort\" → Variable groups.",
    "boxes": {
      "1": {
        "label": "Signing certificates:",
        "answer": "Variable groups"
      }
    },
    "answerText": "Variable groups"
  },
  "621": {
    "stem": "Bạn có một Azure Pipelines pipeline. Bạn cần thêm task Manual Intervention để tạm dừng deployment, bắt user sửa configuration thủ công, rồi tiếp tục deployment. Bạn phải thêm gì vào pipeline trước?",
    "options": {
      "A": "an agentless job",
      "B": "a release gate",
      "C": "a deployment group job",
      "D": "an agent job"
    },
    "explanation": "Đáp án: A — an agentless job\n\nĐề chèn Manual Intervention: pause, người sửa cấu hình, rồi resume.\n\nManual Intervention chỉ chạy trên agentless job (server job). Job này không cần build agent; pipeline đứng chờ người xác nhận rồi chạy tiếp.\n\nB sai vì release gate tự đánh giá điều kiện trước khi vào stage, không phải chỗ đặt Manual Intervention giữa lúc deploy. C sai vì deployment group job chạy trên máy đích có agent. D sai vì agent job cần agent; Manual Intervention không chạy trên agent job.\n\nKeywords phản xạ nhanh (AZ-400)\n\"Manual Intervention\" + pause deployment → agentless job first.",
    "answerText": "A"
  },
  "622": {
    "stem": "Bạn có Azure subscription chứa virtual machines chạy Windows Server hoặc Ubuntu.\nBạn cần đề xuất giải pháp configuration management cho các VM, thỏa:\n- Giảm số server bổ sung.\n- Quản lý configuration từ Azure portal.\n- Status reports gửi thẳng tới Log Analytics workspace.\n\nBạn nên đưa gì vào đề xuất?",
    "options": {
      "A": "the State configuration (DSC) settings",
      "B": "Bicep",
      "C": "PowerShell Desired State Configuration (DSC)",
      "D": "Azure Resource Manager (ARM) templates"
    },
    "explanation": "Đáp án: A — the State configuration (DSC) settings\n\nĐề cần configuration management cho Windows và Ubuntu: ít server thêm, thao tác trên Azure portal, báo cáo vào Log Analytics.\n\nAzure Automation State configuration (DSC) là dịch vụ cloud: không dựng pull server on-prem, cấu hình trên portal, node gửi compliance về và có thể forward sang Log Analytics.\n\nB sai vì Bicep triển khai tài nguyên, không enforce desired state liên tục trên guest. C sai vì PowerShell DSC thuần cần pull server hoặc hạ tầng thêm, không phải trải nghiệm portal sẵn như Automation State Configuration. D sai vì ARM templates chỉ deploy resource, không quản lý configuration đang chạy trên VM.\n\nKeywords phản xạ nhanh (AZ-400)\n\"configuration management\" + Azure portal + Log Analytics → State configuration (DSC) settings.",
    "answerText": "A"
  },
  "623": {
    "stem": "Bạn định tạo package feed mới với các views: @Local, @Latest, @Release, @Prerelease.\nView nào bạn phải tạo thủ công?",
    "options": {
      "A": "@Latest",
      "B": "@Local",
      "C": "@Release",
      "D": "@Prerelease"
    },
    "explanation": "Đáp án: C — @Release\n\nĐề tạo Azure Artifacts feed với bốn view và hỏi view nào phải tạo tay.\n\nTheo khóa, @Release không có sẵn như view bạn cần tự tạo để promote gói ổn định ra khỏi @Local. @Local được hệ thống tạo khi lập feed và chứa package publish trực tiếp.\n\nA sai vì @Latest không phải view mặc định chuẩn, cũng không phải đáp án đơn được ghi. B sai vì @Local luôn có sẵn. D sai trên exam: dù @Prerelease cũng có thể phải tạo, khóa chọn @Release là view promotion ổn định cần tạo thủ công.\n\nKeywords phản xạ nhanh (AZ-400)\n\"package feed\" + views + \"create manually\" → @Release.",
    "answerText": "C"
  },
  "624": {
    "stem": "Bạn định cập nhật chiến lược Azure DevOps của công ty. Bạn cần phát hiện các vấn đề sau ngay khi chúng xuất hiện trong development process:\n- Licensing violations\n- Prohibited libraries\n\nGiải pháp: Implement continuous deployment.\nGiải pháp này có đáp ứng mục tiêu không?",
    "options": {
      "A": "Yes",
      "B": "No"
    },
    "explanation": "Đáp án: B — No\n\nĐề cần bắt licensing violations và prohibited libraries trong lúc phát triển. Solution chỉ implement continuous deployment.\n\nContinuous deployment tự đẩy bản đã sẵn sàng lên môi trường. CD không quét license hay thư viện cấm. Việc đó cần SCA, dependency scanning hoặc automated security testing trong build, trước khi deploy.\n\nYes sai vì CD là cơ chế phát hành, không phải detection. Không có scan thì hai loại issue vẫn lọt vào process.\n\nKeywords phản xạ nhanh (AZ-400)\n\"licensing violations\" + \"prohibited libraries\" + \"continuous deployment\" → No.",
    "answerText": "B"
  }
}
