<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Florian Demel</title>
    <description>The latest articles on DEV Community by Florian Demel (@flrndml).</description>
    <link>https://dev.to/flrndml</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3583092%2F5ea5b568-f1f5-4776-85b4-32b9ef70efbe.jpeg</url>
      <title>DEV Community: Florian Demel</title>
      <link>https://dev.to/flrndml</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flrndml"/>
    <language>en</language>
    <item>
      <title>How to use App Service Deployment Slots (with containers)</title>
      <dc:creator>Florian Demel</dc:creator>
      <pubDate>Mon, 29 Dec 2025 13:58:44 +0000</pubDate>
      <link>https://dev.to/flrndml/how-to-use-app-service-deployment-slots-with-containers-mj4</link>
      <guid>https://dev.to/flrndml/how-to-use-app-service-deployment-slots-with-containers-mj4</guid>
      <description>&lt;h2&gt;
  
  
  TLDR
&lt;/h2&gt;

&lt;p&gt;Using Azure App Service deployment slots requires key architectural decisions early on. Running zero-downtime deployments or blue-green deployments sadly does not come 100% out of the box. This post covers my learnings and my ideal approach of an enterprise App Service setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use a single Azure Subscription&lt;/strong&gt;: This is necessary because deployment slots of one App Service cannot run across subscriptions or resource groups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a "shared" Resource Group&lt;/strong&gt;: This group holds the App Service Plan and the App Service itself, allowing slots to be managed centrally over multiple environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolate environment-specific resources&lt;/strong&gt;: Use separate Resource Groups for production and preview resources like databases and Key Vaults to maintain environment isolation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following this setup avoids the pitfalls with deployments of multiple App Service resources in multiple subscriptions for the same application. Always keep in mind that deployment slots for multiple environments do work with one App Service resource only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I have been working for quite a while now with &lt;strong&gt;Azure App Service Deployment Slots&lt;/strong&gt;, and the experience has mostly been great. It feels seamless and safe to deploy applications by swapping a container from one App Service slot to another.&lt;/p&gt;

&lt;p&gt;When working in a professional environment with App Services, deployment slots will most likely become a topic at one point. This is because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your team wants to enable &lt;strong&gt;blue-green deployments&lt;/strong&gt; to test a newly built application in a production-like environment before replacing the old version with the new one. - &lt;a href="https://www.redhat.com/en/topics/devops/what-is-blue-green-deployment" rel="noopener noreferrer"&gt;For more information, refer to Red Hat's great docs of this topic.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Or your team wants to create a second &lt;strong&gt;deployment environment&lt;/strong&gt; to integrate applications with one another before deploying them to production. - &lt;a href="https://martinfowler.com/articles/continuousIntegration.html#TestInACloneOfTheProductionEnvironment" rel="noopener noreferrer"&gt;For more information, refer to Martin Fowler's great Blog about continuous integration.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both strategies are well known and often implemented at the same time. To enable blue-green deployments and deployment environments side-by-side, you seriously need to &lt;strong&gt;make some architectural decision early on&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To prepare you for these decisions, I want to outline my preferred approach for an App Service setup and discuss its most critical topics to enable environments and slots:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environment subscription structure&lt;/li&gt;
&lt;li&gt;Deployment with and without Deployment Slots&lt;/li&gt;
&lt;li&gt;Side effects of Deployment Slots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Please note: This post will dive pretty deep into the topic, if you are not familiar with App Service deployment Slots, have a look at &lt;a href="https://learn.microsoft.com/en-us/azure/app-service/deploy-staging-slots?tabs=portal" rel="noopener noreferrer"&gt;Microsoft's deployment slot docs.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Preferred Approach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Deployment Slots basics
&lt;/h3&gt;

&lt;p&gt;A deployment slot is essentially another—closely related—App Service running on your App Service Plan alongside your existing "main" App Service. It comes with two important features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; You are able to &lt;strong&gt;configure the deployment slots and the main slot of each App Service independently&lt;/strong&gt;. This works by setting different app settings for each slot—effectively different environment variables. Microsoft calls this slot feature "unswappable settings", settings that always stay with one slot, not with the container running inside. This way you are able to configure an &lt;strong&gt;isolated development environment&lt;/strong&gt; around each of the slots.&lt;/li&gt;
&lt;li&gt; You are able to &lt;strong&gt;swap slots&lt;/strong&gt;. That means you can run new containers on a deployment slot—effectively in a specific development environment—before swapping exactly that already running version to the main slot. If you are not satisfied with the way the new container performs in the main slot, you are always able to &lt;strong&gt;roll back&lt;/strong&gt; the new container and swap the slots back to its previous version.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Beyond these two features, Azure promotes this capability heavily. &lt;a href="https://learn.microsoft.com/en-us/azure/app-service/deploy-staging-slots?tabs=portal" rel="noopener noreferrer"&gt;Have a look at the docs&lt;/a&gt; to get a broad picture of all the features coming with App Service slots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;To illustrate a typical setup, I want to make a simple example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We want to run &lt;strong&gt;one application&lt;/strong&gt; on Azure App Services in &lt;strong&gt;two environments&lt;/strong&gt;: Preview (&lt;em&gt;preview.app.com&lt;/em&gt;) and Production (&lt;em&gt;app.com&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Each application uses &lt;strong&gt;one Azure SQL database&lt;/strong&gt; and stores its environment secrets in a &lt;strong&gt;Key Vault&lt;/strong&gt;. Both resources are needed in each environment.&lt;/li&gt;
&lt;li&gt;To provision the App Service main slot (production environment) and the App Service deployment slot (preview environment) there must be &lt;strong&gt;one App Service Plan&lt;/strong&gt; resource that hosts the slots.&lt;/li&gt;
&lt;li&gt;To provision Azure SQL databases, there must be &lt;strong&gt;one SQL Database Server&lt;/strong&gt; that hosts the production and preview databases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To enable both development environments and to swap slots between preview and production, my preferred setup looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One Subscription&lt;/strong&gt;: All resources of our example are living in one subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Resource Groups&lt;/strong&gt;: The App Service resource with the main and the deployment slot, the App Service plan resources, and the Azure SQL Server are cross-environment resources. They are needed by both the production and preview environments and are part of a "shared" resource group. It is not possible to maintain one App Service resource for each environment, as Azure does not support the provisioning of slots in multiple resource groups (or subscriptions). This would force us to use multiple resources instead of multiple slots!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production Resource Groups&lt;/strong&gt;: The production database and a production Key Vault are an isolated part of the production environment, provisioned in a production resource group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview Resource Groups&lt;/strong&gt;: The preview database and a preview Key Vault are an isolated part of the preview environment, provisioned in a preview resource group.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqpd29jn8hdzrmjlpr84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqpd29jn8hdzrmjlpr84.png" alt="Resource Group Setup" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With a setup like this, we are able to maintain two isolated environments for both application environments (preview &amp;amp; production). Both have their own persistent database and separated secrets in their Key Vaults, while still being able to run everything using one App Service resource. This allows us to use the swap slot features between the two environments.&lt;/p&gt;

&lt;p&gt;To outline the architectural decisions behind this setup, the next sections dive deeper into the technical details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment subscription structure
&lt;/h2&gt;

&lt;p&gt;You may have already seen that Azure typically recommends using &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-application-environments" rel="noopener noreferrer"&gt;different Azure subscriptions for each development environment&lt;/a&gt; in its cloud adoption framework. However, I found this &lt;strong&gt;contradicts&lt;/strong&gt; the default App Service deployment slot setup for one main reason:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All environments must connect to exactly one App Service resource.&lt;/strong&gt; This is critical because an App Service can create slots only as part of the same resource and resource group. Therefore, it is not possible to use multiple deployment slots of one App Service between different subscriptions or even resource groups.&lt;br&gt;
That is why I prefer to have a shared resource group hosting the App Service. Any other approach would &lt;strong&gt;prevent swaps between the App Services runtimes of the different environments entirely&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Another option would be to use &lt;strong&gt;multiple App Service resources&lt;/strong&gt;, which could be part of different resource groups or even subscriptions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App Service resources in &lt;strong&gt;multiple subscriptions&lt;/strong&gt; would require multiple App Service plans and could possibly introduce other architectural challenges, for example, with networking, resource moving, or your IAM setup.&lt;/li&gt;
&lt;li&gt;App Service resources in &lt;strong&gt;multiple resource groups&lt;/strong&gt; would be easier to manage, as they can still run on the same App Service plan and inside the same subscription boundaries. However, you would lose the opportunity to swap slots.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;p&gt;While you might be able to solve the challenges coming with multiple subscriptions or find a viable setup with multiple resource groups, there is one thing you will not find an easy solution for: the missing swap slot feature. It is the most critical feature you would not want to lose.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kudu deployments
&lt;/h3&gt;

&lt;p&gt;Without the swap slot feature, you need to rely on Kudu deployment. &lt;a href="https://learn.microsoft.com/en-us/azure/app-service/resources-kudu" rel="noopener noreferrer"&gt;Kudu&lt;/a&gt; is the deployment engine behind App Service container deployment, which is used as soon as a container registry and image tag is set at an App Service. It pulls the container image, starts a new container, and throws the old container away as soon as the new one starts.&lt;/p&gt;

&lt;p&gt;In a setup where multiple App Service resources are used, either across resource groups or subscriptions, this deployment method is the only option to deploy. The process would look like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Kudu deploys new container to main slot -&amp;gt; publicly available&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;compared to a deployment slot deployment:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Kudu deploys new container to preview slot -&amp;gt; preview slot is tested -&amp;gt; preview slot container is swapped to main slot -&amp;gt; publicly available&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The issue with Kudu deployments is that they are &lt;strong&gt;not entirely zero-downtime&lt;/strong&gt;. Although in most cases, especially when the App Service is running on multiple instances, Kudu manages to shut down and start new containers on the different instances one after another—which keeps the application practically without downtime—this approach has some caveats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transient downtime&lt;/strong&gt;: Some users might experience issues when interacting with one of the instances that is shut down in the deployment process. As they lose their session and are redirected to the other instance, it is also possible to have different versions on different instances, which might cause issues for the users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaling&lt;/strong&gt;: The moment the container is updated by Kudu, it becomes unavailable. This basically reduces the capacity of the application, shifting more load to the other instances.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You might understand why Kudu deployments are not labeled as zero-downtime by Azure, and why they should not be used for high-professional production workloads. Nevertheless, the decision always depends on your specific use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Side Effects of Deployment Slots
&lt;/h3&gt;

&lt;p&gt;There is another method to enable zero-downtime deployments with multiple App Service resources in multiple resource groups or subscriptions: using deployment slots for each resource.&lt;/p&gt;

&lt;p&gt;This option is probably the one you must choose if your company has specific requirements for resource allocation in an environment subscription or if you want to follow Microsoft's cloud adoption framework.&lt;/p&gt;

&lt;p&gt;This option depends strongly on your individual case; often, it is fairly simple. But some cases come with pretty remarkable &lt;strong&gt;side effects&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Two Environments
&lt;/h4&gt;

&lt;p&gt;Imagine you create two applications running in the same environment. If you are using REST HTTP calls and a simple database, this is not an issue. Load balancing will pass each request to only one of the applications or instances running, and the database will prevent parallel write operations by default. You are likely fine running two apps in two slots side-by-side in one environment. There are no side effects so far.&lt;/p&gt;

&lt;p&gt;However, be aware: If you were to use the deployment slot as another testing environment now, for example with different databases, you are essentially creating another new environment besides the one already existing. This introduces even more complexity and fiddling around with the setup and resources.&lt;/p&gt;

&lt;h4&gt;
  
  
  Async Communication
&lt;/h4&gt;

&lt;p&gt;Another problematic point is async events, for example when you are using Kafka to communicate from one of your apps to another. Imagine there is an event consumed by your app that triggers it to write a new user to your database.&lt;/p&gt;

&lt;p&gt;In this case the following issue might appear: Your environment has one event publisher that sends these user events, &lt;em&gt;e.g.&lt;/em&gt; App 1. App 1 user events can now be consumed by both your main slot and your deployment slot—because both are in the same environment. You are now coming to a point where the deployment slot might "steal" the event from your main slot—because it is connected to the same user events. In this case it writes the user to its database, not the one of the main slot—so the user is not available in your main slot.&lt;/p&gt;

&lt;p&gt;Another issue could be that the deployment slot processes the event in another way than expected because it is running a different code version than the main slot.&lt;/p&gt;

&lt;p&gt;These side effects are nothing that a developer could not solve, but they are introducing another layer of complexity that someone must handle. This is often hard to grasp for application developers who do not want to dive deep into the infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap up
&lt;/h2&gt;

&lt;p&gt;Choosing the right architecture for your Azure App Service environments is critical. While Microsoft's Cloud Adoption Framework often recommends separate subscriptions, this approach conflicts with the core functionality of deployment slots, which cannot be swapped across subscription or resource group boundaries.&lt;/p&gt;

&lt;p&gt;By using a single subscription with a shared resource group for the App Service and separate, environment-specific resource groups for databases and secrets, you get the best of both worlds. You maintain clear environment isolation while retaining the powerful, zero-downtime swap capability.&lt;/p&gt;

&lt;p&gt;As always, the optimal approach depends on various factors. I hope you are now aware of the pitfalls and key decisions required for deployment slot setups.&lt;/p&gt;

&lt;h2&gt;
  
  
  About me
&lt;/h2&gt;

&lt;p&gt;My name is Florian, I am a platform engineer who wants to share his dev experience with you, hoping it makes us all a bit smarter. Please let me know what you think about my post!&lt;/p&gt;

&lt;p&gt;In case you want to see more of my posts, you can also find me on &lt;a href="https://x.com/FlrnDml" rel="noopener noreferrer"&gt;X.com&lt;/a&gt;, where I share all of my content.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>azure</category>
      <category>devops</category>
      <category>docker</category>
    </item>
    <item>
      <title>How to Dockerize a Next.js App (2025)</title>
      <dc:creator>Florian Demel</dc:creator>
      <pubDate>Sat, 29 Nov 2025 09:53:31 +0000</pubDate>
      <link>https://dev.to/flrndml/how-to-dockerize-a-nextjs-app-2025-5dlh</link>
      <guid>https://dev.to/flrndml/how-to-dockerize-a-nextjs-app-2025-5dlh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the last week, my team and I were working on a new setup of our Next.js app, and it was an annoying experience. It sometimes feels like Next.js's build functionality is designed to be overly complicated, pushing developers towards the Vercel deployment platform - while Vercel is also the creator of Next.js.&lt;/p&gt;

&lt;p&gt;Nevertheless, we took the challenge and made it work for us. Today, I want to outline our findings.&lt;/p&gt;

&lt;p&gt;You will learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to build an optimized Next.js server.&lt;/li&gt;
&lt;li&gt;How to make public files work with that build.&lt;/li&gt;
&lt;li&gt;How to package the build inside a Docker image.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How we decided to deploy
&lt;/h2&gt;

&lt;p&gt;There are multiple ways to build a Next.js app, either for a server runtime to support all features of Next.js, or for a static runtime with a limited feature set but without the need to operate a server. If you are unsure what this means, &lt;a href="https://nextjs.org/docs/pages/getting-started/deploying" rel="noopener noreferrer"&gt;read here first&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;We utilized the full feature set of Next.js and therefore need a server runtime. While Vercel, or any other kind of easily deployable adapter tooling sounds nice - &lt;a href="https://nextjs.org/docs/pages/getting-started/deploying#adapters" rel="noopener noreferrer"&gt;read here for more infos about adapters&lt;/a&gt; - we are bound to Azure, which does not offer an easy solution for the moment. &lt;/p&gt;

&lt;p&gt;So we decided to build a Docker Image with our Next.js application and deploy it to a container runtime service, specifically Azure App Service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the Next.js app standalone
&lt;/h2&gt;

&lt;p&gt;Our first step to build the Next.js app for a Docker container is a &lt;code&gt;standalone&lt;/code&gt; build. You activate it by setting the &lt;code&gt;output&lt;/code&gt; parameter in the &lt;code&gt;next.config.js&lt;/code&gt; accordingly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// next.config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;standalone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running &lt;code&gt;next build&lt;/code&gt;, the &lt;code&gt;.next/standalone&lt;/code&gt; folder of your project includes a simple &lt;code&gt;server.js&lt;/code&gt; entrypoint together with a stripped-down &lt;code&gt;node_modules&lt;/code&gt; folder including all your dependencies. The build is ready to run.&lt;/p&gt;

&lt;p&gt;If you want to test it at this point, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ./[...]/.next/standalone/server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add static resources
&lt;/h2&gt;

&lt;p&gt;After building the standalone Next.js app, you might wonder why &lt;a href="https://nextjs.org/docs/pages/api-reference/file-conventions/public-folder" rel="noopener noreferrer"&gt;public&lt;/a&gt; resources are not working. To fix it, you need to copy the &lt;code&gt;public&lt;/code&gt; folder of your Next.js app to the &lt;code&gt;.next/standalone&lt;/code&gt; build directory, together with the &lt;code&gt;.next/static&lt;/code&gt; folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; public .next/standalone/ &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; .next/static .next/standalone/.next/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;FYI: If you are working on a serious production-level build, you should consider a **CDN&lt;/em&gt;* at this point. Both the static Next.js build files (&lt;code&gt;.next/static&lt;/code&gt;) and the public resources could also be distributed by a CDN as they do not include any server runtime.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Next.js supports splitting the server and the static files. For high-scaling applications, a CDN might be the better solution. We decided not to take this route to decrease complexity for our setup.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At this point your build is ready, either to be used as-is, or to be packed into a container image.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Container Image
&lt;/h2&gt;

&lt;p&gt;When following the official Next.js guide to &lt;strong&gt;Dockerize Next.js&lt;/strong&gt;, you will come across a multi-stage container build, see &lt;a href="https://nextjs.org/docs/pages/getting-started/deploying#docker" rel="noopener noreferrer"&gt;this documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In our opinion, this is often more complex than necessary, especially if your build process already runs on a CI/CD pipeline runner. The &lt;code&gt;standalone&lt;/code&gt; output already includes the stripped-down &lt;code&gt;node_modules&lt;/code&gt; and everything needed to run the application. A simpler, single-stage Dockerfile keeps things straightforward and easy to understand. It avoids duplicating the build process inside the container, which you have likely already run on your machine or in a pipeline.&lt;/p&gt;

&lt;p&gt;This is how your &lt;code&gt;Dockerfile&lt;/code&gt; could look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Final production stage using a fixed Alpine Node image.&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NODE_ENV=production&lt;/span&gt;
&lt;span class="c"&gt;# Uncomment the following line in case you want to disable telemetry during runtime.&lt;/span&gt;
&lt;span class="c"&gt;# ENV NEXT_TELEMETRY_DISABLED=1&lt;/span&gt;

&lt;span class="c"&gt;# Create only the non-root 'nextjs' user (and its default group, also named 'nextjs')&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;adduser &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--uid&lt;/span&gt; 1001 nextjs

&lt;span class="c"&gt;# --- IMPORTANT ASSUMPTION ---&lt;/span&gt;
&lt;span class="c"&gt;# This single-stage Dockerfile relies on the following directories&lt;/span&gt;
&lt;span class="c"&gt;# being present in the local build context (pre-built application):&lt;/span&gt;
&lt;span class="c"&gt;# ./.next/standalone, ./.next/static, and ./public&lt;/span&gt;

&lt;span class="c"&gt;# Copy standalone output (server.js, node_modules, traced files) and set ownership&lt;/span&gt;
&lt;span class="c"&gt;# Ownership is now set to 'nextjs' user and its primary group (also 'nextjs')&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=nextjs:nextjs ./.next/standalone ./&lt;/span&gt;
&lt;span class="c"&gt;# Copy static assets (e.g., built JS, CSS files)&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=nextjs:nextjs ./.next/static ./.next/static&lt;/span&gt;
&lt;span class="c"&gt;# Copy public assets (e.g., favicon, robots.txt)&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=nextjs:nextjs ./public ./public&lt;/span&gt;

&lt;span class="c"&gt;# Switch to the non-root user&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; nextjs&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PORT=3000&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; HOSTNAME="0.0.0.0"&lt;/span&gt;

&lt;span class="c"&gt;# Start the Next.js server&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;code&gt;Dockerfile&lt;/code&gt; already copies the public and static directories to the correct place. So you just need to build standalone before to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;And that's it! We have successfully built a production-ready Next.js application, packaged it into a simple, single-stage Docker image, and made sure all our static and public assets are included.&lt;/p&gt;

&lt;p&gt;This approach is perfect for deploying to container runtimes like Azure App Service, Google Cloud Run, or AWS Fargate.&lt;/p&gt;

&lt;h2&gt;
  
  
  About me
&lt;/h2&gt;

&lt;p&gt;My name is Florian, I am a platform engineer who wants to share his dev experience with you, hoping it makes us all a bit smarter. Please let me know what you think about my post!&lt;/p&gt;

&lt;p&gt;In case you want to see more of my posts, you can also find me on &lt;a href="https://x.com/FlrnDml" rel="noopener noreferrer"&gt;X.com&lt;/a&gt;, where I share all of my content + daily dev news.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>docker</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to move resources between subscriptions in Azure</title>
      <dc:creator>Florian Demel</dc:creator>
      <pubDate>Sun, 23 Nov 2025 12:55:02 +0000</pubDate>
      <link>https://dev.to/flrndml/how-to-move-resources-between-subscriptions-in-azure-1ej3</link>
      <guid>https://dev.to/flrndml/how-to-move-resources-between-subscriptions-in-azure-1ej3</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Moving resources in Azure is a powerful capability, but it's not easy. The official documentation can be a maze, making it impossible to plan with all different requirements. The biggest watch-out is for your Infrastructure as Code state, as resource ID changes will break it, requiring manual state fixes. The practical path forward is often a hybrid one: move the truly irreplaceable resources, but don't be afraid to recreate everything else. It might just be faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Have you ever thought about moving resources in Azure? About moving resources that are part of a production workload to other resource groups, subscriptions, or even regions?&lt;br&gt;
I did, and the conclusion was always: &lt;strong&gt;Avoid the hassle&lt;/strong&gt; and just keep things as they are.&lt;/p&gt;

&lt;p&gt;Today I want to tell a story about my first move of a production workload from one subscription to another, and the lessons I learned doing so.&lt;br&gt;
This post will show you the important &lt;strong&gt;practical steps&lt;/strong&gt; and a summary of the theoretical details about moving resources between resource groups and subscriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Microsoft wants you to act
&lt;/h2&gt;

&lt;p&gt;When following the many MS Learn documentation available for Azure resource migration, you might become a bit confused reading about all the requirements you need to comply with. That is absolutely relatable, as there are so many different requirements regarding the relation of resources, their current place, or their networking setup.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For example, moving an Azure App Service has several requirements. The App Service and its corresponding App Service Plan must be in the same resource group to be moved together. To make it more complex, they must be moved from the resource group where the App Service was originally created. This means you first have to move the App Service Plan into the App Service's original resource group before you can move them together to a new subscription.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Why do I tell you about that? I want to make it obvious that you can not foresee all of these rules by reading one simple documentation, first because Azure documentation is too scattered and second because the rules of moving resources are too opaque.&lt;/p&gt;

&lt;p&gt;Nevertheless, there are two high-level rules that always apply:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;You need to follow the basics&lt;/strong&gt;. Azure generally does not allow the move between different Azure tenants. It does not move resources from or to a Cloud Solution Provider (CSP), one of Azure's partner companies. And it needs an active subscription. Just remember, if you are using a typical tenant with typical subscriptions, you will probably be fine. All basic rules are collected by Azure in their &lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/move-resource-group-and-subscription" rel="noopener noreferrer"&gt;move resources MS Learn page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;You need to determine whether a resource is meant to be moved at all&lt;/strong&gt;. There are 3 different move operations in Azure, a move to another &lt;strong&gt;subscription&lt;/strong&gt;, to another &lt;strong&gt;resource group&lt;/strong&gt; or to another &lt;strong&gt;region&lt;/strong&gt;. No matter which one you need, there is a &lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/move-support-resources" rel="noopener noreferrer"&gt;MS Learn page&lt;/a&gt; that will tell you which resource can be moved in which way.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Besides these 2 rules, many resources have specific rules applying to them. Often there are some limitations documented somewhere. I'd recommend a quick google search to find such document for the resources you are targeting, &lt;em&gt;e.g.&lt;/em&gt; &lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/move-limitations/app-service-move-limitations" rel="noopener noreferrer"&gt;Limitations for App Services&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be aware: Resources might change!
&lt;/h2&gt;

&lt;p&gt;There is one thing that is great about moving resources:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Despite [some...] restriction[s], [resources] continue to operate normally, and services relying on it do not experience any downtime."&lt;/em&gt; - &lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/move-resource-group-and-subscription?tabs=azure-cli#frequently-asked-questions" rel="noopener noreferrer"&gt;MS Learn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is what makes the move possible, because you do not need to worry about downtimes in the first place.&lt;/p&gt;

&lt;p&gt;But that is not entirely true. While I did not experience any issues with the resources we moved between subscriptions, you need to be aware that things might need to change before and will change after the move:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Networking&lt;/strong&gt;: The move of networking resources is widely restricted. While moving a VNet is generally possible, public IPs, peerings and resource links can not be moved at all. Follow &lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/move-limitations/networking-move-limitations" rel="noopener noreferrer"&gt;MS Learn limitation&lt;/a&gt; if you need to tackle networking.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Scope Change&lt;/strong&gt;: With the new subscription, the scope of many cross-resource functionalities changes. Alerts, RBAC and subscription quotas now apply for the new subscription. Be aware that this might break things in your setup.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resource IDs Change&lt;/strong&gt;: As the resource IDs in Azure always follow their subscription ID, the resource ID does change with a subscription move. For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/subscriptions/901a2c3d-xxxx-xxxx-xxxx-00000000/resourceGroups/rg-production-web/providers/Microsoft.Compute/virtualMachines/vm-web-01&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;will become&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/subscriptions/b54f9a8e-yyyy-yyyy-yyyy-ffffffff/resourceGroups/rg-production-web/providers/Microsoft.Compute/virtualMachines/vm-web-01&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This does not only cause Azure dashboards to break, it will also cause all &lt;strong&gt;Infrastructure as Code&lt;/strong&gt; tools, and scripts, to lose their current state with the resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Infrastructure as Code
&lt;/h2&gt;

&lt;p&gt;As resource IDs in Azure change with a move, look after your Infrastructure as Code (IaC) setup, and especially its state.&lt;/p&gt;

&lt;p&gt;Most software organizations are building upon a setup of Terraform, ARM- or Biceps templates, or any other kind of IaC tools. If you are now starting to work on resources without using IaC, which is required when moving resources, the &lt;strong&gt;IaC state will break&lt;/strong&gt; - a typical issue with IaC tools. Up to now there is no option to move resources with the IaC tools, which would solve the issue.&lt;/p&gt;

&lt;p&gt;When moving resources this &lt;strong&gt;state out of sync&lt;/strong&gt; issue can become really big depending on the amount of resources you are moving. But most likely you will corrupt your entire state. That will require you to recreate the entire state manually after the move.&lt;/p&gt;

&lt;p&gt;So looking from an IaC point of view, recreating the resources seems a lot easier than manually importing them into your state.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PS: Be aware that Azure offers some features like &lt;a href="https://learn.microsoft.com/en-us/azure/developer/terraform/azure-export-for-terraform/export-terraform-overview" rel="noopener noreferrer"&gt;export for Terraform&lt;/a&gt;, which allows you to import existing resources easily. Sadly this did not work for us but might solve your issues with importing the moved resources into your state.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why all the hassle?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"So far so good, but would it not be easier to just tear down all infrastructure and provision it all again? - With IaC that is a quick operation, which makes the resource move easier and more predictable. Why all the hassle?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A discussion like that will most likely be part of each decision regarding resource moving. And it is absolutely fair, it probably is easier in most cases. Especially if you would need to manually rebuild a big IaC state.&lt;/p&gt;

&lt;p&gt;But there are two elephants in the room.&lt;/p&gt;

&lt;p&gt;First, there are &lt;strong&gt;resources you really do not want to recreate&lt;/strong&gt; when moving. There might be a database with many TB of data that requires a long lasting backup and restore procedure, or there might be any other resource you might not want to tear down for many other reasons.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For example in my recent project there was an internal reference on one of the KeyVault secrets, that requires a Service Now ticket and a lot of waiting to be referenced again by internal IT. It was one of these things you just do not want to do again. So we decided that moving seems like the easier way.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Second, there are &lt;strong&gt;systems that need to be up and running all the time&lt;/strong&gt;. Recreating such a system would either require to spin up a second copy and hot-swapping the two systems afterward, or just moving the resources entirely. This new level of complexity might tip the scales toward the move quite quickly.&lt;/p&gt;

&lt;p&gt;While it is hard for me to answer the question if you should try to move resources, it might be worth a discussion on your side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stay Practical
&lt;/h2&gt;

&lt;p&gt;My most important learning is that you should stay practical and &lt;strong&gt;just try it out&lt;/strong&gt; yourself. After going through pages of documentation, your only way to know for sure is to see what happens. Before you touch your production environment, use a testing environment or make some prod-like test cases.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We, for example, used a deprecated service that wasn't doing a lot for the system. Downtime would not affect the system to much and after we moved it, we were sure that it is possible.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At this point I want to recommend &lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-gb/azure/resource-mover/overview" rel="noopener noreferrer"&gt;Azure Resource Mover&lt;/a&gt;&lt;/strong&gt;, an Azure tool that allows to move resource in the Azure portal. It is simple and gives great feedback before executing the move. You are able to configure the operation you'd like to execute and Azure Resource Mover will check if it might work before executing. Play around with it a bit and you will know what works and what does not.&lt;/p&gt;

&lt;p&gt;You should also remember that you do not need to go all-in on moving everything. It is perfectly fine to take a &lt;strong&gt;hybrid approach&lt;/strong&gt;. For some critical resources you absolutely can not recreate — like a database with terabytes of data — the move operation is perfect. For everything else, you might find it is faster to just recreate them from scratch in the new location and move the database into the new setup. &lt;/p&gt;

&lt;p&gt;When starting to think about hybrid solutions, you will quickly find a way that could work for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when shit hits the fan?
&lt;/h2&gt;

&lt;p&gt;Even if the move process is designed to be safe on Azure`s side, always be prepared for the unexpected.&lt;/p&gt;

&lt;p&gt;First, be &lt;strong&gt;prepared to handle an unexpected downtime&lt;/strong&gt; by having a Plan B. Make sure you know exactly how to set things up from scratch if the move fails. If you use Infrastructure as Code, this might just be your standard deployment process to the old environment, but it is a critical fallback to have ready.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For example, we moved all of our resources from one subscription to another without a downtime. Already thinking everything worked out perfect. But while recreating the state in our IaC tool Pulumi, Pulumi decided to destroy an entire resource group because it would not import a resource group correctly in its state. Things will happen...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;create backups&lt;/strong&gt;. Even though the process should not cause data loss, create backups of everything important before you start. You probably will not need them, but it is a simple and essential safety measure.&lt;/p&gt;

&lt;p&gt;Finally, do not perform a migration in secret. &lt;strong&gt;Keep your stakeholders informed&lt;/strong&gt; about what you are doing and when. Be transparent about the small possibility of downtimes.&lt;/p&gt;

&lt;p&gt;After all, it is not easy, but always remember: &lt;strong&gt;Just try it!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About me
&lt;/h2&gt;

&lt;p&gt;My name is Florian, I am a platform engineer who wants to share his dev experience with you, hoping it makes us all a bit smarter. Please let me know what you think about my post!&lt;/p&gt;

&lt;p&gt;In case you want to see more of my posts, you can also find me on &lt;a href="https://x.com/FlrnDml" rel="noopener noreferrer"&gt;X.com&lt;/a&gt;, where I share all of my content + daily dev news.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>terraform</category>
      <category>infrastructureascode</category>
    </item>
    <item>
      <title>How to pass AZ-104 or any other Azure Certificate</title>
      <dc:creator>Florian Demel</dc:creator>
      <pubDate>Sun, 09 Nov 2025 10:13:42 +0000</pubDate>
      <link>https://dev.to/flrndml/how-to-pass-az-104-or-any-other-azure-certificate-m74</link>
      <guid>https://dev.to/flrndml/how-to-pass-az-104-or-any-other-azure-certificate-m74</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Preparing for an Azure certification like the AZ-104 is not about memorizing everything - it is about understanding patterns in the questions and topics. In this post, I will tell my experience about Azure exam preparation, so you know how to approach your own certification journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Azure certificates are among the harder to pass certificates available in the software industry. When looking up information online, you will often see comments or posts about how hard to pass some Azure exams are...&lt;/p&gt;

&lt;p&gt;I myself was fairly insecure how I should handle preparation for my AZ-104 exam because of that. And it was for the good: &lt;strong&gt;You must seriously prepare for your Azure certificate&lt;/strong&gt; to pass the exam.&lt;/p&gt;

&lt;p&gt;As I would have loved to have someone coaching me before approaching my Azure journey. I want to do exactly that for you! Tell you about my &lt;strong&gt;pattern-based&lt;/strong&gt; preparation approach, and give some general information that I would have loved to have on hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to Start?
&lt;/h2&gt;

&lt;p&gt;Before even thinking about exam prep, make sure to choose the right certificate for your personal situation. There are multiple different certification paths available, inform yourself at &lt;a href="https://azure.microsoft.com/en-us/resources/training-and-certifications" rel="noopener noreferrer"&gt;Microsoft´s information page&lt;/a&gt; or read some posts on your favorite platform (e.g. Dev.to, Reddit ...).&lt;/p&gt;

&lt;p&gt;My personal hint when it comes to certificate selection: &lt;strong&gt;Match your current skill level&lt;/strong&gt;. This does not only allow you to prepare for the exam in a reasonable timeframe, it is also the way Azure wants you to move forward. Many exams require certificates as prerequisite for one another. &lt;em&gt;E.g. the AZ-305 professional requires the AZ-104 associate&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For sure you would be able to take multiple exams shortly after one another or skip some certs overall, to show for a job interview that you are at an even higher level. This is exactly what I aimed to do starting my way with Azure. And it might be a strategy that works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But&lt;/strong&gt; be aware, that there is not only knowledge required for exams to be learned from Microsoft’s material. There is additional knowledge and experience expected from your professional background with Azure. You might be able to make up for that missing experience with enough learning and preparation, but it is the hard way. Be aware that such a tactic requires more preparation time and exam experience, so it might be a bad choice for someone starting with certificates overall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparation Material
&lt;/h2&gt;

&lt;p&gt;After selecting the right certificate for your personal background and goals, get familiar with the learning material available. Not only the expected amount of knowledge for an Azure exam is huge, also is the material available for preparations out there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microsoft Resources
&lt;/h3&gt;

&lt;p&gt;The default preparation material everyone gets to see is on the overview page of each Azure certificate. There are different kinds prepared by Microsoft on their MS Learn platform:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MS Learn: Exam Courses&lt;/strong&gt; - Microsoft offers self-directed learning courses for each certificate, which covers all topics required for the exam. &lt;em&gt;E.g. For the AZ-104 Microsoft Azure Administrator exam. The &lt;a href="https://learn.microsoft.com/en-us/training/courses/az-104t00" rel="noopener noreferrer"&gt;Course AZ-104T00-A: Microsoft Azure Administrator&lt;/a&gt;.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MS Learn: Documentation&lt;/strong&gt; - Microsoft offers openly available documentation for all Azure resources and Microsoft products. This is the reference for all topics of your exam and a great tool for information about the ecosystem overall. Even better, the &lt;a href="https://learn.microsoft.com/en-us/" rel="noopener noreferrer"&gt;MS Learn page&lt;/a&gt; is available in some exams to look up details, so it pays off to have experience using it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MS Learn: Prep Videos&lt;/strong&gt; - Some certificates even have dedicated learning videos to get into the topics easier (&lt;em&gt;e.g. the &lt;a href="https://learn.microsoft.com/en-us/shows/exam-readiness-zone/preparing-for-az-104-manage-azure-identities-and-governance-1-of-5" rel="noopener noreferrer"&gt;videos to start with the az-104 exam&lt;/a&gt;&lt;/em&gt;). Even if they are linked at the certificate overview page, I personally did not get involved with them from the start up. Do not make the same mistake and start with these videos into the exam topics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MS Learn: Learning Assessment&lt;/strong&gt; - To get a feeling how real exam questions are working, Microsoft offers a practice assessment. A multiple choice quiz with questions close to a real exam. This is a great way to get a feeling for the real exam, but do not become to confident about a high score. Often there is a limited amount of questions and more work needed to pass the real thing reliably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MS Learn: Exam Sandbox&lt;/strong&gt; - Besides the practice assessment, which does not use the same UI as the real exam, there is a Exam Sandbox to get familiar with its user interface. It does not include any questions related to your exam but provides a great opportunity to peek into your exam session. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  External Resources
&lt;/h3&gt;

&lt;p&gt;While most Microsoft resources are well prepared and a great start, external providers are offering learning resources as well. As there are so many providers and kinds of resource, that I would not be able to list all of them, I want to introduce the two most common types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;External Courses&lt;/strong&gt; - For additional information about your cert´s topics there are courses available for free on platforms like YouTube (e.g. the channel &lt;a href="https://www.youtube.com/@freecodecamp" rel="noopener noreferrer"&gt;free code camp&lt;/a&gt; offers some great free videos). Also some paid services like Pluralsight or Tutorialsdojo offer courses as an addition to Microsoft´s content with high quality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exam Dumps&lt;/strong&gt; - When searching around YouTube or Google, there are some sites and videos with "real exam questions" coming up for all kinds of certs. These vendors are often trying to sell you some packages including hundreds of "real exam questions". While some of the questions are really close to the ones in the exams, they are many times outdated or served with a wrong answer. These dumps can be a great to get a feeling for the exam questions overall. But be careful when relying to much on this type of material.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Process
&lt;/h2&gt;

&lt;p&gt;Next, we want to look at the most important part of each preparation. You can think of it as 2 major steps towards your exam:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Basic Knowledge&lt;/strong&gt;: In this first step, you want to understand what the exam is all about.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deep Dive&lt;/strong&gt;: In the second step, you need to transfer knowledge and get the context and patterns needed for the exam.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Basic Knowledge
&lt;/h3&gt;

&lt;p&gt;After you made the decision to acquire one of Azure´s exams, you will first need to get into exam´s topics. This is the part where you are preparing for the exam the „good old" way by going through Microsoft´s preparation materials and remembering all the information about Azure´s products.&lt;/p&gt;

&lt;p&gt;Your most important overview of the exam topics, is the topic overview of your exams &lt;strong&gt;study guide&lt;/strong&gt;. It is a list of all topics needed for your exam. Make sure to have the guide for your respective exam always on hand. You will find the overview directly at the exam page (&lt;em&gt;e.g. the &lt;a href="https://learn.microsoft.com/en-us/credentials/certifications/resources/study-guides/az-104" rel="noopener noreferrer"&gt;study guide of the AZ-104 exam&lt;/a&gt;&lt;/em&gt;). Become familiar with each of the listed topics. Your first step will automatically be the Microsoft Learn exam courses. Focus especially on the &lt;strong&gt;practical exercises&lt;/strong&gt; coming up, which will guide your through a learning version of the Azure Portal, as practical knowledge is fairly likely to be tested in the exams.&lt;/p&gt;

&lt;p&gt;I myself intensively went through all the learning paths, and went through most practical exercises for my AZ-104 exam. This took me at least a good 2 days, but was worth it.&lt;/p&gt;

&lt;p&gt;After finishing the exam courses, you will feel at least 80% ready for the exam. But do not get fooled to much. After doing your first &lt;strong&gt;learning assessment&lt;/strong&gt;, you will probably be back on the ground. For most exams you might be at around 30% of your preparation journey now - just to throw in a guess. Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do I feel confident enough to explain all the exam topics to another dev?&lt;/li&gt;
&lt;li&gt;Am I missing any of the exams topics?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should be able to explain each topic of the overview at least on the surface level now. If you are missing a topic, move to different sources besides the learning path. I would suggest to get your hands on one of two other leaning products:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are generally unfamiliar with the topics of the exam or Azure&lt;/strong&gt;,&lt;br&gt;
consider a learning course of an external provider. There might be a freely available YouTube video. Consider a paid one too, if there are no free high quality options. Be careful about one thing: Outdated resource. Most exams do not change often. But if you encounter topics in Microsoft external guides you never heard of before, compare them with the study guide overview.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are familiar with the Azure world&lt;/strong&gt;,&lt;br&gt;
Read the MS Learn documentation about the topics missing or shortcoming in the learning paths. This is feeling hard, but it will get you into all details to understand what’s going on.&lt;/p&gt;

&lt;p&gt;Now you should be prepared for all topics of you exam, one last personal hint before moving to the next step: Work with &lt;strong&gt;flash cards&lt;/strong&gt;. I created 500 flash cards for my AZ-104 exam, covering the basic fundamentals of each topic. This helped me a lot to remember all the basic information. A great tool to keep your knowledge fresh and remember things effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deep Dive
&lt;/h3&gt;

&lt;p&gt;After understanding all exam topics, you probably did some learning assessments already. Maybe you realized, that some of the details required in the questions are &lt;strong&gt;really&lt;/strong&gt; detailed. Maybe you even thought that you would not be able to remember all of the little details about all topics at all. That´s where it gets interesting. To solve this issue, you will need to be able to transfer knowledge, apply it to new situations and find patterns for your exam. That´s what I am calling it the &lt;strong&gt;pattern-based&lt;/strong&gt; approach.&lt;/p&gt;

&lt;p&gt;The Deep Dive is - because of that - not only about remembering all topics entirely. It is about finding the patterns in the topics that are relevant for your exam, which will get you through the exam safely. Do be fooled - It is true that you can not learn all details of all products. But you can learn which patterns are used in the question and prepare to transfer these patterns to the questions in your exam. Let’s make an example to show you the twist.&lt;/p&gt;

&lt;p&gt;This is a question example as it might appear in the AZ-104 practice assessment:&lt;/p&gt;




&lt;p&gt;Question: &lt;em&gt;Your Microsoft Entra tenant and on-premises Active Directory domain contain multiple users.&lt;br&gt;
You need to configure self-service password reset (SSPR) password writeback functionality. The solution must minimize costs.&lt;br&gt;
Which Microsoft Entra ID edition should you use?&lt;br&gt;
Select only one answer.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID Free&lt;/li&gt;
&lt;li&gt;Microsoft Entra ID P1&lt;/li&gt;
&lt;li&gt;Microsoft Entra ID P2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answer: &lt;em&gt;Only Microsoft Entra ID P1 and P2 support SSPR, but Microsoft Entra ID P1 is the lower cost option.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;To know the correct answer to this question you must be aware of the different Entra licenses and their features. This might have been one of the details about Entra ID that you probably did not remember even with preparation in the first step. But after reading this questions you understood a &lt;strong&gt;first pattern&lt;/strong&gt;: There are multiple Entra licenses with different features.&lt;/p&gt;

&lt;p&gt;This is not the only question of all AZ-104 questions related to Entra licenses and the features coming with the respective license. Take a note here: You want to &lt;strong&gt;search for patterns like that&lt;/strong&gt;. If there is a question related to Entra licenses and the features coming with it, be aware of all Entra licenses and all the features coming with the different ones because that might be a pattern coming up for all license tiers and features. Sounds easy right. &lt;/p&gt;

&lt;p&gt;To make an example, the following question could be one of the questions coming up in the real exam as well. It could look like this:&lt;/p&gt;




&lt;p&gt;Question: &lt;em&gt;Your Microsoft Entra tenant and on-premises Active Directory domain contain multiple users.&lt;br&gt;
You need to enforce MFA for specific SaaS apps integrated with SSO The solution must minimize costs.&lt;br&gt;
Which Microsoft Entra ID edition should you use?&lt;br&gt;
Select only one answer.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID Free&lt;/li&gt;
&lt;li&gt;Microsoft Entra ID P1&lt;/li&gt;
&lt;li&gt;Microsoft Entra ID P2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answer: &lt;em&gt;Only Microsoft Entra ID P1 and P2 support MFA with SSO, but Microsoft Entra ID P1 is the lower cost option.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Azure works exactly with patterns like that. Make sure that you focus on patterns and learn all the little details included in the patterns.&lt;/p&gt;

&lt;p&gt;But how do you find questions to extract patterns from?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Learning Assessment&lt;/strong&gt;: Use the questions Microsoft offers in its learning assessments. They are easy accessible and cover many patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exam Dumps&lt;/strong&gt;: For everyone, who is searching around for more information online, you probably already found some kind of exam dump. They might not always have the correct answer for all questions, neither are all of these "real exam questions" real exam questions. But these dumps are a great source for patterns as well.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After all, you know your learning type and how you remember information the best way for yourself. But when it is about what kind of information is important for the exam. Focus on &lt;strong&gt;Patterns&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Surroundings
&lt;/h2&gt;

&lt;p&gt;Besides the obvious preparation - learning things - there are some soft skills supporting you to pass the exam.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple Choice Questions
&lt;/h3&gt;

&lt;p&gt;Most questions in Azure exams are multiple choice questions. That is great, because these kind of questions are not about the exact details, they are about understanding the options available to cross out wrong answers. Follow one famous rule for multiple choice: Do not get into to much thinking about the right answer, just try to figure out which ones are not the right one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time Management, Exam Design &amp;amp; MS Learn
&lt;/h3&gt;

&lt;p&gt;There is not lots of time in your Azure certificates exam, but from my perspective the time is not rushing to fast either. One thing that might get you into trouble is the option to open MS Learn in the exam (which is possible in many, but not all, exams). It is tempting to look up details you do not know. But do not spend to much time doing so. Go through the questions you can answer first, mark the ones you can not answer and before finishing a section of the exam, search for all MS Learn details at once with a fixed number of minutes. So you will be able to manage your time properly.&lt;/p&gt;

&lt;p&gt;Be aware that most exams are divided into multiple sections. You will not be able to repeat all question at the end, each sections is like a mini exam that is over as soon as you finished it. So be aware of the structure and plan your MS Learn time accordingly.&lt;/p&gt;

&lt;p&gt;Some of the sections are designed, so you can not answer a question twice. Be aware of such details and read the descriptions in the exam carefully. After all, clicking through the exam sandbox is a great way to get the feel for the exam user interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;This is the final "pass the exam" checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take the right exam for your skill level&lt;/li&gt;
&lt;li&gt;Get familiar with the available materials&lt;/li&gt;
&lt;li&gt;Learn all topics the "hard way"&lt;/li&gt;
&lt;li&gt;Use some additional materials, if the Microsoft one are not sufficient for all topics&lt;/li&gt;
&lt;li&gt;Focus on patterns and understand them&lt;/li&gt;
&lt;li&gt;Do not mess your time management up&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hope you are now feeling ready to finally book an exam ;)&lt;/p&gt;

</description>
      <category>azure</category>
      <category>tutorial</category>
      <category>career</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
