Contoso Airlines' platform is modernized now, and that exposes a pile of work still being done by hand because until now there was no alternative. Every day the passenger support team classifies hundreds of complaints written in free text to decide who they should go to. At check-in, an agent types in passport details while looking at the document. Boarding announcements are given in two languages because there are no announcers for more. And the portal only really makes sense in Spanish.

None of that requires training a model: they are capabilities Azure offers as ready-to-consume services. This lesson walks through Azure AI Services, implements four real Contoso cases, explains Azure OpenAI Service and retrieval-augmented generation, and devotes a full section — not a courtesy paragraph — to what is not optional here: bias, hallucinations, privacy, human oversight and legal review before anything reaches production.

Contents

  1. The Azure AI Services catalog
  2. The consumption model: resource, endpoint and authentication
  3. Azure AI Language: classifying complaints
  4. Document Intelligence, Speech and Translator
  5. Azure OpenAI Service and Azure AI Foundry
  6. Retrieval-augmented generation (RAG)
  7. Azure Machine Learning: its own territory
  8. Responsible AI: the part that is not optional
  9. Cost per token and per transaction
  10. Common Mistakes and Tips
  11. Exercises
  12. Conclusion

  1. The Azure AI Services catalog

Family Service What it does Typical case
Vision AI Vision Describes images, reads text (OCR), detects objects Checking the condition of baggage in photos
Vision Face Detects and compares faces (limited access) Biometric boarding, with prior approval
Language AI Language Sentiment, entities, classification, summarization, question answering Passenger complaints
Language Translator Translates text and documents across more than 100 languages Multilingual portal
Speech AI Speech Speech to text, text to speech, speech translation Boarding announcements
Documents Document Intelligence Extracts structured fields from documents Passport at check-in
Search AI Search An index with text, vector and hybrid search The basis of the RAG in section 6
Decision Content Safety Detects harmful content in text and images Filtering the assistant's inputs and outputs
Generative Azure OpenAI Language and embedding models Passenger support assistant

They all share the same consumption pattern: a REST API with official SDKs, billing per transaction or per token, and no model to train in order to get started.

  1. The consumption model: resource, endpoint and authentication

You create a resource, which exposes an endpoint and a set of keys. The Azure AI Services multi-service resource groups several capabilities under a single endpoint, a single bill and a single set of permissions, and that is what Contoso uses so as not to manage six separate resources:

az cognitiveservices account create \
  -g rg-contoso-reservas-pro -n ai-contoso-pro \
  --kind CognitiveServices --sku S0 --location westeurope \
  --custom-domain ai-contoso-pro \
  --assign-identity \
  --tags entorno=produccion proyecto=contoso-reservas \
         centro-coste=CC-1042 [email protected]

# Disable key-based access: Entra ID only
az cognitiveservices account update -g rg-contoso-reservas-pro -n ai-contoso-pro \
  --custom-properties '{"disableLocalAuth": true}'

# The application's identity, with its role
az role assignment create --role "Cognitive Services User" \
  --assignee-object-id $(az identity show -g rg-contoso-seguridad-pro \
      -n id-contoso-api-pro --query principalId -o tsv) \
  --assignee-principal-type ServicePrincipal \
  --scope $(az cognitiveservices account show -g rg-contoso-reservas-pro \
      -n ai-contoso-pro --query id -o tsv)

Keys versus Entra ID. The portal shows two keys and it is tempting to copy them. Do not: they are shared, untraceable credentials that end up in a configuration file and from there in a repository. The right option is the same one as throughout this course: managed identity and DefaultAzureCredential, with disableLocalAuth so that the keys do not even work. It requires a custom domain on the resource, which is why --custom-domain is there.

  1. Azure AI Language: classifying complaints

Contoso receives complaints in free text. Today somebody reads them and distributes them; with AI Language they are classified, their sentiment is measured and the flight number is extracted automatically.

var client = new TextAnalyticsClient(
    new Uri("https://ai-contoso-pro.cognitiveservices.azure.com/"),
    new DefaultAzureCredential());          // no keys

var complaint = "My flight CA-1187 was delayed 4 hours and I missed my connection in Paris. " +
                "Nobody at the desk was able to give me any information. I demand compensation.";

// 1. Sentiment, with opinions about specific aspects
var options = new AnalyzeSentimentOptions { IncludeOpinionMining = true };
DocumentSentiment sentiment = await client.AnalyzeSentimentAsync(complaint, "en", options);

// 2. Entities: this is where the flight number and the place come from
var entities = await client.RecognizeEntitiesAsync(complaint, "en");
var flight = entities.Value
    .FirstOrDefault(e => e.Category == "Event" || e.Text.StartsWith("CA-"))?.Text;

Console.WriteLine($"{sentiment.Sentiment} {sentiment.ConfidenceScores.Negative} {flight}");

The response, abridged:

{
  "sentiment": "negative",
  "confidenceScores": { "positive": 0.01, "neutral": 0.04, "negative": 0.95 },
  "sentences": [{
    "targets": [ { "text": "desk", "sentiment": "negative" } ],
    "assessments": [ { "text": "nobody was able to give me any information", "sentiment": "negative" } ]
  }],
  "entities": [
    { "text": "CA-1187", "category": "Event", "confidenceScore": 0.88 },
    { "text": "4 hours", "category": "Quantity", "subcategory": "Duration" },
    { "text": "Paris",   "category": "Location", "confidenceScore": 0.99 }
  ]
}

Three things to read carefully. confidenceScores is not a true probability, it is the model's confidence, and a negative score of 0.95 is not the same as certainty. Opinion mining identifies what the passenger is negative about — the desk — which is the actionable part. And confidenceScore: 0.88 on the flight means one case in eight can be wrong: that is why Contoso's workflow does not reject a complaint with no flight number, it routes it to human review.

Classification by department is done with custom classification: a few hundred historical complaints are labeled by category — baggage, delays, service, refunds — and the service trains a model of its own on Contoso's catalog. There is training there, but of a lightweight classifier, not of a language model. The result feeds the 06-04 workflow, which routes each complaint to its team.

  1. Document Intelligence, Speech and Translator

Document Intelligence at online check-in. The prebuilt identity document model reads a passport and returns structured fields with their confidence level:

var di = new DocumentIntelligenceClient(
    new Uri("https://ai-contoso-pro.cognitiveservices.azure.com/"),
    new DefaultAzureCredential());

var operation = await di.AnalyzeDocumentAsync(
    WaitUntil.Completed, "prebuilt-idDocument", BinaryData.FromStream(passportImage));
var doc = operation.Value.Documents[0];

foreach (var field in new[] { "FirstName", "LastName", "DocumentNumber", "DateOfExpiration" })
{
    var value = doc.Fields[field];
    // Business threshold: below 0.85 a person confirms the value
    var needsReview = value.Confidence < 0.85;
    Console.WriteLine($"{field}: {value.Content} ({value.Confidence:P0}) review={needsReview}");
}

The confidence threshold is a business decision, not a technical one. Contoso sets it at 0.85 for the fields that go into the booking system, and below that the value is shown to the passenger to confirm. A misread passport means a passenger who does not board.

AI Speech for the boarding announcements. Neural text to speech generates the audio in several languages from a piece of text, and it is controlled in fine detail with SSML — rate, pauses and, above all, correct pronunciation of flight codes and gate numbers, which is where synthetic voices usually fall down. Contoso generates the audio once per combination of flight, gate and language and caches it in sttarjetascontosopro: announcements repeat, and regenerating them every time would mean paying the same charge a thousand times.

Translator for the portal. It translates dynamic content — fare descriptions, notices, terms — into several languages in a single call. Two precautions: legal content and conditions of carriage are not published with machine translation without review, and Contoso's own terms are pinned with a custom dictionary, so that "Contoso Miles" does not come back as "Contoso Millas" on half the pages.

  1. Azure OpenAI Service and Azure AI Foundry

Azure OpenAI Service offers OpenAI's models inside Azure, with everything that implies: your data stays in your resource and in your region, it is not used to train the models, and RBAC, private networking and logging apply just as they do to any other resource. Azure AI Foundry is the unified portal and SDK from which you explore models, deploy them, try them out in a playground, evaluate them and monitor them.

az cognitiveservices account create -g rg-contoso-reservas-pro -n oai-contoso-pro \
  --kind OpenAI --sku S0 --location swedencentral --custom-domain oai-contoso-pro \
  --tags entorno=produccion proyecto=contoso-reservas centro-coste=CC-1042 \
         [email protected]

# One deployment = one model with its assigned capacity
az cognitiveservices account deployment create -g rg-contoso-reservas-pro \
  -n oai-contoso-pro --deployment-name asistente-pasajero \
  --model-name <model> --model-version <version> --model-format OpenAI \
  --sku-name Standard --sku-capacity 30

Note that the model and the version are left as placeholders on purpose. The catalog of available models changes constantly: new versions appear, others are retired with an end-of-life date, and availability varies by region and by deployment type. Always check the official documentation before pinning a model, and pin the version explicitly in production rather than letting it update itself, because a model change can alter the assistant's behavior overnight. The sku-capacity is expressed in thousands of tokens per minute and is your throughput limit: exceeding it returns 429.

  1. Retrieval-augmented generation (RAG)

Contoso wants an assistant that answers passengers about baggage, fares, pets and ticket changes. Everybody's first idea is "train the model on our documents". That is not how it is done, and for four solid reasons: it is expensive and slow, it has to be repeated every time the terms change, the resulting model cannot cite the source of what it says, and there is no way to apply permissions — a model trained on internal documents will reveal them to anyone who asks the right way.

The solution is RAG: you do not change the model, you give it the right context on every question.

graph LR
  DOC["Conditions of carriage,<br/>fares, baggage policies"] --> IDX["Indexing:<br/>chunk + embed"]
  IDX --> AIS["Azure AI Search<br/>srch-contoso-conocimiento-pro<br/>hybrid + vector index"]
  P["Passenger:<br/>Can I take my cat in the cabin?"] --> EMB["Embed the question"]
  EMB --> AIS
  AIS -->|"3-5 most<br/>relevant chunks"| PR["Build the prompt:<br/>instructions + chunks + question"]
  PR --> LLM["Azure OpenAI<br/>asistente-pasajero"]
  LLM --> R["Answer with<br/>a source citation"]
  R --> CS["Content Safety<br/>+ threshold review"]

The flow, step by step:

  1. Indexing (offline): the documents are split into chunks of a few hundred words with overlap, each chunk is turned into an embedding vector and stored in the index alongside the original text and its metadata.
  2. Retrieval: the passenger's question is embedded with the same model and the nearest chunks are searched for. Hybrid search — vector plus keyword, with semantic reranking — works clearly better than either on its own, because the vector side captures meaning and the lexical side nails exact terms like "CA-1187" or "23 kg".
  3. Generation: the prompt is built with strict instructions — "answer only with the information provided; if it is not there, say so and offer a human contact" — the retrieved chunks and the question.
  4. Answer with a citation: the model states which chunk each assertion comes from, and there is the key difference from retraining: the answer is verifiable.

The retrieval piece is Azure AI Search (srch-contoso-conocimiento-pro), with vector and hybrid search and security filters so that a passenger never retrieves internal chunks. But there is an alternative Contoso already has in-house: the pgvector extension of psql-contoso-tripulaciones-pro, mentioned in 03-05, lets you store embeddings and search by similarity in the same database where the crew data already lives. The decision:

Azure AI Search pgvector in PostgreSQL
Hybrid search and semantic reranking Yes, built in Manual
Automatic ingestion and indexing Yes, with indexers You build it
The data is already there No: it has to be copied Yes
Filters alongside relational data Limited Full SQL query
Cost A separate service Included in the database

Practical rule: if the knowledge is documents, AI Search; if it is rows that already live in your database and the volume is moderate, pgvector. Contoso uses AI Search for the conditions of carriage, and pgvector for similarity search over crew profiles, where the relational filter — current certifications, home base, available hours — matters as much as the similarity does.

  1. Azure Machine Learning: its own territory

When the problem does not have a ready-made service, you have to train. Contoso wants to predict seat demand by route and date in order to adjust fares, and that depends on its own historical data: nobody sells a service that knows it.

Azure Machine Learning covers that full cycle — notebooks, experiments, distributed training on compute clusters, a registry for models and datasets, managed endpoints for inference and model drift monitoring — and it fits with what you already know: the data comes out of stlagocontosopro, training is launched from a pipeline and the model is registered with a version. It is a world of its own, with its own learning curve, and here you only need to hold on to the criterion: ready-made services for generic capabilities, Azure ML when the value is in your data. Its biggest cost, moreover, is training compute: shut the clusters down or configure them to scale to zero nodes, because a forgotten GPU cluster left running is one of the most expensive bills you can generate in Azure.

  1. Responsible AI: the part that is not optional

Everything above has a precondition. Contoso cannot put an assistant in front of passengers or a classifier in charge of complaints without having settled this, and not out of bureaucracy: because the risks are real and they affect people.

Bias. Models learn from historical data and reproduce its inequalities. A complaints classifier trained on past decisions inherits the biases of whoever made them; speech recognition works less well with accents that are under-represented in the training data, and in an airport that means worse service for some of the passengers. You have to measure performance by segment, not just overall accuracy, because a good average can hide a badly served group.

Hallucinations. A generative model produces plausible text, not true text. If the assistant states with complete confidence that a passenger can carry 32 kg when the limit is 23, that passenger arrives at the desk with a problem and a screenshot. Hence RAG with strict instructions, mandatory citations, an explicit "I do not know" answer and never a claim about money, rights or documentation without a verifiable source.

Privacy and data residency. Everything sent to an AI service leaves your application. Passports, complaints and conversations contain personal data and, sometimes, special category data — health data, in a complaint about medical assistance. The concrete obligations: set the resource's region in line with the residency policy; minimize and anonymize before sending, stripping out anything the task does not need; understand the platform's logging and request the exemption from human content monitoring when the case justifies it and it is approved; do not send data about minors or special category data without an explicit legal basis; and set the retention, bearing in mind that the data indexed in AI Search is a copy that also has to be governed and deleted when the time comes.

Content filter. Azure OpenAI applies harmful content filtering on input and output by default, with configurable levels, and Content Safety lets you add checks of your own. Do not turn it off: it is the last barrier against an attempt to manipulate the assistant or an inappropriate response to an upset passenger.

Human oversight. In any decision that affects a person, the system proposes and a person decides. Denying compensation, rejecting an identification at check-in or classifying a complaint as inadmissible cannot be automatic, final decisions. The correct design is: the AI prioritizes and pre-fills, the agent confirms, and there is always a route to talk to a human.

Framework and compliance. Microsoft's Responsible AI framework — fairness, reliability and safety, privacy, inclusiveness, transparency and accountability — translates into concrete artifacts: impact assessment, the service's Transparency Notes, adversarial testing before release and continuous monitoring. On the legal side, the GDPR requires a legal basis, information for the data subject, minimization and a response to access and erasure rights; and the EU AI Act classifies systems by risk, with reinforced obligations for high-risk ones and, for any system that interacts with people, the obligation to disclose that they are talking to an AI. Using facial recognition at boarding is precisely the case that falls into the most demanding category.

Contoso's operating rule, and the one to take away from this lesson: nothing that uses AI reaches production without prior review by the legal and compliance team, with documentation of what data is sent, to which service, in which region, with what retention, what decisions the system makes and which ones belong to a person. It is not a formality: it is the difference between a project that survives its first audit and one that has to be switched off.

  1. Cost per token and per transaction

Two billing models coexist. The AI Services charge per transaction — per document, per image, per million characters, per hour of audio — with a limited free tier. Azure OpenAI charges per token, counting both input and output, with different prices for each.

What drives the bill up without anyone seeing it coming is almost always the same. In RAG, the context: if every question sends ten long chunks plus a twenty-turn conversation history, each question costs as much as twenty simple ones. Retry loops against an expensive model. Regenerating what has not changed, such as synthesizing the same boarding announcement a thousand times. And Azure ML training clusters left running.

How to keep it under control: cache aggressively whatever is deterministic (voice announcements, translations of stable content); limit the number of chunks and summarize the history instead of dragging it along in full; use a small model for simple tasks and reserve the large one for what really needs it; set max_tokens on the output; apply per-deployment quotas and budget alerts on rg-contoso-reservas-pro (module 8); and in development, use the free tier and delete the resources when you are done. An unused AI Services resource costs almost nothing, but an Azure OpenAI deployment with provisioned throughput bills for reserved capacity whether it is used or not.

Common Mistakes and Tips

  • Using keys instead of Entra ID. They end up in a repository. disableLocalAuth and DefaultAzureCredential.
  • Treating the model's confidence as certainty. Set business thresholds and route anything below them to human review.
  • Trying to "train the model on our data" when what is needed is RAG. Expensive, slow, with no citations and no permissions.
  • Sending personal data without minimizing it or checking the region. That is a data protection incident, not a technical mistake.
  • Pinning the model with no version and then discovering that the assistant changes behavior on its own.
  • Dragging the entire conversation history into every call. The cost grows quadratically with the conversation.
  • Turning off the content filter so that it "stops getting in the way". It is the last barrier.
  • Leaving an Azure ML training cluster running. Scale to zero nodes, always.
  • Tip: save the assistant's unanswered questions. They are the best list of what is missing from the knowledge base.
  • Tip: measure quality with a reference set of questions and correct answers, and run it again on every model or system prompt change. Without that, "it works better" is an opinion.

Exercises

Exercise 1. Contoso Miles wants an assistant that answers members about their miles balance, the program's terms and how to redeem rewards.

  1. Design the architecture, stating which part is RAG, which part is a data lookup and why they are not solved the same way.
  2. Choose between Azure AI Search and pgvector for each type of content and justify it.
  3. List five responsible AI requirements you would impose before releasing it, and the resource tags.

Exercise 2. The complaints classifier has been in production for a month. Overall accuracy is 91%, but the baggage team complains about receiving complaints that are not theirs, and an audit finds that complaints written in Catalan are classified worse than those written in Spanish.

  1. Why does the overall 91% accuracy not contradict either complaint?
  2. Propose how to diagnose each problem and how to correct it.
  3. What design safeguard should have been there from the start?

Exercise 3. The passenger support assistant tells a passenger that they are entitled to 600 EUR of compensation for their delay. The figure is wrong: they are entitled to 250 EUR.

  1. Explain the two possible technical failures.
  2. Give three concrete measures that would have stopped that answer ever being issued.
  3. What are the legal and compliance consequences, and who should have reviewed it?

Solutions

Solution 1:

  1. These are two different problems. The miles balance is a specific piece of data about an identified member: it is resolved with an API call to Contoso Miles, authenticated as that member, and the model only writes the answer around the value it receives. It must never come out of an index or out of the model's memory, because it would be personal data retrievable by others and probably out of date. The program's terms and reward redemption are stable documentation: that is RAG, with citable chunks. The architecture is an assistant with two routes: tool use for the personal data, retrieval for the general knowledge.
  2. Azure AI Search for the terms and the rewards catalog: they are documents, they benefit from hybrid search and semantic reranking, and there are indexers that keep them up to date. pgvector if a similarity search were added over data that already lives in a relational database — finding rewards similar to one that has sold out, for example, combining similarity with availability and category filters — because there the SQL query alongside the vector is what does the work.
  3. (a) Explicitly disclosing that they are talking to an AI, required by the EU AI Act. (b) Citing the source on every claim about terms or rights, and answering "I do not know" with a handover to an agent when there is no chunk to back it up. (c) The content filter active on input and output. (d) No automatic final decision about redemptions or complaints: the AI proposes and a person confirms. (e) Data minimization: send the model no more personal data than is strictly necessary, with the region set and a defined, documented retention. All of it reviewed by legal and compliance before release. Tags: entorno, proyecto=contoso-millas, centro-coste=CC-2077 and propietario.

Solution 2:

  1. Because overall accuracy is an average that hides the distribution. A general 91% is compatible with 97% on the majority categories and 60% on baggage if that category is a minority; and it is compatible with 93% in Spanish and 70% in Catalan if Catalan is a small fraction of the volume. A good average can hide a systematically badly served group, and that is exactly the mechanism by which bias goes unnoticed.
  2. Diagnosis: a confusion matrix per category to see what baggage is being confused with, and metrics segmented by language on a balanced evaluation set. Fixing the first problem: review the baggage training examples — probably few or badly labeled — add representative cases, especially the borderline ones with delays, and retrain. Fixing the second: bring real Catalan complaints into the training set, evaluate the upstream language detection, and consider a model per language or upfront translation if the volume is not enough to train well.
  3. Segmented metrics from day one, with an evaluation set that represents every language and category, and a minimum threshold per segment — not just overall — as the release criterion. And, alongside it, a feedback route: let the receiving team flag a complaint as misclassified, generating improvement data instead of grievances.

Solution 3:

  1. (a) Hallucination: retrieval did not find the right chunk and the model filled in from general knowledge — European regulation does provide for 600 EUR on certain distance bands — with no basis in Contoso's documentation. (b) Incorrect retrieval: the wrong chunk was retrieved, the long-haul one instead of the one that applies to that distance for example, and the model answered correctly from an erroneous source. The second is more frequent and more dangerous, because the answer arrives with a citation and looks verified.
  2. (a) Take the calculation out of the model: the compensation is computed with the CalcularCompensacion function from 06-03, which applies the rules deterministically, and the model only writes up the result. A legally binding amount must never be generated by a language model. (b) An explicit instruction not to give compensation figures and always to hand over to that tool or to an agent. (c) Detection of sensitive patterns — amounts, rights, documentation — in the output, forcing human review before it is sent, with a notice that the answer is informational and not binding.
  3. Consequences: a legitimate expectation has been created in the passenger, with a risk of a claim and of a penalty for misleading information; in terms of consumer protection and the EU AI Act, it is a system that misinforms people about their rights, with transparency and oversight obligations that have not been met. The legal and compliance team should have reviewed it before release, defining which questions the assistant may answer and which are handed over to a human without exception; and the product team should have run adversarial testing with borderline compensation cases before exposing it to real passengers.

Conclusion

You now know the Azure AI Services catalog and how it is organized — vision, speech, language, documents, search and decision — and the common consumption model: a multi-service resource like ai-contoso-pro with its endpoint, and the choice that admits no shortcuts, authentication with Entra ID and a managed identity instead of keys, with disableLocalAuth to close the door completely. You have implemented Contoso's four cases: AI Language classifying complaints, measuring sentiment and extracting the flight number, with a critical reading of the confidence levels; Document Intelligence reading the passport at check-in with a business threshold that routes to human review; AI Speech generating cached multilingual boarding announcements; and Translator with its two precautions, legal content and a dictionary of proprietary terms.

You know what Azure OpenAI Service and Azure AI Foundry are, how a model is deployed with its capacity, and that the catalog changes constantly: check the documentation and pin the version in production. You have a solid grasp of retrieval-augmented generation: why you do not retrain a model on company data — cost, freshness, the absence of citations and of permissions — how the indexing, retrieval, generation and citation cycle works, why hybrid search wins, and when to use Azure AI Search rather than pgvector in psql-contoso-tripulaciones-pro. And you place Azure Machine Learning in its territory: training custom models when the value is in your data, such as seat demand prediction, with its clusters switched off. All of it with the responsible AI warning that runs through the lesson — bias that an average hides, hallucinations that turn into promises to a passenger, the privacy and residency of the data you send, the content filter, human oversight in every decision that affects people, Microsoft's framework, the GDPR and the EU AI Act — and its operating rule: nothing reaches production without prior review by legal and compliance. Plus the cost per token and per transaction, and what drives it up.

That closes module 6, and it is worth looking back. Contoso Airlines came in with an availability engine trapped on a virtual machine and comes out with an unrecognizable platform: that engine packaged into a container, published to acrcontosopro and running on Container Apps with scale to zero; a flight operations platform on AKS with workload identity and not a single secret; boarding pass issuing and fare synchronization solved with event-driven Azure Functions protected by idempotency; the integrations with email, text messaging, Teams and the incident system built as Logic Apps workflows the operations team can understand; a messaging and events architecture with Service Bus, Event Grid and Event Hubs that has decoupled the purchase from everything peripheral; and AI capabilities that were impossible one module ago. The platform now does far more things, and it does them across far more pieces.

And that is precisely the problem that opens what comes next. A system this distributed — container revisions, pods, ephemeral functions, workflows, queues, topics, partitions and calls to AI services — is impossible to operate blind. When a passenger says "I have paid and my boarding pass has not arrived", nobody will be able to answer by looking at a server: you will have to follow that booking's trail through six components. Module 7, Monitoring and management, deals with exactly that: metrics, alerts and dashboards with Azure Monitor, KQL queries over log-contoso-pro, end-to-end traces with Application Insights, automation of operational tasks with Azure Automation and, finally, backup and disaster recovery, because a platform you cannot restore is not finished.

Azure Course

Module 1: Introduction to Azure

Module 2: Core Azure Services

Module 3: Azure Databases

Module 4: Security in Azure

Module 5: Azure DevOps

Module 6: Advanced Azure Services

Module 7: Monitoring and Management

Module 8: Cost Management and Optimization

Module 9: Case Studies and Best Practices

© Copyright 2026. All rights reserved