Skip to main content

Azure Developer Interview Questions (2026 Guide)

Azure Developers are the builders of the cloud. They design, code, and deploy applications that leverage the full breadth of Azure services. Unlike traditional developers who might simply deploy to a virtual machine, Azure Developers think in terms of serverless, managed services, and infrastructure‑as‑code from day one. This guide prepares you for the modern Azure Developer interview, focusing on real‑world engineering, cloud‑native patterns, and the practical integration of AI services.

The 2026 Azure platform has evolved into a deeply integrated ecosystem with Microsoft Foundry unifying AI capabilities, and cloud‑native development patterns becoming the standard. You will be expected to demonstrate proficiency in building resilient, secure, and cost‑effective applications using Azure Functions, App Service, Container Apps, API Management, and more.

Who should read this guide:

  • Backend and full‑stack developers moving into Azure cloud roles
  • Cloud engineers preparing for developer‑focused interviews
  • Candidates targeting the AZ‑204 certification with a practical orientation
  • Experienced developers wanting to validate their Azure application design skills

Interview evaluation areas:

  • Azure compute and service selection (Functions, App Service, Containers)
  • API design, integration, and security
  • Data storage strategies (SQL, NoSQL, Blob Storage)
  • Messaging and event‑driven architectures
  • Identity, authentication, and secret management
  • DevOps, CI/CD, and infrastructure as code
  • Monitoring, logging, and production troubleshooting
  • Modern AI application development with Azure OpenAI and Microsoft Foundry

Azure Developer Role and Responsibilities

An Azure Developer is responsible for building cloud‑native applications and services on the Microsoft Azure platform. This includes selecting the appropriate Azure services, writing the code that integrates them, implementing security and identity, and ensuring the solution is observable and maintainable.

Typical day‑to‑day responsibilities:

  • Application Development: Write and maintain business logic using languages like C#, Java, Python, JavaScript/TypeScript.
  • API Development: Design and implement RESTful APIs, often fronted by Azure API Management for security, throttling, and versioning.
  • Service Integration: Wire together Azure services (e.g., Azure Functions triggered by Service Bus, or an App Service using Managed Identity to access Azure SQL).
  • Security Implementation: Implement authentication (OAuth 2.0, OpenID Connect) with Microsoft Entra ID, and use Managed Identity instead of connection strings.
  • Configuration Management: Externalize all settings using Azure App Configuration and Key Vault, never hardcoding secrets.
  • Monitoring and Logging: Instrument code with Application Insights, set up structured logging, and create dashboards for key metrics.
  • Deployment Automation: Use GitHub Actions or Azure DevOps to create CI/CD pipelines that build, test, and deploy to Azure using infrastructure as code (Bicep/Terraform).
  • Performance and Cost Optimization: Right‑size services, implement caching, and leverage serverless consumption plans to minimize waste.

Azure Developer vs Azure Solution Architect vs Azure Administrator

RolePrimary FocusTypical Responsibilities
Azure DeveloperCode, application logic, service integrationWrite functions, APIs, integrate databases, implement auth, build CI/CD
Azure Solution ArchitectHigh‑level system design, business alignmentDefine architecture, select services, ensure compliance, cost governance
Azure AdministratorOperations, infrastructure, governanceManage resources, configure networking, monitor, backup, identity

Azure Developer Architecture Overview

A modern Azure application typically follows a layered, cloud‑native architecture. Understanding this is crucial for answering design and scenario questions.

This diagram illustrates:

  • Global entry point: Front Door or Application Gateway for routing and WAF.
  • API gateway: API Management handles auth, throttling, and routing to backend services.
  • Compute layer: A mix of long‑running apps (App Service), event‑driven functions (Azure Functions), and containerized microservices (Container Apps/AKS).
  • Data & messaging: Polyglot persistence with SQL for transactions, Cosmos DB for scale, Redis for cache, and queues for asynchronous decoupling.
  • Security: Identity flows centrally through Entra ID; all service‑to‑service calls use Managed Identity.
  • Observability: Unified monitoring via Application Insights.

Azure Developer Interview Questions

Organized by technical domain, each question includes a concise answer, detailed explanation, and a typical follow‑up.

Azure Application Development Fundamentals (10 Questions)

Q1: How does cloud development differ from traditional on‑premises development?

  • Short Answer: Cloud development favors managed services, stateless design, and infrastructure as code. Instead of managing servers, you focus on application logic and rely on platform capabilities for scaling, resilience, and security.
  • Detailed Explanation: Traditional development often involved deploying monolithic WAR/EAR files to application servers on VMs. Cloud development breaks these into microservices or functions, leverages PaaS (App Service, Functions, Container Apps), and treats infrastructure as disposable and automated. Configuration is externalized, secrets are never in code, and everything is instrumented for observability from day one.
  • Code Consideration: Use Azure SDKs (like Azure.Identity and service‑specific libraries) to authenticate via Managed Identity, not connection strings.
  • Follow‑up Question: “How would you migrate a traditional monolithic .NET app to Azure?” (Answer: Start by containerizing and deploying to App Service or Container Apps, gradually extracting modules into separate services as needed.)

Q2: What is Azure Resource Manager (ARM) and how do developers interact with it?

  • Short Answer: ARM is the deployment and management service for Azure. It provides a unified API layer for all Azure operations. Developers interact with it via Azure CLI, SDKs, and infrastructure‑as‑code tools like Bicep or Terraform.
  • Detailed Explanation: When you deploy an App Service via the portal, it's calling the ARM REST API. For repeatability, developers define their desired infrastructure in declarative templates (Bicep) and deploy them via pipelines. The ARM API ensures consistency and role‑based access control across all services.
  • Code Consideration: Using Azure SDK Azure.ResourceManager allows programmatic management of resources from within an application, such as creating a new storage container during a provisioning workflow.
  • Follow‑up Question: “What is the difference between ARM templates and Bicep?” (Answer: Bicep is a domain‑specific language that transpiles to ARM JSON. It offers cleaner syntax, better modularity, and tooling support compared to raw JSON.)

Q3: Explain the role of Azure App Configuration in modern applications.

  • Short Answer: Azure App Configuration centralizes feature flags and application settings, allowing dynamic configuration changes without restarting or redeploying applications.
  • Detailed Explanation: Instead of storing settings in appsettings.json or environment variables, you can point your application to App Configuration. This service syncs settings in near‑real‑time, and you can use it to toggle features on/off without a full deployment. It integrates with Managed Identity and Key Vault to securely reference secrets.
  • Code Consideration: In a .NET app, builder.Configuration.AddAzureAppConfiguration() enables dynamic refresh. Use sentinel keys to control when refresh should occur.
  • Follow‑up Question: “How do you handle a scenario where a configuration change breaks the app?” (Answer: Use the revision history in App Configuration to revert to a previous state, and have a health check that alerts on bad configs.)

Q4: How do you manage multiple environments (dev, test, prod) as an Azure developer?

  • Short Answer: Use separate Azure subscriptions or resource groups, paired with environment‑specific configuration stored in App Configuration. Infrastructure as Code (Bicep) uses parameter files to adjust sizes and tiers per environment.
  • Detailed Explanation: Never reuse the same resources for dev and prod. Use a subscription or resource group per environment. In your CI/CD pipeline, deploy the same artifacts (container images, zip packages) but use environment‑specific configuration. For example, production uses Provisioned Throughput for Azure OpenAI, while dev uses pay‑as‑you‑go. All secrets are separate Key Vaults.
  • Code Consideration: Use ASPNETCORE_ENVIRONMENT or custom environment variables to load the correct App Configuration label.
  • Follow‑up Question: “How do you avoid accidentally deploying to production?” (Answer: Use manual approval gates in your release pipeline and limit production deployment permissions to a service principal, not individual developers.)

Q5: What is dependency injection, and why is it critical for cloud‑native Azure development?

  • Short Answer: Dependency injection (DI) is a pattern where objects receive their dependencies from an external source rather than creating them internally. In Azure, DI is fundamental for injecting configured service clients (like BlobServiceClient or IConfiguration), making code testable and secure.
  • Detailed Explanation: Azure SDK clients are designed to be long‑lived. You register them in the DI container at startup using methods like AddAzureClients or AddSingleton<BlobServiceClient>. This centralizes configuration (like the Managed Identity token provider), allowing your business logic to remain clean. For example, you never need to pass a connection string into a service class; the BlobServiceClient is just injected and ready.
  • Code Consideration: .NET’s built‑in DI container is suitable for most workloads. For Azure Functions, you use FunctionsStartup to configure the service provider.
  • Follow‑up Question: “How would you inject different storage accounts for different operations within the same app?” (Answer: Register multiple named BlobServiceClient instances and inject by name using a factory pattern.)

Q6: Describe the Azure SDK authentication flow using DefaultAzureCredential.

  • Short Answer: DefaultAzureCredential is the recommended way to authenticate to Azure services. It tries a chain of credential types (environment variables, Managed Identity, Visual Studio, Azure CLI) until one succeeds, making it easy to run the same code locally and in Azure without code changes.
  • Detailed Explanation: In a development environment, DefaultAzureCredential typically uses the developer’s Azure CLI credentials. Once deployed to an App Service or Container App with a Managed Identity, it automatically detects and uses that identity. This eliminates the need for conditional compilation or configuration switches. The developer only ensures the identity has the correct RBAC role on the target resource.
  • Code Consideration: var client = new BlobServiceClient(new Uri("https://..."), new DefaultAzureCredential());
  • Follow‑up Question: “What if you need to use a specific user‑assigned Managed Identity?” (Answer: Pass the client ID to DefaultAzureCredential options, or use new ManagedIdentityCredential(clientId).)

Q7: How do you implement application health checks in Azure?

  • Short Answer: Expose a /health endpoint that performs shallow checks (app is running) and deep checks (database connectivity, downstream services). Register it with Azure App Service Health checks or Container Apps Health probes so Azure can route traffic only to healthy instances.
  • Detailed Explanation: A shallow health check returns 200 as long as the app responds. A deep health check pings a database or message queue. In App Service, you configure a path like /health in the portal; the platform will ping it and remove unhealthy instances from the load balancer. For Container Apps, configure liveness, readiness, and startup probes. Applications can also use the Health Checks middleware to report status to monitoring.
  • Code Consideration: In .NET, services.AddHealthChecks().AddDbContextCheck<AppDbContext>().AddUrlGroup(...).
  • Follow‑up Question: “How do you distinguish between a failing dependency and a transient issue?” (Answer: Implement a threshold; only report unhealthy after a certain number of consecutive failures. Use circuit breaker patterns.)

Q8: What is Azure CLI and how do you use it in development workflows?

  • Short Answer: Azure CLI is a cross‑platform command‑line tool for managing Azure resources. Developers use it for quick tasks (fetching connection strings, viewing logs), scripting, and in CI/CD pipelines.
  • Detailed Explanation: It provides commands like az webapp up to quickly deploy from a local folder, or az acr build to build a container image in ACR. It is often used to set up a developer’s environment (creating a resource group and services) via a script, ensuring consistency. In automation, it’s used in conjunction with Bicep for deployment.
  • Code Consideration: Commands like az account show can validate that you’re operating in the correct subscription before a script continues.
  • Follow‑up Question: “Azure PowerShell vs Azure CLI?” (Answer: Azure CLI is cross‑platform and idiomatic for Linux/Mac, PowerShell provides deeper Windows integration and is preferred by many ops teams.)

Q9: How do you keep your application code loosely coupled when integrating multiple Azure services?

  • Short Answer: Use abstractions and dependency injection. Hide service‑specific details behind interfaces (e.g., IOrderQueue), and rely on messaging (Service Bus, Event Grid) to decouple components instead of direct HTTP calls.
  • Detailed Explanation: Rather than calling the Azure Service Bus SDK directly in your order processing logic, define an IOrderQueue with methods like SendAsync(Order). Implement it with a Service Bus client. This allows you to replace the queue with Event Hubs or a storage queue later without changing business logic. For inter‑service communication, prefer asynchronous messaging, so the caller doesn’t need to know the receiver’s endpoint or availability.
  • Code Consideration: Follow the Mediator or CQRS patterns to further decouple command and query logic.
  • Follow‑up Question: “How do you handle failure of the message broker?” (Answer: Implement a retry policy and, if the broker is down, store the message locally and send it when the broker recovers (outbox pattern).)

Q10: What is a Cloud‑Native application, and what are its key characteristics?

  • Short Answer: A cloud‑native application is designed specifically for cloud platforms, leveraging managed services, declarative infrastructure, elastic scale, and continuous delivery. Key characteristics include containerization, statelessness, API‑first design, and resilience.
  • Detailed Explanation: The Cloud Native Computing Foundation defines it: containerized, dynamically orchestrated, and microservices‑oriented. On Azure, this often means running in AKS or Container Apps, using Cosmos DB for global data, and implementing a service mesh for communication. The “Twelve‑Factor App” principles are the baseline: one codebase, strict separation of config, backing services treated as attached resources, etc.
  • Code Consideration: Every cloud‑native app should implement graceful shutdown and rely on health checks for orchestration.
  • Follow‑up Question: “Is serverless (Azure Functions) cloud‑native?” (Answer: Yes, it aligns with cloud‑native principles: event‑driven, auto‑scaling, and you don’t manage servers, focusing purely on business logic.)

Azure App Service Interview Questions (10 Questions)

Q1: What is Azure App Service, and when would you use it?

  • Short Answer: Azure App Service is a fully managed platform for hosting web applications, RESTful APIs, and mobile backends. Use it when you need a managed HTTP‑based service with built‑in scaling, SSL, and authentication, without managing underlying VMs.
  • Detailed Explanation: App Service supports .NET, Java, Node.js, Python, and PHP. It handles OS patching, load balancing, and auto‑scale. It’s ideal for standard web apps and APIs where you don’t need container orchestration. It also provides features like deployment slots, easy custom domain binding, and tight integration with Azure DevOps/GitHub.
  • Code Consideration: Deployment can be done via az webapp up, ZIP deploy, or running from a package. Use application settings to configure environment variables.
  • Follow‑up Question: “What are the limitations of App Service?” (Answer: Limited to Windows or Linux VMs in a shared environment; 14 GB memory, 4 vCPU max. Long‑running processes may be killed after idle timeout. For heavy compute or custom networking, consider Container Apps or AKS.)

Q2: How do deployment slots work in App Service, and why are they valuable?

  • Short Answer: Deployment slots are live instances of your app with their own hostname. You can deploy to a staging slot, warm it up, test, and then swap with production, achieving zero‑downtime deployment.
  • Detailed Explanation: A typical CI/CD flow: deploy a new version to the “staging” slot. The slot warms up, and you can run automated acceptance tests against its unique URL (e.g., myapp-staging.azurewebsites.net). When ready, you trigger a swap, which exchanges the environment settings and traffic routing between staging and production. If issues are detected after swap, you can swap back instantly.
  • Code Consideration: Use WEBSITE_SWAP_WARMUP in your application code to handle warm‑up requests from the platform before the slot receives production traffic.
  • Follow‑up Question: “How does configuration bind to slots?” (Answer: Some application settings can be marked as “sticky to the slot,” meaning they don’t travel during a swap (e.g., a staging database connection string). This prevents staging config from accidentally overwriting production config.)

Q3: How do you secure an Azure App Service?

  • Short Answer: Enable HTTPS‑only, use Managed Identity for outbound calls, restrict inbound IPs if needed, and integrate with Azure AD for authentication. Never store secrets in code; use Key Vault references in application settings.
  • Detailed Explanation: In the Azure portal or via Bicep, set httpsOnly: true. For inbound, use IP restrictions or a frontend like Front Door with a private endpoint (App Service Private Endpoints are available for Premium plans). For outbound, use VNet integration to route traffic through your VNet and leverage Managed Identity to access Azure SQL or Storage. For user authentication, enable “Easy Auth” to authenticate against Entra ID, Google, etc., without writing code.
  • Code Consideration: @Microsoft.KeyVault(VaultName=myvault;SecretName=mysecret) in application settings for secure value injection.
  • Follow‑up Question: “What is the difference between App Service Authentication and implementing OAuth manually in code?” (Answer: App Service Auth is a front‑gate, catching unauthenticated requests before they hit your code. Manual implementation gives you more control over token validation and custom policies.)

Q4: App Service vs Azure Container Apps: How do you choose?

  • Short Answer: App Service is best for straightforward web apps and APIs with easy deployment and management. Container Apps is for microservices, event‑driven processing, and when you need more control over Docker images, scaling rules, and networking.
  • Detailed Explanation: App Service is a managed platform optimized for HTTP workloads with a simple developer experience. Container Apps builds on top of Kubernetes and supports any container, KEDA‑based scaling, and Dapr for microservices patterns. If your application is a standard REST API, App Service will suffice. If you need to run background workers, have multiple containers in a pod, or require event‑driven auto‑scaling (0‑N), Container Apps is the better choice.
  • Code Consideration: Both support managed identity and VNet integration. Container Apps allow you to define scaling rules based on HTTP traffic, queue length, or custom metrics.
  • Follow‑up Question: “Can I run a non‑HTTP service in App Service?” (Answer: Yes, a WebJob runs as a background process alongside your web app, but it’s limited. Container Apps or Functions are better for background processing.)

Q5: How do you auto‑scale an App Service application?

  • Short Answer: Enable App Service auto‑scale by configuring scale‑out rules based on metrics like CPU percentage, memory, or HTTP queue length. Set minimum and maximum instance counts.
  • Detailed Explanation: In the App Service Plan, you create a scaling rule: e.g., “if CPU > 70% for 10 minutes, increase instances by 1.” You also set scale‑in rules to cool down. Scaling is horizontal (more instances). It’s not instantaneous; it takes a few minutes to spin up new instances. Pre‑warming (using WEBSITE_SWAP_WARMUP) helps. For predictable high traffic, you can schedule scaling at specific times.
  • Code Consideration: Ensure your app is stateless. Use a distributed cache (Redis) to share session state across instances.
  • Follow‑up Question: “How does auto‑scale handle sudden, massive traffic spikes?” (Answer: It might not react fast enough. Use a combination of over‑provisioning during known events, or front the app with Azure Front Door and its caching capabilities to absorb the spike.)

Q6: Explain VNet integration for App Service.

  • Short Answer: VNet integration allows an App Service to access resources inside an Azure Virtual Network securely, without exposing them to the public internet. Outbound traffic from the app can be routed to the VNet.
  • Detailed Explanation: For regional VNet integration, the App Service is delegated a subnet in your VNet. The app then uses a private IP from that subnet for outbound connections. This allows the app to reach a database via a Private Endpoint. It doesn’t give a private IP for inbound traffic to the app itself (unless you use a Private Endpoint for App Service on Premium tier).
  • Code Consideration: Ensure your app settings and connection strings use the private endpoint DNS names. The SDK picks up the resolution automatically if DNS is correctly configured.
  • Follow‑up Question: “What is the difference between regional VNet integration and gateway‑required VNet integration?” (Answer: Regional is newer and doesn’t require a VPN gateway. Gateway VNet integration is legacy and uses a point‑to‑site VPN.)

Q7: How do you configure custom domain and TLS/SSL on App Service?

  • Short Answer: Add a custom domain in the Azure portal, verify ownership via DNS TXT record, and then upload or generate a free managed certificate for TLS binding.
  • Detailed Explanation: App Service Free tier doesn’t support custom domains. Basic and above allow binding a custom domain. After adding, you create an A record (or CNAME for non‑root) pointing to the app’s IP. For SSL, the App Service Managed Certificate (free) can be issued for the domain. It auto‑renews. You set the TLS/SSL binding to HTTPS only. Application Gateway or Front Door can also terminate TLS.
  • Code Consideration: If using a reverse proxy, ensure X‑Forwarded‑For and other headers are properly handled by your application.
  • Follow‑up Question: “How do you enforce TLS 1.2 minimum?” (Answer: In the TLS/SSL settings, set the minimum TLS version. This is a security best practice.)

Q8: What are Azure WebJobs and when would you use them?

  • Short Answer: WebJobs are background processes that run in the context of an App Service. Use them for batch processing, cleanup tasks, or continuous listening on a queue, without needing a separate service.
  • Detailed Explanation: There are two types: continuous (starts immediately and loops) and triggered (starts on a schedule or manually). They run alongside your web app, sharing the same resources and scale. However, they don’t auto‑scale independently. For heavy background processing, Azure Functions or Container Apps are more appropriate.
  • Code Consideration: The WebJobs SDK provides bindings to Service Bus, Blob, and more, similar to Azure Functions.
  • Follow‑up Question: “Why would you choose Azure Functions over WebJobs?” (Answer: Functions have independent scaling, more trigger types, and a consumption‑based pricing model. WebJobs are cheaper if you already have an App Service with spare capacity.)

Q9: How do you handle application configuration in a multi‑region deployment of App Service?

  • Short Answer: Use a centralized Azure App Configuration store. All App Service instances, regardless of region, connect to it. Use labels in App Configuration to manage region‑specific settings if necessary.
  • Detailed Explanation: You can have a single App Configuration store with key‑value pairs and labels like “NorthEurope” or “EastUS” if some settings must differ (e.g., a Cosmos DB endpoint in the same region). The app uses a geo‑identifier (from WEBSITE_SITE_NAME or custom env var) to select the correct label. The shared store reduces configuration drift.
  • Code Consideration: builder.Configuration.AddAzureAppConfiguration(options => options.Connect(connectionString).Select("*").Select("*", "NorthEurope").
  • Follow‑up Question: “What about latency when App Configuration is in a single region?” (Answer: The configuration is cached in the app after initial load, with periodic refresh. The latency is negligible.)

Q10: How do you troubleshoot a “503 Service Unavailable” error on App Service?

  • Short Answer: Check for resource exhaustion (CPU/Memory), check if the App Service Plan has hit instance limits, or if the site is in a stopped state. Use the Diagnose and Solve Problems blade and Application Insights.
  • Detailed Explanation: A 503 often means the front‑end load balancer cannot find a healthy worker. Reasons: all workers are busy due to a traffic spike (scale out), worker process crashed (out of memory), or the App Service Plan is over its limit. Check Application Insights for request queuing and performance counters. Enable “Always On” to prevent the app from unloading. Restart the app if necessary.
  • Code Consideration: Implement retry logic in your client to handle transient 503s.
  • Follow‑up Question: “How do you prevent 503s during deployment?” (Answer: Use deployment slots with swap, which avoids cold starts and downtime.)

Azure Functions Interview Questions (10 Questions)

Q1: What are Azure Functions, and what are the different hosting plans?

  • Short Answer: Azure Functions is a serverless compute service that runs code in response to events. Hosting plans: Consumption (pay per execution, auto‑scale), Premium (pre‑warmed, VNet integration), and Dedicated (App Service plan, always running).
  • Detailed Explanation: The Consumption plan scales to zero and you pay only for execution time and memory. It’s ideal for bursty, event‑driven workloads but has a cold start latency. The Premium plan keeps a minimum number of instances warm, provides VNet connectivity, and longer execution duration. The Dedicated plan runs on an App Service Plan and is essentially a function‑hosted WebJob with no serverless scaling benefits.
  • Code Consideration: Function code is triggered by bindings (HTTP, Timer, Blob, etc.). In Consumption, the functionTimeout is limited to 10 minutes.
  • Follow‑up Question: “When would you choose Premium over Consumption?” (Answer: When you need to avoid cold starts (latency‑sensitive APIs), need VNet integration, or run functions longer than 10 minutes.)

Q2: Explain the different trigger types in Azure Functions.

  • Short Answer: Triggers define how a function is invoked. Common triggers: HTTP (REST API), Timer (scheduled), Blob Storage (on file upload), Queue Storage, Service Bus, Event Hubs, and Cosmos DB change feed.
  • Detailed Explanation: Each trigger is defined in the function.json or via attributes in C#. For example, an HTTP trigger receives an HttpRequest object. A Service Bus trigger automatically deserializes the message body. Bindings make it easy to read from or write to services without boilerplate code. For instance, an output binding can write a blob directly from the function return value.
  • Code Consideration: In C#, [FunctionName("ProcessOrder")] public static async Task Run([ServiceBusTrigger("orders")] Order order, ILogger log).
  • Follow‑up Question: “How do you handle a poison message in a Service Bus triggered function?” (Answer: After MaxDeliveryCount attempts, the message is moved to the dead‑letter queue. Monitor that queue.)

Q3: What is Durable Functions, and when would you use it?

  • Short Answer: Durable Functions is an extension that allows you to write stateful workflows in a serverless environment using orchestration functions. Use it for long‑running, chained, or fan‑out/fan‑in patterns.
  • Detailed Explanation: Unlike a standard function that is stateless and short‑lived, Durable Functions can pause and replay through checkpoints. Common patterns include Function Chaining (sequential steps), Fan‑out/Fan‑in (parallel work and aggregation), and Human Interaction (wait for an external event like an approval). The orchestration function defines the workflow in code.
  • Code Consideration: Orchestrator functions must be deterministic (no direct I/O). They call activity functions to do the actual work.
  • Follow‑up Question: “How does Durable Functions handle failures of activity functions?” (Answer: It automatically retries and can implement compensation logic if configured.)

Q4: How do you reduce cold start latency in Azure Functions?

  • Short Answer: Use the Premium plan (always ready instances), or write functions in a compiled language (C#/Java). Minimize package dependencies, and avoid loading heavy frameworks in the static constructor.
  • Detailed Explanation: Cold start occurs when the Functions host needs to spin up a new instance from scratch (applying environment, loading assemblies). In the Premium plan, you can set a minimum of 1 instance, effectively keeping it warm. Use WEBSITE_USE_PLACEHOLDER to reduce startup time for .NET functions. Also, use Azure Functions Proxies to potentially keep the runtime alive if using Consumption, though it's not guaranteed.
  • Code Consideration: In the startup class, be mindful of the time taken for Configure methods. Pre‑compile models.
  • Follow‑up Question: “Is cold start a problem for containerized Functions on Kubernetes?” (Answer: Yes, but you can use KEDA with scaled objects and ensure your container image is optimized and cached on nodes.)

Q5: How do you implement authentication for an HTTP‑triggered Azure Function?

  • Short Answer: Use the AuthorizationLevel attribute: Anonymous for public, Function or Admin for host keys. For production, use Azure AD authentication by enabling App Service Authentication on the Function App, or validate tokens manually in the function.
  • Detailed Explanation: Function keys are shared secrets passed as a query parameter or header. They are suitable for admin‑only or internal calls. For external APIs, integrate with Entra ID: set AuthorizationLevel.Anonymous, enable “Easy Auth” in the Function App, and require a valid JWT. Your function code can then access user claims via ClaimsPrincipal.
  • Code Consideration: var user = req.HttpContext.User; and use [Authorize] attributes in isolated process .NET Functions.
  • Follow‑up Question: “How do you secure function keys?” (Answer: Store them in Key Vault. For callers, they should be treated as secrets and not committed to source control.)

Q6: Explain the bindings system in Azure Functions.

  • Short Answer: Bindings declaratively connect a function to other Azure services for input and output, eliminating boilerplate code. They are configured in function.json or via attributes.
  • Detailed Explanation: An input binding automatically fetches data from a source (e.g., reading a blob). An output binding writes data (e.g., adding a message to a queue). For example, you can have an HTTP trigger function that receives an image and, using an output binding, writes it to Blob Storage without manually instantiating a BlobClient. This keeps the function code focused on business logic.
  • Code Consideration: In C#, [Blob("output/{rand-guid}.jpg", FileAccess.Write)] Stream outputBlob.
  • Follow‑up Question: “What if you need to call multiple services from one function?” (Answer: You can have multiple output bindings, or use IBinder to imperatively bind to a specific path at runtime.)

Q7: How do you handle long‑running processes beyond 10 minutes in a serverless function?

  • Short Answer: Move the process to Durable Functions, or break it into a chain of functions. Alternatively, use a Queue‑triggered function and send completion status to the user via SignalR or a callback URL.
  • Detailed Explanation: The HTTP response should be returned quickly (within a few minutes). For long work, immediately return 202 Accepted with a status endpoint. The actual work is processed by a background function that updates the status in a database. Durable Functions simplify this by providing built‑in status query APIs.
  • Code Consideration: In Durable Functions, an orchestrator can run for months. The framework handles checkpoints.
  • Follow‑up Question: “What about Premium plan limits?” (Answer: Premium allows up to 60 minutes per execution, which is sufficient for many long processes without orchestrators.)

Q8: How do you scale Azure Functions dynamically?

  • Short Answer: In Consumption and Premium plans, the scale controller monitors trigger events and adds instances. Each function app has a scale limit, and functions scale independently.
  • Detailed Explanation: For a queue trigger, the scale controller adds instances based on queue length. For HTTP, it scales based on request rate. In Premium, you can set Always Ready Instances to maintain baseline capacity. The maximum scale‑out instances is configurable (limited by plan).
  • Code Consideration: Ensure your function is idempotent, as scaling might process the same message multiple times under certain failure modes. Use singleton locks if needed.
  • Follow‑up Question: “How do you limit the scale of one function in a function app?” (Answer: Use the functionAppScaleLimit setting or modify the host.json functionTimeout and concurrency settings.)

Q9: How do you monitor and debug an Azure Function in production?

  • Short Answer: Integrate with Application Insights. Use structured logging (ILogger), and enable live metrics stream. For detailed traces, enable sampling or configure log level to Trace.
  • Detailed Explanation: Application Insights captures exceptions, request duration, and dependency calls automatically. You can add custom telemetry (e.g., log.LogInformation("Order processed: {OrderId}", order.Id)). The Live Metrics stream shows real‑time server activity, which is helpful during a live incident. For deeper debugging, you can attach a debugger to a function running in a staging slot using Visual Studio remote debugging.
  • Code Consideration: Never log sensitive data like API keys or PII. Use structured logging properties for filtering.
  • Follow‑up Question: “How do you trace a request across multiple functions?” (Answer: Use correlation IDs. ILogger automatically includes the OperationId from the trigger, propagating it through bindings.)

Q10: Design a serverless image processing pipeline with Azure Functions.

  • Short Answer: A Blob Storage trigger function fires when an image is uploaded. It generates multiple sizes (thumbnail, medium) and saves them back to Blob. Metadata is written to Cosmos DB. Errors are sent to a dead‑letter queue.
  • Detailed Explanation: The function uses an input binding for the blob (byte[] or Stream) and output bindings for the resized blobs. It uses an image processing library (e.g., SixLabors.ImageSharp). For a scalable design, the function can be Consumption plan with a low memory size. A separate function monitors the dead‑letter queue for manual review.
  • Code Consideration: Use async processing for all I/O. For large images, consider streaming and not loading the entire blob into memory.
  • Follow‑up Question: “How would you handle the same image being processed twice?” (Answer: Use ETag validation or a lease on the blob to prevent concurrent processing.)

Azure API Management Interview Questions (8 Questions)

Q1: What is Azure API Management and why is it essential for API platforms?

  • Short Answer: APIM is a fully managed gateway for creating, publishing, securing, and analyzing APIs. It provides a unified entry point, decoupling backend services from clients, enabling authentication, rate limiting, and versioning.
  • Detailed Explanation: Without APIM, each client would directly connect to backend APIs, scattering security and monitoring. APIM provides a single endpoint, handles OAuth token validation, enforces quotas, caches responses, and transforms requests/responses. It also offers a developer portal for API documentation and testing.
  • Code Consideration: APIs are imported via OpenAPI spec or manually. Policies (XML or YAML) define inbound/outbound processing.
  • Follow‑up Question: “How does APIM charge?” (Answer: By tier: Consumption (per call), Developer (non‑prod), Basic, Standard, Premium (with VNet, capacity units).)

Q2: How do you secure an API in APIM using OAuth 2.0 and Azure AD?

  • Short Answer: Configure APIM to validate JWT tokens issued by an Entra ID tenant. In the inbound policy, use <validate-jwt> to check issuer, audience, and signature. Reject unauthorized requests before they reach the backend.
  • Detailed Explanation: Register two app registrations: one for the client, one for the backend API (exposing scopes). In APIM, the <validate-jwt> policy element is configured with the OpenID Connect metadata URL of Entra ID. This ensures only valid tokens with the correct scope can access the API. APIM can also request a new token on behalf of the user (<on-behalf-of>) to call a downstream service.
  • Code Consideration: The backend API might still validate the token, but APIM removes this burden and centralizes security.
  • Follow‑up Question: “How do you handle token refresh?” (Answer: APIM can use a retry policy to re‑issue a request with a new token if a 401 is received, or the client is responsible for refreshing before expiry.)

Q3: What are APIM policies and give an example of a typical policy pipeline.

  • Short Answer: Policies are a sequence of XML statements executed in the request/response pipeline. They can modify the request, check authentication, cache responses, and more. The pipeline: inboundbackendoutboundon‑error.
  • Detailed Explanation: A typical inbound policy might set a rate limit, validate a JWT, and then add a header. After the backend call, the outbound policy might mask sensitive data or add CORS headers. Policies are defined per product, API, or operation. They are composable and can include custom C# expressions.
  • Code Consideration: <set-header name="X-Request-ID" exists-action="append"> <value>@(context.RequestId)</value> </set-header>.
  • Follow‑up Question: “How do you implement IP whitelisting in APIM?” (Answer: Use <check-header> on caller-ip or the built‑in <ip-filter> policy.)

Q4: APIM vs Application Gateway: What’s the difference?

  • Short Answer: APIM is an API gateway focused on API lifecycle management (auth, quotas, developer portal). Application Gateway is a network appliance providing layer 7 load balancing and Web Application Firewall (WAF). They are often used together: App Gateway for WAF and regional routing, APIM behind it for API management.
  • Detailed Explanation: APIM doesn’t have a WAF; App Gateway does. APIM excels at API‑specific policies like XML‑to‑JSON transformation, rate limiting per subscription key, and OAuth. In a common architecture, traffic flows: Internet → Front Door (global WAF) → App Gateway (regional WAF) → APIM (API management) → Backend.
  • Code Consideration: Both can terminate TLS. Use APIM for API‑focused logic and security.
  • Follow‑up Question: “Can APIM be placed in a VNet?” (Answer: Yes, Premium tier supports internal VNet mode where it’s only accessible within the VNet.)

Q5: How do you implement API versioning in APIM?

  • Short Answer: Use version sets to group multiple API versions. Clients specify the version via a URL path segment (/v1/, /v2/), query string, or header. Each version points to a different backend or backend logic.
  • Detailed Explanation: Create a version set (e.g., “Order API”). Then add versions v1 and v2. Each version can have a different backend service URL or APIM can transform the request (e.g., strip the version prefix before calling backend). The developer portal displays all versions. This allows seamless deprecation of old versions.
  • Code Consideration: Use a policy to set a deprecation header for old versions, informing clients to migrate.
  • Follow‑up Question: “How do you sunset an API version?” (Answer: Set it to “Deprecated” in the portal, which removes it from default views but still allows access until you revoke subscriptions.)

Q6: How do you implement rate limiting and throttling in APIM?

  • Short Answer: Use the <rate-limit-by-key> or <rate-limit> policy. This limits the number of calls per subscription key over a time window. Exceeding the limit returns 429 Too Many Requests.
  • Detailed Explanation: The policy is added to the inbound section: <rate-limit-by-key calls="100" renewal-period="60" counter-key="@(context.Subscription.Id)" />. This enforces a per‑subscription rate limit. You can also rate limit by IP address or custom header. The response includes Retry-After header.
  • Code Consideration: Combine with <quota> policy for a longer‑term quota (e.g., 10,000 calls per month).
  • Follow‑up Question: “How do you build a back‑off and retry in your client?” (Answer: Use Retry-After header from 429 response, implement exponential backoff.)

Q7: How do you manage API documentation and developer onboarding?

  • Short Answer: Use the built‑in Developer Portal. It auto‑generates interactive API documentation from your API definitions (OpenAPI). Developers can sign up, subscribe to products, and obtain keys to test.
  • Detailed Explanation: The portal is customizable with widgets and pages. Publish API definitions with descriptions and examples to help consumers. Products group APIs and define access policies. When a developer subscribes, they get a primary and secondary subscription key.
  • Code Consideration: Use the APIM REST API or DevOps Resource Kit to automate the export and versioning of portal content.
  • Follow‑up Question: “Can the developer portal be private?” (Answer: Yes, you can restrict access to the portal via Entra ID or IP restriction.)

Q8: How do you transform requests and responses in APIM (e.g., XML to JSON)?

  • Short Answer: Use outbound or inbound policies: <xml-to-json> or <json-to-xml> to convert formats. Also, use <set-body> to apply templates or replace content.
  • Detailed Explanation: APIM can modify the payload on the fly. For a legacy backend that returns XML but the client expects JSON, use <xml-to-json kind="direct" apply="always" /> in the outbound. You can also use <find-and-replace> or C# expressions to modify strings.
  • Code Consideration: Large payloads can impact gateway performance. For complex transformations, consider an Azure Function as a backend mediator.
  • Follow‑up Question: “How do you mock API responses for testing?” (Answer: Use the <return-response> policy to define a static response without calling the backend.)

Azure Container and Kubernetes Development (10 Questions)

Q1: When should you use Azure Container Apps vs AKS (Azure Kubernetes Service)?

  • Short Answer: Container Apps is for simplified, event‑driven microservices and background processing without Kubernetes operational overhead. AKS is for full Kubernetes control, complex orchestration, and multi‑tenant cluster requirements.
  • Detailed Explanation: Container Apps handles most of Kubernetes for you (auto‑scaling, ingress, Dapr). It’s ideal for teams wanting serverless containers. AKS provides full access to the Kubernetes API, node management, and ecosystem tools (Helm, operators). If your application needs a service mesh (Istio), custom node configurations, or you’re already using Kubernetes, AKS is the choice.
  • Code Consideration: With Container Apps, you deploy containers and configure scaling rules through CLI or Bicep. With AKS, you write Kubernetes manifests or use Helm.
  • Follow‑up Question: “Can I run Dapr on AKS?” (Answer: Yes, and also on Container Apps, which has built‑in Dapr support, simplifying state management and pub/sub.)

Q2: How do you deploy a container to Azure Container Apps?

  • Short Answer: Push your image to Azure Container Registry (ACR). Then, via CLI (az containerapp create) or Bicep, create a Container Apps environment and app, referencing the ACR image. Enable managed identity for the app to pull from ACR.
  • Detailed Explanation: The flow: az acr build (or docker push after login). Then az containerapp create --image <registry>/<image>:<tag> --ingress external. The app gets a unique FQDN. You can configure environment variables, secrets (from Key Vault), and scaling rules.
  • Code Consideration: Use az containerapp update for CI/CD. GitHub Actions has a dedicated Container Apps deploy action.
  • Follow‑up Question: “How do you handle versioning and rollback?” (Answer: Container Apps supports multiple active revisions. You can direct traffic to a new revision and roll back if needed via revision management.)

Q3: Explain the role of Dapr (Distributed Application Runtime) in microservices on Azure.

  • Short Answer: Dapr is a runtime that simplifies microservices development by providing APIs for state management, pub/sub, service invocation, and secrets, without requiring SDKs in every service.
  • Detailed Explanation: With Dapr, your application can store state by calling localhost:3500/v1.0/state instead of directly using a Cosmos DB SDK. Dapr handles the backend binding (Redis, Cosmos DB, etc.). This makes the application portable and less dependent on Azure‑specific libraries. Container Apps has Dapr built‑in and enabled per app.
  • Code Consideration: Use the Dapr SDK for your language, or direct HTTP/gRPC calls.
  • Follow‑up Question: “How does Dapr simplify pub/sub between microservices?” (Answer: You publish to a topic; Dapr routes to the appropriate message broker (Service Bus, RabbitMQ) configured in the component. Subscribers only know the topic name.)

Q4: How do you manage secrets in AKS workloads?

  • Short Answer: Do not put secrets in container images or Kubernetes Secrets unencrypted. Use the Azure Key Vault Provider for Secrets Store CSI Driver to mount secrets as volumes, or sync them as Kubernetes Secrets with encryption at rest.
  • Detailed Explanation: The CSI driver authenticates using the pod’s managed identity (or workload identity) and retrieves secrets from Key Vault. It can create a Kubernetes Secret that is only visible to the pod, with encryption. This avoids storing raw secrets in Kubernetes manifests or etcd.
  • Code Consideration: Install the Secrets Store CSI driver on AKS, create a SecretProviderClass referencing the Key Vault, then mount the volume in your pod.
  • Follow‑up Question: “What is Workload Identity in AKS?” (Answer: It maps a Kubernetes service account to an Azure Managed Identity, allowing pods to securely authenticate to Azure resources without secret management.)

Q5: How does auto‑scaling work in AKS?

  • Short Answer: Horizontal Pod Autoscaler (HPA) scales pods based on CPU/memory or custom metrics. Cluster Autoscaler scales the number of nodes. KEDA can scale pods to zero based on Azure events.
  • Detailed Explanation: HPA uses the metrics server. You define a deployment with minReplicas and maxReplicas. Cluster Autoscaler watches for unschedulable pods and adds nodes. For scaling based on a Service Bus queue length, KEDA provides a ScaledObject that feeds the HPA.
  • Code Consideration: Define resource requests and limits for every pod; otherwise, auto‑scaling won’t work correctly.
  • Follow‑up Question: “What is the difference between HPA and VPA?” (Answer: HPA scales horizontally (more pods), VPA scales vertically (more resources per pod). VPA requires pod restarts.)

Q6: What is a service mesh, and when would you use Istio on AKS?

  • Short Answer: A service mesh is a dedicated infrastructure layer for handling service‑to‑service communication, including traffic management, security (mTLS), and observability. Use Istio when you need fine‑grained routing (A/B testing, canary deploys) or mutual TLS between all services without application code changes.
  • Detailed Explanation: Istio injects a sidecar proxy (Envoy) into each pod, intercepting all traffic. This enables powerful traffic splitting, circuit breaking, and metrics collection. However, it adds complexity and resource overhead. Many scenarios can be handled by Azure Front Door or APIM at the edge, plus Dapr internally.
  • Code Consideration: Istio works with Kiali for visualization and Jaeger for tracing.
  • Follow‑up Question: “How does AKS’s native layer 7 load balancing compare?” (Answer: AKS Application Gateway Ingress Controller (AGIC) provides layer 7 routing and WAF without a full mesh.)

Q7: How do you troubleshoot a Container App that keeps restarting?

  • Short Answer: Check the logs using az containerapp logs show. Look for crash loops, out‑of‑memory (OOM) kills, or failed startup probes. Review Application Insights if integrated. Ensure the image is correct and the required port is exposed.
  • Detailed Explanation: A continuous restart usually means the container exits immediately after starting. Use --tail to see recent logs. Check the container’s command and environment variables. If the startup probe fails, the container is considered unhealthy and restarted. For memory issues, increase the memory limit in the container app’s configuration.
  • Code Consideration: Log to stdout/stderr, as Container Apps capture console logs.
  • Follow‑up Question: “How do you debug a container that starts but is unreachable?” (Answer: Use az containerapp exec to run a shell inside a running container (if enabled) to test network connectivity.)

Q8: What is a sidecar pattern in containers, and how is it used in Azure Container Apps?

  • Short Answer: A sidecar is a secondary container that runs alongside the main application container in the same pod, providing supporting functionality like logging, proxying, or configuration refresh. In Container Apps, you define multiple containers in a revision.
  • Detailed Explanation: For example, your main app serves HTTP, while a sidecar runs a logging agent that tails the app’s logs and ships them to a central service. Another common sidecar is a Dapr process. Container Apps share the network namespace, allowing them to communicate over localhost.
  • Code Consideration: Define the sidecar in the properties.template.containers array in the ARM/Bicep template or via CLI.
  • Follow‑up Question: “How does Container Apps handle startup order for sidecars?” (Answer: The main container will start after all sidecars have started, or you can control ordering with initialization containers.)

Q9: How do you implement continuous deployment for AKS?

  • Short Answer: Use a CI/CD pipeline (GitHub Actions or Azure DevOps) to build the Docker image, push to ACR, update the Kubernetes manifest or Helm chart, and apply to the cluster. Use tools like Argo CD or Flux for GitOps.
  • Detailed Explanation: The pipeline: Build → Push → Update image tag in deployment YAML → Apply to cluster (kubectl apply). For GitOps, Argo CD watches a Git repository containing the desired state (manifests or Helm) and synchronizes the cluster. This provides rollback and audit history.
  • Code Consideration: Use Azure Key Vault to store ACR credentials or use managed identity for ACR pull.
  • Follow‑up Question: “How do you handle database schema changes during AKS deployments?” (Answer: Use an init container or a Kubernetes Job that runs migrations before the new deployment scales up.)

Q10: Describe a blue‑green deployment strategy for Azure Container Apps.

  • Short Answer: Deploy a new revision of the Container App. Test the “blue” revision. Once validated, shift all traffic to it, and keep the old “green” revision inactive. Rollback by reactivating the old revision and shifting traffic back.
  • Detailed Explanation: Container Apps inherently supports revision management. You create a new revision with the updated container image. By default, multiple revisions can be active. You can configure traffic splitting (e.g., 100% to new). If the new revision fails health checks, traffic stays on the old one. This is a powerful, built‑in mechanism for zero‑downtime deployments.
  • Code Consideration: Use labels to tag revisions with semantic versions.
  • Follow‑up Question: “How do you perform canary releases?” (Answer: Configure traffic splitting: 10% to new revision, 90% to stable. Gradually increase based on monitoring.)

Azure Storage Development Questions (8 Questions)

Q1: What are the different Azure Storage services, and their typical use cases?

  • Short Answer: Blob Storage (unstructured data, images, backups), Queue Storage (messaging), Table Storage (NoSQL key‑value, now mostly Cosmos DB), and Files (SMB/NFS shares). Also, Data Lake Storage Gen2 for big data analytics.
  • Detailed Explanation: As a developer, you'll most often interact with Blob Storage for static file hosting, log storage, or document archives. Queue Storage provides simple message queues, but Service Bus is preferred for enterprise messaging. Data Lake Gen2 is Blob with a hierarchical namespace, optimized for analytics.
  • Code Consideration: Use BlobServiceClient for blob operations. For Data Lake, use DataLakeServiceClient to leverage directory operations and ACLs.
  • Follow‑up Question: “When should you use Blob Storage over a database for document storage?” (Answer: When documents are large, static, and don’t require relational queries or frequent updates. It’s cheaper and more scalable for archival.)

Q2: How do you secure Blob Storage access?

  • Short Answer: Use Azure AD and Managed Identity for authorization, and role‑based access control (RBAC). Restrict public access at the account level. Use Private Endpoints to keep data traffic within the VNet. For specific clients, generate time‑limited SAS tokens with minimal permissions.
  • Detailed Explanation: Never use the account key for application access; rotate it frequently if you must. Set AllowBlobPublicAccess to false. Implement RBAC roles like Storage Blob Data Contributor. SAS tokens should be short‑lived and scoped to a specific container. When using SAS, enforce HTTPS.
  • Code Consideration: new DefaultAzureCredential() provides identity‑based access for BlobServiceClient.
  • Follow‑up Question: “What is a user delegation SAS?” (Answer: It’s a SAS token signed with the user’s Azure AD credentials rather than the storage account key, more secure and auditable.)

Q3: Explain blob storage tiers and lifecycle management for cost optimization.

  • Short Answer: Access tiers: Hot (frequent access), Cool (infrequent, 30 days), Cold (rare, 90 days), and Archive (offline, hours to rehydrate). Lifecycle management policies automatically move blobs between tiers based on age.
  • Detailed Explanation: A configuration can say: “After 30 days without access, move transaction logs from Hot to Cool. After 90 days, move to Archive.” This drastically reduces cost. Use the Azure portal or define rules in JSON.
  • Code Consideration: When reading from Archive, you must first rehydrate the blob (set tier to Hot or Cool) and wait for it to complete.
  • Follow‑up Question: “How do you delete blobs after a retention period?” (Answer: Add a rule in the lifecycle policy to delete blobs after X days.)

Q4: How would you design a large file upload system using Azure Blob Storage?

  • Short Answer: Use chunked upload via the Azure SDK’s UploadAsync methods, which automatically handle blocks. For very large files (>200 GB), use block blobs with parallel put block operations. Implement client‑side retry policies.
  • Detailed Explanation: The Blob Storage SDK supports streaming uploads. It splits files into blocks, uploads them in parallel, and commits them when all blocks are uploaded. This provides resilience and speed. For browser‑based uploads, generate a SAS URI and use the Azure Storage Blob JavaScript SDK on the client, bypassing your web server.
  • Code Consideration: Set BlobUploadOptions with TransferOptions to configure concurrency and chunk size.
  • Follow‑up Question: “How do you handle an upload failure midway?” (Answer: The SDK automatically retries failed blocks. If the process is interrupted, you can resume by listing uncommitted blocks and continuing with the missing ones.)

Q5: What is Azure Queue Storage and when should you use it vs Service Bus?

  • Short Answer: Queue Storage is a simple, massive‑scale message queue for decoupling application components. Use it for high‑volume, low‑latency scenarios where you don’t need advanced features like sessions or dead‑letter queues. Service Bus is for enterprise messaging with transactional support.
  • Detailed Explanation: Queue Storage is built on Azure Storage, so it’s cheap and scalable. It follows an at‑least‑once delivery model and has a visibility timeout for processing. Service Bus offers more reliability (peek‑lock), duplicate detection, and ordered FIFO with sessions.
  • Code Consideration: Use QueueClient to SendMessageAsync. The processor pattern loops, retrieving messages and deleting after processing.
  • Follow‑up Question: “How do you handle a message that fails processing?” (Answer: In Queue Storage, the message reappears after visibility timeout. You must track the dequeue count in your code and move it to a dead‑letter queue if it exceeds a threshold.)

Q6: How do you use Azure File Shares in an application?

  • Short Answer: Azure Files provides SMB and NFS file shares that can be mounted on Windows, Linux, and macOS, or accessed via REST API. Use it for legacy applications that need a shared file system, or for configuration files across multiple instances.
  • Detailed Explanation: Developers often use File Share to store application configuration that can’t be externalized, or as a home directory for containerized apps. The REST API allows file creation and management from anywhere, but SMB mount is common for VMs. Use Managed Identity to authenticate to the share using Azure AD Kerberos or storage account key for simpler scenarios.
  • Code Consideration: In .NET, ShareClient and ShareFileClient provide programmatic access. Map network drive on Windows with net use.
  • Follow‑up Question: “When would you use Azure NetApp Files instead?” (Answer: For high‑performance, low‑latency NFS workloads, typically in HPC or SAP scenarios.)

Q7: What are Shared Access Signatures (SAS) and how do you generate them securely?

  • Short Answer: A SAS token grants limited, time‑bound access to a storage resource without sharing the account key. Generate them server‑side using the storage account key or a user delegation key (Azure AD).
  • Detailed Explanation: A SAS URL contains a signed query string with permissions, start/expiry time, and allowed IPs. User delegation SAS is preferred because it uses the user’s Entra ID credentials, meaning you don’t expose the storage account key, and you can revoke it by disabling the user. Generate server‑side and never expose the key in client‑side code.
  • Code Consideration: BlobSasBuilder sets permissions and expiry; blobClient.GenerateSasUri(BlobSasBuilder).
  • Follow‑up Question: “How do you prevent SAS token abuse?” (Answer: Use short expiration, restrict IP addresses, and use stored access policies on containers to revoke tokens easily.)

Q8: How do you implement a document processing pipeline using Blob Storage and Azure Functions?

  • Short Answer: Upload a document to a blob container. A Blob‑triggered Azure Function picks it up, processes it (e.g., extracts text, generates thumbnail), and writes results to another container or database. Errors go to a dead‑letter queue.
  • Detailed Explanation: The function uses input and output bindings to simplify the code. For example, an input binding gives the blob stream, an output binding writes the processed file. For long‑running tasks, the function can move the message to a processing queue and return quickly. Monitor the function’s success rate and dead‑letter messages.
  • Code Consideration: Set the BlobTrigger path to monitor a specific container (e.g., raw‑uploads/{name}). Use a poison queue to handle failures.
  • Follow‑up Question: “How do you handle large files that exceed the function’s memory limit?” (Answer: Use streaming and write to blob directly without loading entirely into memory, or use Durable Functions to orchestrate chunked processing.)

Azure Database Development Questions (10 Questions)

Q1: How do you choose between Azure SQL Database and Cosmos DB for a new application?

  • Short Answer: Choose Azure SQL for relational data, complex joins, and strong ACID transactions. Choose Cosmos DB for planet‑scale, schema‑flexible, low‑latency global distribution with key‑value or document models.
  • Detailed Explanation: If you have many‑to‑many relationships and need reporting with ad‑hoc queries, SQL is appropriate. If your app requires < 10ms reads/writes globally, and you can model data as documents with a clear partition key, Cosmos DB is the better fit. Cosmos DB offers multiple APIs (SQL, MongoDB, Cassandra, Gremlin).
  • Code Consideration: In SQL, use Entity Framework Core. In Cosmos DB, use the .NET SDK and define a partition key strategy upfront.
  • Follow‑up Question: “Can Cosmos DB handle relational data?” (Answer: Partially. You can embed related data in a single document, but complex cross‑document joins are limited and may require a change feed pattern.)

Q2: What is a partition key in Cosmos DB, and how does it impact performance and cost?

  • Short Answer: The partition key determines how data is distributed across physical partitions. It’s chosen at collection creation and cannot be changed. A good partition key evenly distributes requests and storage, avoiding “hot” partitions.
  • Detailed Explanation: Cosmos DB scales by splitting partitions as storage and throughput grow. If you choose a partition key like /userId, a single very active user could create a hot partition, throttling requests. Choose a key with high cardinality and even access patterns (e.g., /orderId). The partition key also determines the scope of transactions.
  • Code Consideration: In queries, always provide the partition key (ReadItemAsync(id, new PartitionKey(pk))) for the most efficient, single‑partition lookup.
  • Follow‑up Question: “What are synthetic partition keys?” (Answer: A key created by concatenating multiple properties, e.g., userId‑date, to distribute data more evenly.)

Q3: How do you implement caching in front of Azure SQL Database to reduce load?

  • Short Answer: Use Azure Cache for Redis as a distributed cache. Implement the Cache‑Aside pattern: check cache first; if miss, query database, serialize result, and store in cache with an expiration time.
  • Detailed Explanation: For read‑heavy scenarios, this reduces database DTU consumption and latency. Cache keys should be deterministic, like product‑{id}. Invalidation is the hardest part: you can use a short TTL for semi‑static data, or actively remove cache entries when data is updated (using Redis Pub/Sub or direct deletion). Always use a fallback to the database if Redis is unavailable.
  • Code Consideration: Use IDistributedCache in .NET. For real‑time applications, consider Redis’s pub/sub to notify multiple instances.
  • Follow‑up Question: “How do you prevent cache stampede on a popular key?” (Answer: Use a mutex pattern where only one thread rebuilds the cache, while others wait, or serve stale data while rebuilding in the background.)

Q4: How do you manage database connection pooling in an Azure App Service application?

  • Short Answer: Connection pooling is automatic in .NET (via SqlClient). The key is to set an appropriate Max Pool Size and manage connection lifetime. For Cosmos DB, the SDK uses a singleton client that manages connections itself.
  • Detailed Explanation: In .NET, when you instantiate a new SqlConnection, it draws from the pool. Do not manually dispose connections unless you want to clear the pool. Set Max Pool Size based on the number of concurrent requests and the database’s connection limit (100‑200 is common). For serverless SQL, connection pooling is less effective because the service can pause. Use a retry logic for transient faults (EnableRetryOnFailure in EF Core).
  • Code Consideration: services.AddDbContextPool<AppDbContext>(options => ...) is a good practice for EF Core.
  • Follow‑up Question: “How do you handle connection leaks?” (Answer: Monitor “Active Connections” in Azure SQL metrics. Ensure Dispose() or using blocks are always used, and investigate long‑running queries.)

Q5: What are the different consistency levels in Cosmos DB, and how do you choose?

  • Short Answer: Consistency levels range from Strong to Eventual. Strong ensures linearizability but adds latency and cost. Session is the default, providing “read‑your‑own‑writes” within a session. Choose based on the application’s need for data freshness vs. performance.
  • Detailed Explanation: For a global e‑commerce site, Session is often sufficient: a user sees their own cart updates immediately, but might see slightly stale product inventory. For a financial ledger, Strong ensures every read reflects the latest write. Bounded Staleness is a middle ground, specifying a time or version lag.
  • Code Consideration: Consistency can be set at the account level or overridden per request. Use ConsistencyLevel in RequestOptions.
  • Follow‑up Question: “How do you implement conflict resolution in a multi‑write scenario?” (Answer: Use Last‑Writer‑Wins (LWW) by default, or define a custom merge stored procedure for the conflict feed.)

Q6: How do you perform database migrations in a CI/CD pipeline?

  • Short Answer: Use a tool like Entity Framework Core Migrations, or a dedicated migration framework like DbUp or Flyway. The migration is run as an idempotent step early in the deployment pipeline before the new code is deployed.
  • Detailed Explanation: In GitHub Actions, a job runs dotnet ef database update after building. It connects using a Managed Identity or a service principal. The migration script should be backward‑compatible (additive changes first, destructive later) to allow rolling deployments. For zero‑downtime, use expand‑and‑contract pattern: add columns/tables, deploy code that uses both old and new, then remove old.
  • Code Consideration: Use dotnet ef migrations script to generate an idempotent SQL script that can be reviewed before execution.
  • Follow‑up Question: “How do you roll back a migration?” (Answer: dotnet ef database update <previous‑migration>. However, for destructive changes, you must restore a database backup. That’s why a forward‑only migration approach is safer.)

Q7: Explain the role of Azure PostgreSQL and Azure MySQL in Azure development.

  • Short Answer: They are fully managed relational database services for open‑source engines (PostgreSQL, MySQL). Use them when your application is already built on these databases or when you need specific features (PostGIS, JSONB) without changing code.
  • Detailed Explanation: Azure provides flexible server options (Single Server, Flexible Server). Flexible Server offers better control, high availability, and cost management. Developers use standard connection libraries (Npgsql, MySqlConnector) and Managed Identity for authentication.
  • Code Consideration: For PostgreSQL, enable SSL enforcement. Use Azure AD authentication extension for PostgreSQL.
  • Follow‑up Question: “How do you scale Azure Database for PostgreSQL?” (Answer: Scale up/down compute and storage. Use read replicas for read‑heavy workloads.)

Q8: How do you use Azure Cosmos DB change feed to build reactive applications?

  • Short Answer: The change feed provides a sorted list of documents that were changed (inserted/updated). Use it to trigger downstream processes, like updating a cache, sending notifications, or syncing data to another store.
  • Detailed Explanation: It’s an event‑sourcing system built into Cosmos DB. You can consume it via an Azure Function trigger (simplest), or using the change feed processor library. This allows real‑time streaming of database changes. For example, when an order document is created, a change feed function picks it up and calls an external shipping service.
  • Code Consideration: CosmosClient.GetChangeFeedProcessorBuilder connects to a lease container to track progress.
  • Follow‑up Question: “Is the change feed ordered?” (Answer: It’s ordered within a partition. Global ordering is not guaranteed.)

Q9: What are the best practices for securing Azure SQL Database?

  • Short Answer: Disable public access, use Private Endpoints. Authenticate via Managed Identity (no SQL auth). Enable Auditing and Threat Detection. Use Always Encrypted for sensitive columns. Enforce TLS 1.2.
  • Detailed Explanation: Set publicNetworkAccess: Disabled. Grant the App Service’s Managed Identity the Directory Readers role and create a contained database user mapping to that identity. Enable Azure Defender for SQL to detect SQL injection attempts and anomalous activities. For PII, always encrypt columns with customer‑managed keys.
  • Code Consideration: Connection string: Server=tcp:myserver.database.windows.net;Authentication=Active Directory Managed Identity; Database=mydb;
  • Follow‑up Question: “How do you mask data in a non‑production environment?” (Answer: Use dynamic data masking in Azure SQL to obfuscate data for users without UNMASK permission.)

Q10: How do you handle database failover for high availability?

  • Short Answer: Use Azure SQL Database’s built‑in high availability (zone‑redundant) and active geo‑replication for disaster recovery. For Cosmos DB, enable multi‑region writes or use automatic failover.
  • Detailed Explanation: Azure SQL automatically replicates data within the same region. For DR, configure Active Geo‑Replication to a secondary region. In case of failover, update the connection string to point to the secondary server (or use the failover group listener). For Cosmos DB, if your primary region fails, you can promote a secondary region manually or use the automatic failover policy.
  • Code Consideration: Use the .NET Microsoft.Data.SqlClient with FailoverPartner in the connection string for faster recovery.
  • Follow‑up Question: “How do you test failover without impacting production?” (Answer: Use a planned failover during a maintenance window for Azure SQL failover groups.)

Azure Messaging and Event‑Driven Development (10 Questions)

Q1: Azure Service Bus Queue vs Topic: What’s the difference?

  • Short Answer: A queue is a single receiver processing messages (one consumer). A topic uses subscriptions, allowing multiple consumers to each receive a copy of the message (publish‑subscribe). Topics enable message broadcasting.
  • Detailed Explanation: Use a queue for point‑to‑point communication (one service processes an order). Use a topic when multiple services need to react to the same event (e.g., “OrderPlaced” is processed by billing service and inventory service simultaneously). Each subscription can have its own filters and rules.
  • Code Consideration: Queue: ServiceBusSender and ServiceBusReceiver. Topic: ServiceBusSender to topic, ServiceBusProcessor on each subscription.
  • Follow‑up Question: “Can a queue have multiple receivers?” (Answer: Yes, for load‑leveling. Messages are distributed among competing consumers.)

Q2: What is the dead‑letter queue (DLQ) and how do you use it?

  • Short Answer: The DLQ holds messages that couldn’t be delivered or processed successfully. It’s essential for building resilient systems. Monitor the DLQ and implement a manual or automated process to investigate and resubmit those messages.
  • Detailed Explanation: Messages are moved to DLQ when: maximum delivery attempts exceeded, TTL expires, or an explicit dead‑letter operation is called in code. You should set up an alert on DLQ count > 0. Often, an administrator tool or a separate function inspects the DLQ, allowing for message repair and resubmission.
  • Code Consideration: ServiceBusProcessor has a MaxAutoLockRenewalDuration and dead‑letter behavior is automatic.
  • Follow‑up Question: “How do you resubmit a dead‑lettered message?” (Answer: Receive from DLQ, inspect the body, optionally modify, and then send to the original queue via ServiceBusSender.)

Q3: When should you use Azure Event Grid vs Service Bus?

  • Short Answer: Event Grid is for reactive, push‑based event notification (something happened). Service Bus is for high‑value enterprise messaging with reliable queueing and order processing. Event Grid is great for serverless “glue” between Azure services.
  • Detailed Explanation: Event Grid sends events to subscribers (webhooks, Functions) when a blob is created or a resource group changes. It’s an at‑least‑once delivery with limited retries. Service Bus ensures the message is processed exactly once (with peek‑lock) and can be transactionally coupled with a database.
  • Code Consideration: Use Event Grid for simple triggers with Azure services. Use Service Bus for business transactions.
  • Follow‑up Question: “How do you implement Event Grid dead‑lettering?” (Answer: Configure a dead‑letter endpoint (blob storage) that stores events that could not be delivered after retries.)

Q4: How do you achieve message ordering in Azure Service Bus?

  • Short Answer: Use Service Bus sessions. Enable RequiresSession on the queue/topic. All messages with the same SessionId are delivered in order to the same receiver.
  • Detailed Explanation: A session is a FIFO stream. The receiver locks the session and processes messages one by one. This is useful for order processing where all events for a specific order must be processed sequentially. Without sessions, ordering is not guaranteed across messages.
  • Code Consideration: Use ServiceBusSessionProcessor and accept a session. It handles concurrency.
  • Follow‑up Question: “What happens when a session receiver fails?” (Answer: The session lock is released, and another receiver can pick it up, ensuring high availability.)

Q5: Explain the retry and transient fault handling for Azure Service Bus.

  • Short Answer: Use the retry policy in the SDK (exponential backoff) for transient errors. For message processing failures, abandon the message, allowing it to be retried after a visibility delay.
  • Detailed Explanation: The SDK automatically retries on network or server busy errors. When processing, if your logic fails, you call AbandonAsync(), which returns the message to the queue for another attempt. After MaxDeliveryCount, it moves to DLQ. Use ServiceBusRetryOptions to customize the retry mode and count.
  • Code Consideration: Catch specific exceptions (like ServiceBusException) and implement appropriate actions: abandon, dead‑letter, or complete.
  • Follow‑up Question: “How do you handle a message that always fails immediately (poison)?” (Answer: Use a short MaxDeliveryCount. Once dead‑lettered, it won’t block the queue.)

Q6: What is Azure Event Hubs and when should you use it?

  • Short Answer: Event Hubs is a big data streaming platform and event ingestion service. Use it for telemetry, logging, and real‑time analytics where throughput is millions of events per second.
  • Detailed Explanation: Unlike Service Bus, Event Hubs is designed for high‑throughput streaming with partitioned consumers. It uses a pull model with a consumer group. It’s great for IoT data ingestion or clickstream analytics. It doesn’t have transactions per message like Service Bus, but it has a much higher scale.
  • Code Consideration: Use EventHubProducerClient and EventProcessorClient for batch processing.
  • Follow‑up Question: “How do you checkpoint in Event Hubs?” (Answer: The processor stores offset in a storage account after processing a batch, ensuring at‑least‑once processing.)

Q7: Design an event‑driven architecture for an order management system using Azure services.

  • Short Answer: A web app (App Service) receives an order and publishes an OrderPlaced event to a Service Bus topic. A billing function subscribes to process payment. An inventory function subscribes to reserve stock. A notification function sends an email. Failures are retried and dead‑lettered.
  • Detailed Explanation: This decouples the frontend from the backend processes. The topic broadcasts the event to multiple subscriptions. Each function independently scales. If inventory fails, the billing still proceeds, and a compensating transaction might be needed. The system uses Cosmos DB change feed to propagate data changes.
  • Code Consideration: Use correlation IDs across all events for tracing. Store the event payload in a durable store for auditing.
  • Follow‑up Question: “How do you guarantee the order is not processed twice?” (Answer: Implement idempotency keys in the message and check a database before processing.)

Q8: What is the difference between a push model and a pull model in Azure messaging?

  • Short Answer: Push: the service calls your endpoint (Event Grid, Service Bus with ServiceBusProcessor in some modes). Pull: your application continuously polls for messages (Event Hubs, Storage Queues). Push is simpler, pull gives more control over throughput.
  • Detailed Explanation: Event Grid pushes events to a webhook, so you need an HTTP endpoint. Service Bus processor uses an internal AMQP connection that effectively pushes messages to your callback. Pull is used when you want to batch process or control the rate. Event Hubs is pull‑based; the consumer reads at its own pace.
  • Code Consideration: For Service Bus, the processor hides the pull loop; you just define a message handler.
  • Follow‑up Question: “Which model is better for serverless?” (Answer: Push is more natural for Azure Functions because the trigger manages the connection.)

Q9: How do you implement a competing consumers pattern?

  • Short Answer: Use a single queue (Service Bus or Storage Queue) and multiple receiver instances. Messages are distributed among the consumers, scaling out processing.
  • Detailed Explanation: Each consumer runs the same code. When a message arrives, only one instance receives it. This allows you to increase processing capacity by simply adding more receivers. It also provides resilience: if a consumer crashes, the message becomes visible again and is picked up by another.
  • Code Consideration: For Service Bus, MaxConcurrentCalls controls how many messages each instance processes simultaneously.
  • Follow‑up Question: “How do you prevent message starvation?” (Answer: Use multiple queues with prioritization, or Service Bus sessions to ensure all partitions are processed.)

Q10: How do you ensure idempotent processing in an event‑driven Azure application?

  • Short Answer: Assign a unique, deterministic MessageId to each message. In the consumer, check a database (or cache) to see if that ID has been processed. If yes, acknowledge the message without re‑executing the business logic.
  • Detailed Explanation: The at‑least‑once delivery model can cause duplicates. The processing function should be written as an idempotent operation. For example, inserting into a database with a unique constraint on OrderId will fail the duplicate, and you can catch the exception and complete the message gracefully. Or, use a ledger table to track processed message IDs.
  • Code Consideration: if (await db.ProcessedMessages.AnyAsync(m => m.MessageId == messageId)) return;.
  • Follow‑up Question: “What if your business logic involves external calls that can’t be idempotent?” (Answer: Use the “Outbox Pattern”: store the outcome of the processing, and then send the external call. If a duplicate arrives, the outcome is already recorded.)

Azure Identity and Security Development (10 Questions)

Q1: How does an application authenticate with Azure services securely?

  • Short Answer: Use Azure Managed Identity. The application runs with an identity provided by Azure (system or user‑assigned), which is granted RBAC roles on the target services. No secrets or keys are stored in the code.
  • Detailed Explanation: Enable a managed identity on your App Service or Container App. Then, assign that identity the necessary roles (e.g., Storage Blob Data Contributor on the storage account). In code, use DefaultAzureCredential or ManagedIdentityCredential to obtain tokens. The token is automatically refreshed.
  • Code Consideration: var client = new SecretClient(new Uri(keyVaultUri), new DefaultAzureCredential());
  • Follow‑up Question: “What is the difference between system‑assigned and user‑assigned managed identity?” (Answer: System‑assigned is tied to the lifecycle of the Azure resource. User‑assigned is a standalone identity that can be shared across multiple resources.)

Q2: How do you manage secrets like connection strings and API keys in Azure?

  • Short Answer: Store them in Azure Key Vault. Your application uses Managed Identity to access Key Vault at runtime and retrieve secrets. Use Key Vault references in App Service configuration.
  • Detailed Explanation: Never commit secrets to source code. The CI/CD pipeline can inject Key Vault references (@Microsoft.KeyVault(...)) into the application settings. The App Service fetches the value at startup. For local development, use Azure CLI credentials and a separate dev Key Vault.
  • Code Consideration: IConfiguration will have the resolved secret value. For programmatic access, KeyVaultSecret secret = await secretClient.GetSecretAsync("MySecret");
  • Follow‑up Question: “How do you rotate a secret without downtime?” (Answer: Create a new version in Key Vault. App Service automatically picks up the new version within 24 hours or after a restart. For immediate refresh, use the Key Vault configuration provider with a reload interval.)

Q3: Explain OAuth 2.0 and OpenID Connect as used in Azure.

  • Short Answer: OAuth 2.0 is an authorization framework for delegated access. OpenID Connect (OIDC) is an identity layer on top of OAuth 2.0 for authentication. Azure AD (Entra ID) supports both.
  • Detailed Explanation: In a web app, you redirect the user to Entra ID, they authenticate, and a token (ID token for auth, access token for API auth) is returned. The access token is a JWT signed by Entra ID. A downstream API validates this token to authorize the call. This is the foundation for modern Azure application security.
  • Code Consideration: In ASP.NET Core, AddMicrosoftIdentityWebApi handles validation.
  • Follow‑up Question: “What is the difference between an access token and an ID token?” (Answer: Access token is for calling an API (contains scopes). ID token is for the client, containing user profile information (name, email).)

Q4: How do you implement role‑based authorization in an Azure function or web API?

  • Short Answer: Use [Authorize(Roles = "Admin")] in the code. Ensure the token contains the roles claim. In Azure, you create app roles in the application registration and assign users/groups to those roles.
  • Detailed Explanation: In the Entra ID portal, define app roles (e.g., Admin, Contributor). Assign these to users or groups via the Enterprise Application. The token issued by Entra ID will include these roles in the roles claim. The [Authorize] attribute checks this claim.
  • Code Consideration: For fine‑grained permissions, use claims‑based policy (services.AddAuthorization(options => options.AddPolicy("ReadOnly", policy => policy.RequireClaim("scp", "read")))).
  • Follow‑up Question: “What is the difference between scopes and roles?” (Answer: Scopes are permissions delegated by a user to an application (what the app can do on behalf of the user). Roles are permissions assigned to a user or group (what the user is allowed to do).)

Q5: What is Azure Key Vault and what can it store?

  • Short Answer: Key Vault is a secret store that securely stores keys, secrets (passwords, connection strings), and certificates. It provides access control, audit logging, and automatic rotation for keys.
  • Detailed Explanation: There are three types of objects: secrets, keys (for encryption, not to be extracted), and certificates. Use it for any sensitive configuration. Access is granted via access policies or RBAC. You can enable soft‑delete and purge protection to prevent accidental deletion.
  • Code Consideration: Use CertificateClient to load X509 certificates for TLS or JWT signing.
  • Follow‑up Question: “How do you allow an Azure Function to read a secret from Key Vault?” (Answer: Enable Managed Identity, grant it Key Vault Secrets User role, and use SecretClient in the function.)

Q6: How does Azure AD B2C differ from Azure AD B2B for application developers?

  • Short Answer: Azure AD B2C is for customer‑facing applications (external users). It allows users to sign up with social accounts (Google, Facebook) or email, and provides a customizable UI. Azure AD B2B is for inviting external partners into your organization’s Azure AD, granting access to internal resources.
  • Detailed Explanation: If you’re building a public e‑commerce site, use B2C to manage millions of customer identities. If you need to share a SharePoint site with a contractor, use B2B to invite their external email account. From a developer’s perspective, B2C issues tokens with custom claims. B2B tokens are standard Azure AD tokens.
  • Code Consideration: B2C uses a different authority URL and requires a sign‑up/sign‑in user flow. B2B is transparent; the guest is just a Guest user type in the tenant.
  • Follow‑up Question: “Can you combine B2C and B2B?” (Answer: Yes, you can invite B2C users as guests into an Azure AD tenant using B2B, but they will still go through the B2C sign‑in flow.)

Q7: What is a Service Principal and how is it used in CI/CD pipelines?

  • Short Answer: A Service Principal is an identity for an application (not a user). It’s used in automation to allow scripts and tools to access Azure resources without a user being signed in.
  • Detailed Explanation: In a CI/CD pipeline, you create a service principal (app registration) and give it Contributor or more granular roles on the target subscription. The pipeline uses the client ID and secret (or certificate) to authenticate and deploy resources. It’s a non‑human identity.
  • Code Consideration: az login --service-principal -u <client-id> -p <secret> --tenant <tenant-id>.
  • Follow‑up Question: “How is a service principal better than a user account for automation?” (Answer: It’s not tied to a person, can have scoped permissions, and isn’t subject to user policies like MFA or password expiration.)

Q8: How do you implement Azure Policy to enforce application security standards?

  • Short Answer: Use Azure Policy to audit or deny resources that don’t meet security requirements, such as denying public blob containers or requiring HTTPS on App Services. Write custom policies if needed.
  • Detailed Explanation: For developers, this means the environment is pre‑configured to reject insecure configurations. If you try to deploy an App Service without HTTPS, the policy denies it. This shifts security left. Built‑in policies like “Secure transfer to storage accounts should be enabled” are common.
  • Code Consideration: In your Bicep/ARM templates, ensure compliance. Use az policy assignment to apply at subscription or resource group.
  • Follow‑up Question: “How do you test a policy before enforcing it?” (Answer: Apply the policy in audit mode first, review non‑compliant resources, then switch to deny.)

Q9: How do you protect against cross‑site request forgery (CSRF) and XSS in Azure web apps?

  • Short Answer: CSRF: Use anti‑forgery tokens (ASP.NET Core includes [AutoValidateAntiforgeryToken] by default for Razor Pages). XSS: Encode output (Razor automatically encodes), use Content Security Policy (CSP) headers, and validate input.
  • Detailed Explanation: These are web application security fundamentals that still apply in the cloud. Azure Front Door or App Service can add security headers (CSP, X‑Frame‑Options). Regularly scan your application with Azure Security Center or a web vulnerability scanner.
  • Code Consideration: In startup, app.UseHsts(); and app.UseCsp(...).
  • Follow‑up Question: “How does a Web Application Firewall (WAF) help?” (Answer: WAF (on Application Gateway or Front Door) can detect and block common XSS and SQL injection attacks before they reach your app, providing an extra layer of defense.)

Q10: How do you secure communication between microservices in AKS?

  • Short Answer: Use mutual TLS (mTLS) via a service mesh like Istio, or use the Dapr mTLS functionality. This encrypts traffic and authenticates the source.
  • Detailed Explanation: By default, traffic within a Kubernetes cluster is unencrypted. Istio’s sidecar injects an Envoy proxy that transparently encrypts all pod‑to‑pod communication. Dapr also enables mTLS with a simpler configuration. Additionally, use network policies to restrict which pods can communicate.
  • Code Consideration: With Istio or Dapr, no code changes are needed; it’s infrastructure‑level configuration.
  • Follow‑up Question: “What about API authentication between microservices?” (Answer: Use JWT tokens with OAuth. The caller obtains a token from Entra ID using its Managed Identity, and the receiver validates it.)

Azure AI Application Development (8 Questions)

Q1: How do you call Azure OpenAI from an application?

  • Short Answer: Use the openai Python library or the .NET Azure.AI.OpenAI SDK. Authenticate using Managed Identity, and point the client to your Azure OpenAI or Microsoft Foundry endpoint. Use the chat completion API to send prompts and receive responses.
  • Detailed Explanation: Install the package, obtain the endpoint URL and deployment name (not model name). The code creates a ChatCompletionsOptions with messages (system, user). The response includes the generated message and token usage. Always implement streaming for better user experience and retry logic for throttling.
  • Code Consideration: var client = new OpenAIClient(endpoint, new DefaultAzureCredential()); var response = await client.GetChatCompletionsAsync(deploymentName, options);
  • Follow‑up Question: “How do you implement streaming in Azure OpenAI?” (Answer: Use GetChatCompletionsStreamingAsync and iterate over the streamed chunks.)

Q2: What is Microsoft Foundry and how does it simplify AI application development?

  • Short Answer: Microsoft Foundry is a unified AI platform that integrates Azure OpenAI, AI Search, agents, and evaluation. It provides a single endpoint and SDK (azure-ai-projects) for AI development, eliminating the need to manage multiple services individually.
  • Detailed Explanation: Instead of using a separate Azure OpenAI and AI Search key, Foundry creates a project that connects these. Developers use the OpenAI() client pointed to the project endpoint. It manages authentication, tool calling, and evaluation in one place, greatly simplifying RAG and agent‑based applications.
  • Code Consideration: var projectClient = new ProjectClient(subscriptionId, resourceGroup, resourceName, credential); var model = projectClient.GetChatCompletionClient("gpt-4o");
  • Follow‑up Question: “Do I need to rewrite my existing Azure OpenAI code to use Foundry?” (Answer: Not immediately; Azure OpenAI endpoints still work. But migrating to the unified SDK is recommended for new features.)

Q3: How do you build a simple RAG application in Azure?

  • Short Answer: Ingest documents into Azure AI Search (vector indexed). The application receives a user question, generates an embedding for it, queries the search index for relevant chunks, and then sends those chunks along with the question to Azure OpenAI to generate a grounded answer.
  • Detailed Explanation: Step 1: Use Azure.AI.Search.Documents or the Foundry tools to create an index. Step 2: When a query arrives, embed it using azure-ai-inference (embedding model). Step 3: Execute a vector search query in AI Search. Step 4: Concatenate the retrieved text into the system message: “Answer based on the following sources: …” Step 5: Return the completion.
  • Code Consideration: The whole flow can be wrapped in a single API endpoint in your App Service or function.
  • Follow‑up Question: “How do you evaluate the quality of the RAG answers?” (Answer: Use Microsoft Foundry’s evaluation pipeline with a golden dataset to measure groundedness and relevance.)

Q4: What is Prompt Flow and how do developers use it?

  • Short Answer: Prompt Flow is a development tool to build, test, and deploy LLM‑based workflows. It provides a visual canvas and Python SDK to connect prompts, LLMs, and Python functions into a flow, which can then be deployed as an API.
  • Detailed Explanation: Instead of hardcoding prompt logic in your app, you build a flow that orchestrates the steps. For example, a RAG flow: extract user intent → rewrite query → search → generate answer. The flow is versionable and evaluable. It’s deployed to a managed endpoint and called from your application.
  • Code Consideration: Use the PF SDK to test locally: pf flow test --flow . --inputs question="What is Azure?".
  • Follow‑up Question: “How does Prompt Flow integrate with CI/CD?” (Answer: You can run evaluation flows in your pipeline and only deploy if metrics are above a threshold.)

Q5: How do you handle rate limits and transient errors when calling Azure OpenAI?

  • Short Answer: Implement exponential backoff with jitter. Use the built‑in retry policies in the SDK. For 429 errors, check the Retry-After header. Monitor token usage to avoid hitting limits.
  • Detailed Explanation: The Azure OpenAI SDK can automatically retry on transient errors. Configure a max retry count. For high‑traffic applications, use a circuit breaker pattern to avoid overwhelming the service. Also, batch requests to stay within Tokens Per Minute (TPM) limits.
  • Code Consideration: Use RetryPolicy in the client options, or manually using Polly library.
  • Follow‑up Question: “What is Provisioned Throughput and how does it eliminate rate limits?” (Answer: PTU reserves dedicated capacity, so you don’t get 429s from service‑side throttling, only from your own capacity limit.)

Q6: How do you integrate Azure AI Content Safety into your application?

  • Short Answer: Use the Azure AI Content Safety SDK to analyze text and images for harmful content before sending to the user or to the model. Implement a moderation layer that blocks or flags inappropriate content.
  • Detailed Explanation: Call ContentSafetyClient.AnalyzeTextAsync with the user’s prompt. If severity exceeds a threshold, reject the request. Also apply it to the model’s output to prevent harmful responses. This is critical for customer‑facing copilots.
  • Code Consideration: Configure blocklists for specific terms or scenarios.
  • Follow‑up Question: “Is Content Safety built into Azure OpenAI?” (Answer: Yes, Azure OpenAI has default content filters. Content Safety is a separate service that offers more customization and can be used outside of AI models.)

Q7: Design a serverless chatbot that answers from a knowledge base using Azure AI services.

  • Short Answer: Use an HTTP‑triggered Azure Function as the backend. It calls Azure OpenAI with a system prompt and a search query from the user. The function first queries AI Search and includes the results as context. Everything is secured with Managed Identity and APIM.
  • Detailed Explanation: The chatbot UI (a web app) sends the user query to an API endpoint (APIM). APIM routes to the Function. The Function executes the RAG logic: embed query → search → build prompt → call OpenAI → return answer. All services are accessed via their Private Endpoints within a VNet.
  • Code Consideration: Use Durable Functions if the conversation state needs to be maintained across turns.
  • Follow‑up Question: “How would you add multi‑turn conversation?” (Answer: Maintain the chat history in the client or server session. Send the history as a list of messages with each request.)

Q8: How do you use Azure AI Search as a vector database for your application?

  • Short Answer: Create an index with a vector field. Use the Azure SDK to upload documents with their vector embeddings. At query time, provide a vector (the embedding of the query) and retrieve the nearest neighbors using cosine similarity.
  • Detailed Explanation: The AI Search SDK supports VectorSearch. When indexing, you include the embedding in the document. For queries, you can do pure vector search, or hybrid (vector + keyword) for better accuracy. AI Search also integrates with Azure OpenAI to generate embeddings during indexing via a skillset.
  • Code Consideration: SearchOptions { VectorSearch = new() { Queries = { new VectorizedQuery(vector) { KNearestNeighborsCount = 3, Fields = { "contentVector" } } } }.
  • Follow‑up Question: “What is a hybrid search?” (Answer: It combines vector similarity and traditional keyword (BM25) search scores, often using a re‑ranker to produce the best results.)

DevOps and Deployment Questions (10 Questions)

Q1: Describe your typical CI/CD pipeline for an Azure App Service.

  • Short Answer: Source code is in GitHub. On push to main, GitHub Actions builds the .NET app, runs tests, and then deploys to a staging slot using azure/webapps-deploy action. After smoke tests, a swap action moves it to production.
  • Detailed Explanation: The workflow uses dotnet build, dotnet test, dotnet publish, and then azure/webapps-deploy@v2 with publish-profile secret. For slot swap, another step uses azure/CLI@v1 to call az webapp deployment slot swap. All secrets are stored in GitHub Secrets linked to Key Vault. The pipeline is idempotent and can rollback by re‑running a previous pipeline.
  • Code Consideration: Use deployment slot settings WEBSITE_WEBDEPLOY_USE_SCM and create the slot if not exists.
  • Follow‑up Question: “How do you integrate database migrations into this pipeline?” (Answer: Add a step to run dotnet ef database update against the staging database before the swap, using a Managed Identity connection.)

Q2: What is Infrastructure as Code (IaC) and which tools do you use on Azure?

  • Short Answer: IaC manages and provisions infrastructure through machine‑readable definition files, not manual processes. The primary tools are Azure Bicep (native) and Terraform (multi‑cloud).
  • Detailed Explanation: Bicep is a domain‑specific language that transpiles to ARM JSON. It’s integrated with Azure CLI and provides state tracking. Terraform uses a declarative language (HCL) and a state file. Both allow you to version, review, and automate infrastructure changes. Use them to deploy your App Service Plans, storage accounts, and networking.
  • Code Consideration: az deployment group create --resource-group rg --template-file main.bicep.
  • Follow‑up Question: “How do you handle secrets in Bicep?” (Answer: Bicep integrates with Key Vault to reference existing secrets: adminPassword = kvSecret.getSecret('vmAdminPassword'))

Q3: How do you implement blue‑green deployment in Azure?

  • Short Answer: Deploy a new version of the app to a staging environment (slot, secondary container app). Test it. Then switch all traffic to the new environment. The old environment becomes the “green” standby. For AKS, use a separate deployment with service labels.
  • Detailed Explanation: App Service slots and Container App revisions are native blue‑green mechanisms. For AKS, you can keep two Deployments and switch the Service’s selector. Using Azure Front Door or Traffic Manager, you can gradually shift traffic (canary). Database changes must be backward‑compatible.
  • Code Consideration: In Container Apps, az containerapp revision copy creates a copy, then az containerapp revision activate and set traffic weight.
  • Follow‑up Question: “What’s the rollback procedure if the new version has a bug?” (Answer: Swap the slot back, or deactivate the new Container App revision and reactivate the old one. Rollback should be a single command/click.)

Q4: How do you manage application configuration across different environments in CI/CD?

  • Short Answer: Use environment‑specific configuration files, Azure App Configuration with labels, or transform the configuration during deployment using token replacement. Secrets are stored in environment‑specific Key Vaults.
  • Detailed Explanation: In the pipeline, you can use a task to replace values in appsettings.json based on the stage. A better approach is to use App Configuration, where the same code points to the store and selects a label like Dev, Test, Prod. This avoids changing the deployment artifact.
  • Code Consideration: dotnet publish / ./main.bicep with parameter files parameters.dev.json, parameters.prod.json.
  • Follow‑up Question: “How do you prevent production secrets from being used in dev?” (Answer: Use separate Key Vaults per environment, and assign access only to the identity of the respective environment.)

Q5: Explain the concept of “shift left” on security in Azure DevOps.

  • Short Answer: Integrate security checks early in the pipeline, not just before production. This includes static code analysis, dependency scanning, and IaC scanning (checking for misconfigurations).
  • Detailed Explanation: In GitHub Actions, add steps like github/codeql-action for code scanning, dependency‑check for vulnerable libraries, and Microsoft/security‑devops‑action for IaC templates. If a high‑severity issue is found, the pipeline fails. This prevents insecure code from ever reaching an Azure environment.
  • Code Consideration: Use tools like Checkov or tfsec to scan Bicep/Terraform.
  • Follow‑up Question: “What is DevSecOps?” (Answer: It’s the practice of embedding security into every phase of the DevOps lifecycle, making everyone responsible.)

Q6: How do you automate deployment to multiple Azure regions?

  • Short Answer: Use a matrix strategy in your pipeline to loop through regions. Each iteration deploys the infrastructure and application to a specific region, using a parameter file or variable.
  • Detailed Explanation: In GitHub Actions, define a strategy with matrix: region: [eastus, westeurope]. Each job runs the Bicep deployment with the region parameter. For the application, you deploy to the App Service in each region. After all regional deployments are successful, you update Front Door or Traffic Manager to include the new endpoints.
  • Code Consideration: Ensure naming conventions include the region to avoid conflicts: app-${region}-001.
  • Follow‑up Question: “How do you verify the deployment in each region?” (Answer: Add a post‑deployment step that runs integration tests against the regional endpoint, failing the pipeline if not healthy.)

Q7: How do you implement canary releases for Azure Functions?

  • Short Answer: Use deployment slots for App Service‑hosted Functions, or use traffic splitting on a Container Apps‑hosted function. For Consumption plans, you can’t use slots; instead, use two separate Function Apps behind an API Management instance that routes a percentage of traffic using a policy.
  • Detailed Explanation: For Premium/Dedicated Functions, slots work similarly to web apps. For Consumption, deploy a new Function App with the updated code. In APIM, create a policy that reads a context variable, and if the request falls within a percentage, route to the new function. Monitor errors and roll back by updating the policy.
  • Code Consideration: Use context.Variables["routeToCanary"] in APIM policy, set randomly.
  • Follow‑up Question: “What are the limitations of canary releases with serverless?” (Answer: Cold starts on the canary can skew performance, so you might need to keep it warmed up.)

Q8: How do you handle application secrets during local development?

  • Short Answer: Use the Secret Manager tool (dotnet user‑secrets) or environment variables. For Azure Key Vault, use DefaultAzureCredential which works with your Azure CLI credentials locally.
  • Detailed Explanation: Initialize user secrets in your project (dotnet user-secrets init). Set secrets for local use (dotnet user-secrets set "ServiceBus:ConnectionString" "..."). The configuration builder reads these locally but not in Azure. When deployed, Managed Identity takes over. Never commit local secrets.
  • Code Consideration: builder.Configuration.AddUserSecrets<Program>(); (only in Development environment).
  • Follow‑up Question: “How do you ensure a developer doesn’t accidentally use a production secret locally?” (Answer: Use separate tenants/subscriptions for dev and prod. Access to production secrets is RBAC‑controlled.)

Q9: Explain the concept of GitOps and how it applies to Azure.

  • Short Answer: GitOps uses a Git repository as the single source of truth for the desired state of a system. An operator (like Argo CD or Flux) continuously synchronizes the live cluster with the config in Git, providing automatic drift detection and rollback.
  • Detailed Explanation: Instead of a CI/CD pipeline pushing changes to a cluster, changes are made by committing to a Git repo. The operator running in the cluster pulls the changes. This is particularly powerful for AKS. For Azure resources, a similar concept can be applied with Azure Policy’s remediation tasks or using the Azure Resource Manager GitOps bridge.
  • Code Consideration: Store all Kubernetes manifests or Bicep files in a repo. Use Argo CD to watch that repo.
  • Follow‑up Question: “How does GitOps handle secrets?” (Answer: Secrets are not stored in plain Git. Use sealed secrets or an external secret manager like Key Vault with the CSI driver, referenced in the manifests.)

Q10: How do you troubleshoot a failed deployment in Azure DevOps/GitHub Actions?

  • Short Answer: Examine the pipeline logs for the exact error message. Check Azure Activity Log for the resource group. Validate the ARM template/Bicep file with az deployment group validate. Common issues: naming conflicts, resource quota exceeded, or RBAC permissions.
  • Detailed Explanation: First, look at the step that failed. If an ARM deployment failed, the error usually includes a clear message (e.g., “Invalid template” or “SkuNotAvailable”). Use az deployment group what-if to preview changes without deploying. Check the service principal’s permissions. For application errors after deployment, check Application Insights.
  • Code Consideration: Enable debug logging in the pipeline by setting the system.debug variable to true.
  • Follow‑up Question: “How do you prevent the same deployment error from happening again?” (Answer: Add a linting step in CI for Bicep/ARM (arm‑ttk), and run the what‑if operation in a pull request check.)

Azure Developer Architecture Design Scenarios

Scenario 1: Serverless Order Processing System

  • Requirements: Accept orders via HTTP, process asynchronously, send confirmation email, auto‑scale based on queue length.
  • Architecture: An HTTP‑triggered Azure Function (consumption) validates and publishes an OrderReceived message to a Service Bus topic. Two subscriptions: one triggers a function to process payment, another triggers a function to send email. All functions scale independently. Dead‑letter queues hold failed messages.
  • Azure Services: Azure Functions, Service Bus (Topic), Azure SQL, SendGrid (for email).
  • Trade‑offs: Consumption plan cold start may impact email latency slightly. If ordering is critical, consider Premium plan or a persistent instance.

Scenario 2: Enterprise REST API Platform

  • Requirements: Expose multiple APIs to partners, with versioning, throttling, and OAuth2 security. Backend logic runs on different sub‑domains.
  • Architecture: Azure Front Door (global entry) → API Management (with version sets and products). APIM routes /v1/orders to an App Service, /v2/orders to a new Container App. OAuth validation via Entra ID. APIM policies enforce rate limits and transform XML to JSON for legacy endpoints.
  • Azure Services: Front Door, APIM, App Service, Container Apps, Key Vault.
  • Trade‑offs: APIM adds latency (~5ms) and cost, but provides critical management features. Without it, you’d have to implement auth and throttling in each service.

Scenario 3: Real‑time Notification System

  • Requirements: Push updates to thousands of connected web clients.
  • Architecture: Use Azure SignalR Service with an App Service backend. The backend receives events from a Service Bus topic (or Cosmos DB change feed), processes them, and pushes to SignalR. SignalR scales to handle many connections. Clients connect via WebSocket.
  • Azure Services: SignalR Service, App Service, Cosmos DB/Service Bus.
  • Trade‑offs: SignalR Service abstracts away connection management but incurs per‑connection costs. For simple notifications, polling with Azure Functions could be cheaper.

Scenario 4: File Processing Platform

  • Requirements: Users upload files (up to 2GB). Process asynchronously, extract metadata, generate thumbnails, and provide a status API.
  • Architecture: Client uploads to Blob Storage using a SAS URL. A Blob‑triggered Function picks up the file, sends a message to a Service Bus Queue. A Queue‑triggered Function (Premium) processes the file, generating outputs and updating status in Cosmos DB. Users poll the status API.
  • Azure Services: Blob Storage, Azure Functions (Consumption + Premium), Service Bus, Cosmos DB.
  • Trade‑offs: Large files processing might exceed function time limit; move to Durable Functions with fan‑out/fan‑in.

Scenario 5: AI‑powered Customer Assistant

  • Requirements: Customers can ask product questions. AI must answer from knowledge base (PDFs). Must be secure and support 1M users.
  • Architecture: Front Door → APIM → Container Apps hosting the RAG logic. Uses Microsoft Foundry endpoint (Azure OpenAI) and Azure AI Search. Knowledge base ingested into AI Search via a separate pipeline. Chat history stored in Cosmos DB. Managed Identity throughout. Content Safety filters all input/output.
  • Azure Services: Microsoft Foundry, AI Search, Container Apps, Cosmos DB, Front Door, APIM.
  • Trade‑offs: Provisioned Throughput needed for peak times; otherwise, pay‑as‑you‑go might throttle. Hybrid search requires careful index design.

Scenario 6: Multi‑tenant SaaS Application

  • Requirements: Serve multiple customers with isolated data. Each customer has its own storage and database. Shared application layer.
  • Architecture: Single App Service Plan with a shared web app. Tenant resolution via subdomain (tenant1.app.com). Application code uses tenant‑specific connection strings stored in App Configuration (with per‑tenant key vault references). Alternatively, use a catalog database to map tenant to database. Data isolation is logical.
  • Azure Services: App Service, Azure SQL (per tenant or elastic pool), App Configuration, Key Vault.
  • Trade‑offs: Logical isolation is simpler but riskier than deploying a separate app per tenant. Elastic pools allow sharing DTUs but can cause noisy neighbor issues.

Azure Developer Frequently Asked Topics

TopicImportanceInterview FrequencyDifficulty
Azure FunctionsCriticalVery HighIntermediate
App ServiceCriticalVery HighIntermediate
Container Apps / AKSHighHighAdvanced
API ManagementHighHighIntermediate
Azure Storage & DatabasesCriticalVery HighIntermediate
Service Bus / Event GridHighHighIntermediate
Identity & Security (Entra, MI)CriticalVery HighIntermediate
CI/CD & IaCHighVery HighIntermediate
AI Application DevelopmentIncreasingHighAdvanced
Monitoring & LoggingHighMediumIntermediate

Azure Developer Best Practices

Application Design:

  • Twelve‑Factor App principles: One codebase, strict separation of config, backing services as attached resources.
  • Statelessness: Design compute to be ephemeral. Use Redis or database for session state.
  • Dependency Injection: Avoid service locator pattern. Register Azure clients centrally.
  • Configuration Externalization: Use App Configuration and Key Vault. No hardcoded strings.

Azure‑specific practices:

  • Use Managed Identity: Never use connection strings for Azure‑to‑Azure communication.
  • Use Key Vault: For all sensitive configuration, including API keys to third parties.
  • Enable Monitoring Early: Integrate Application Insights and structured logging from the start.
  • Automate Everything: From infrastructure (Bicep) to deployment (GitHub Actions). Manual steps are a source of error.
  • Design for Failure: Implement retry policies, circuit breakers, and graceful degradation.
  • Cost Awareness: Choose the right hosting plan (Consumption vs Premium), set scaling limits, and clean up resources.

Common Azure Developer Interview Mistakes

  • Treating Azure as traditional hosting: Deploying a monolithic app to a VM without leveraging PaaS.
  • Hardcoding secrets: Placing connection strings in appsettings.json or config files.
  • Ignoring scalability: Not considering how the application scales, leading to “it works on my machine” scenarios.
  • Weak error handling: Not implementing retry logic or dead‑letter queues.
  • No monitoring: Deploying an app without Application Insights and being unable to troubleshoot.
  • Service selection without requirements: Choosing AKS for a simple API without justifying the complexity.
  • Ignoring cost implications: Not knowing the difference between Consumption and Premium pricing for Functions.

Azure Developer vs Azure Solution Architect

FeatureAzure DeveloperAzure Solution Architect
CodingHeavy coding, implementing business logic, services integrationMay code proof‑of‑concepts; focuses on design and trade‑offs
ArchitectureImplements micro‑services and patterns; component designEnd‑to‑end system design, networking, governance, multi‑region
Service SelectionChooses the right SDK and configurationSelects the right Azure service for the solution
SecurityImplements authentication, Managed Identity in codeDefines security posture, zero‑trust architecture, policy
DeploymentWrites CI/CD pipelines, deployment scriptsDefines deployment strategy and environment structure
Business RequirementsTranslates user stories into technical tasksDefines non‑functional requirements and aligns with business

Azure AI

Architecture

  • [Azure Solution Architect Interview Questions] (../solution-architect/)
  • [Azure Well‑Architected Framework Interview Questions] (../questions/azure-well-architected-framework/)

Administration

  • [Azure Administrator Interview Questions] (../administrator/)

Development Services

  • [Azure Functions Interview Questions] (../questions/azure-functions/)
  • [Azure App Service Interview Questions] (../questions/azure-app-service/)
  • [Azure API Management Interview Questions] (../questions/azure-api-management/)