diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/Readme.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/Readme.md index cae117adf..fb658b192 100644 --- a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/Readme.md +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/Readme.md @@ -3,13 +3,8 @@ - [**MicroHack Introduction**](#MicroHack-introduction) - [What is the next generation of modernization and why does it matter](#what-is-the-next-generation-of-modernization-and-why-does-it-matter) - [**MicroHack Context**](#microhack-context) -- [**MicroHack Objectives**](#objectives) +- [**MicroHack Objectives**](#microhack-objectives) - [**MicroHack Challenges**](#microhack-challenges) - - [General prerequisites](#general-prerequisites) - - [Challenge 1 - Understand the migratable estate](#challenge-1---understand-the-migratable-estate) - - [Challenge 2 - Containerize the Application](#challenge-2---containerize-the-application) - - [Challenge 3 - Create the Container App](#challenge-3---create-the-container-app) - - [Challenge 4 - Make the Container App Production Ready](#challenge-4---make-the-container-app-production-ready) - [**Contributors**](#contributors) ## MicroHack Introduction @@ -64,182 +59,23 @@ It may take up to 5 minutes for the web app to start in the background. You also need to fork this GitHub repository that you will work with: https://github.com/ArneDecker3v08mk/MicroHack-AppServiceToContainerAppStart -## Challenge 1 - Understand the migratable estate -### Goal +### Challenges -Before a migration can start you need to first understand what needs to be migrated and why. The first challenge is therefore about analyzing the current application and hosting environment. You will compare classic deployments (like the Azure App Service) with containerized deployments to understand the differences and advantages of both approaches. +* [Challenge 1 - Understand the migratable estate](challenges/challenge-01.md) **<- Start here** +* [Challenge 2 - Containerize the Application](challenges/challenge-02.md) +* [Challenge 3 - Create the Container App](challenges/challenge-03.md) +* [Challenge 4 - Make the Container App Production Ready](challenges/challenge-04.md) +* [Challenge 5 - Host Your Own AI Models](challenges/challenge-05.md) -### Actions +### Solutions - Spoilerwarning -Have a look in the Git repository of the application and the App Service resource in Azure to familiarize yourself with the current environment. Then answer these questions: +* [Solution 1 - Prerequisites and Landing Zone](./walkthrough/challenge-01/solution-01.md) +* [Solution 2 - Containerize the Application](./walkthrough/challenge-02/solution-02.md) +* [Solution 3 - Create the Container App](./walkthrough/challenge-03/solution-03.md) +* [Solution 4 - Make the Container App Production Ready](./walkthrough/challenge-04/solution-04.md) +* [Solution 5 - Host Your Own AI Models](./walkthrough/challenge-05/solution-05.md) -* In which framework and version is the application written? -* On which operating system (Windows or Linux) is the application currently running? -* What message does the application state when you open in the browser? - - -**!!!Important: You can ignore the text fields and the button for now, the functionality behind it will be added in the last challenge!!!** - -Read through the learning resources and answer the following questions: - -* What is containerization and what is a container? -* What are typical advantages of containerization? -* Why would a migration from a PaaS hosting to containerization make sense? -* Which container services are available on Azure? - -Bonus question: - -When migrating from the App Service to a containerized hosting, which service would be most suitable from you point of view? - -### Success criteria - -* You answered all questions from above -* You have an overview of containerization and PaaS (and respective Azure services) -* You successfully started the web app in your browser - -### Learning resources - -* [Container introduction](https://resources.github.com/devops/containerization/) -* [Docker introduction](https://learn.microsoft.com/en-us/training/modules/intro-to-docker-containers/) -* [Containerization vs. PaaS](https://www.techtarget.com/searchcloudcomputing/feature/PaaS-and-containers-Key-differences-similarities-and-uses) -* [Azure Services](https://learn.microsoft.com/en-us/azure/container-apps/compare-options) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-1/solution.md) - -## Challenge 2 - Containerize the Application - -### Goal -Before the application can be deployed to a Container App, it needs to be containerized. As you already know, this means encapsulating the application code with all dependencies and required software into a container image. The images are typically stored ("pushed") in a container registry, from which they can loaded ("pulled") to be deployed into a container hosting service. - -### Actions - -* Create an Azure Container Registry -* Setup a new GitHub Actions workflow in the repository to build the application
While we will stick to the GitHub terminology and call it a workflow, in CI/CD and DevOps terms this is also known as a pipeline -* Create a Dockerfile and add it into the repository -* Add steps to the GitHub Actions workflow to containerize the application and push the image into the container registry - -### Success criteria - -* You have created the Azure Container Registry -* You created a new GitHub Actions workflow -* You created a workflow that pushes a deployable container image to the registry - -### Learning resources - -* [Creating an Azure Container Registry](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal?tabs=azure-cli) -* [Creating a GitHub Actions pipeline](https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net) -* [Docker and .NET](https://learn.microsoft.com/en-us/dotnet/core/docker/introduction) -* [Azure Container Registry Build](https://github.com/marketplace/actions/azure-container-registry-build) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-2/solution.md) - -## Challenge 3 - Create the Container App - -### Goal - -Now that you have a deployable container image, you can setup the Container App to host you web app. As described above, you will use the Container Apps because it is a simple, scalable and straight-forward service that is perfectly suitable for this use case. However, the container image is highly portable and could be deployed into other container services as well. - -### Actions - -* Create an Azure Container App and the Environment -* Automate the deployment with GitHub Actions -* Make a change and deploy it - -Hint: Use this workflow task to get the latest container image tag from the registry. You can insert the task after the login to Azure and then use the variable `image_tag`: - - - name: Get Latest Container Image Tag - id: get_tag - run: | - TAG=$(az acr repository show-tags --name microhackregistry --repository microhackapp --orderby time_desc --output tsv --detail | head -n 1 | awk '{print $4}') - NUMERIC_TAG=$(echo "$TAG" | grep -oE '[0-9]+') - INCREMENTED_TAG=$((NUMERIC_TAG + 1)) - UPDATED_TAG=$(echo "$TAG" | sed "s/$NUMERIC_TAG/$INCREMENTED_TAG/") - echo "image_tag=$UPDATED_TAG" >> $GITHUB_OUTPUT - -### Success Criteria - -* You successfully deployed the container image to the Container App -* You can access the newly hosted web app -* You can make changes to the web app and deploy them into the Container App - -### Learning resources - -* [Creating an Azure Container App](https://learn.microsoft.com/en-us/azure/container-apps/quickstart-portal) -* [Connection Azure and GitHub (use option 2)](https://learn.microsoft.com/en-us/azure/developer/github/connect-from-azure-openid-connect) -* [Deploying Azure Container Apps with GitHub 1](https://learn.microsoft.com/en-us/azure/container-apps/github-actions) -* [Deploying Azure Container Apps with GitHub 2](https://github.com/Azure/container-apps-deploy-action) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-3/solution.md) - -## Challenge 4 - Make the Container App Production Ready - -### Goal - -Now that the app is up and running and you can deploy changes quickly, it is time to make some enhancements to make your application ready for production. - -### Actions - -* Enable authentication with Azure Entra ID -* Configure Autoscaling to 200 concurrent connections with 1 to 10 replicas -* Enable monitoring and logging -* Configure encryption - -### Success criteria - -* You have enabled authentication with Azure Entra ID -* You have configured the autoscaling rules -* You can check the logs in the Log Analytics workspace -* All traffic to/from the Container App is encrypted - -### Learning resources - -* [Enable Authentication on Azure Container Apps](https://learn.microsoft.com/en-us/azure/container-apps/authentication-azure-active-directory) -* [Scaling Azure Container Apps](https://learn.microsoft.com/en-us/azure/container-apps/scale-app?pivots=azure-portal) -* [Monitoring with Azure Container Apps](https://learn.microsoft.com/en-us/azure/container-apps/log-monitoring?tabs=bash) -* [Loggin with Azure Container Apps](https://learn.microsoft.com/en-us/azure/container-apps/log-options) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-4/solution.md) - -## Challenge 5 - Host Your Own AI Models - -### Goal - -Your production-ready Container App is still missing one thing, you cannot really use it for anything, yet. Time to host your own small AI model that you can chat with via the app. - -### Actions - -* Host an Ollama container image in a second Container App (or any other model) -* Start an Ollama model in the Container App -* Add the URL of the AI app to your main app via an environment variable - -### Success criteria - -* You can chat with an AI model via your app - -### Learning resources - -* [Ollama documentation](https://github.com/ollama/ollama) -* [Ollama on Docker Hub](https://hub.docker.com/r/ollama/ollama) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-5/solution.md) - -## Finish - -Congratulations! You finished! -As you saw, containerizing and deploying an application is no rocket science. The Azure Container Apps will take over most of the work so you can focus on your application instead of the hosting. - -Thank you for investing the time and see you next time! ## Contributors * Nils Bankert [GitHub](https://github.com/nilsbankert); [LinkedIn](https://www.linkedin.com/in/nilsbankert/) diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-01.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-01.md new file mode 100644 index 000000000..2e74327c1 --- /dev/null +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-01.md @@ -0,0 +1,43 @@ +# Challenge 1 - Understand the migratable estate + +**[Home](../Readme.md)** - [Next Challenge Solution](challenge-02.md) + +## Goal + +Before a migration can start you need to first understand what needs to be migrated and why. The first challenge is therefore about analyzing the current application and hosting environment. You will compare classic deployments (like the Azure App Service) with containerized deployments to understand the differences and advantages of both approaches. + +## Actions + +Have a look in the Git repository of the application and the App Service resource in Azure to familiarize yourself with the current environment. Then answer these questions: + +* In which framework and version is the application written? +* On which operating system (Windows or Linux) is the application currently running? +* What message does the application state when you open in the browser? + + +**!!!Important: You can ignore the text fields and the button for now, the functionality behind it will be added in the last challenge!!!** + +Read through the learning resources and answer the following questions: + +* What is containerization and what is a container? +* What are typical advantages of containerization? +* Why would a migration from a PaaS hosting to containerization make sense? +* Which container services are available on Azure? + +Bonus question: + +When migrating from the App Service to a containerized hosting, which service would be most suitable from you point of view? + +## Success criteria + +* You answered all questions from above +* You have an overview of containerization and PaaS (and respective Azure services) +* You successfully started the web app in your browser + +## Learning resources + +* [Container introduction](https://resources.github.com/devops/containerization/) +* [Docker introduction](https://learn.microsoft.com/en-us/training/modules/intro-to-docker-containers/) +* [Containerization vs. PaaS](https://www.techtarget.com/searchcloudcomputing/feature/PaaS-and-containers-Key-differences-similarities-and-uses) +* [Azure Services](https://learn.microsoft.com/en-us/azure/container-apps/compare-options) + diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-02.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-02.md new file mode 100644 index 000000000..5e29195f6 --- /dev/null +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-02.md @@ -0,0 +1,27 @@ +# Challenge 2 - Containerize the Application + +[Previous Challenge Solution](challenge-01.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-03.md) + +## Goal +Before the application can be deployed to a Container App, it needs to be containerized. As you already know, this means encapsulating the application code with all dependencies and required software into a container image. The images are typically stored ("pushed") in a container registry, from which they can loaded ("pulled") to be deployed into a container hosting service. + +## Actions + +* Create an Azure Container Registry +* Setup a new GitHub Actions workflow in the repository to build the application
While we will stick to the GitHub terminology and call it a workflow, in CI/CD and DevOps terms this is also known as a pipeline +* Create a Dockerfile and add it into the repository +* Add steps to the GitHub Actions workflow to containerize the application and push the image into the container registry + +## Success criteria + +* You have created the Azure Container Registry +* You created a new GitHub Actions workflow +* You created a workflow that pushes a deployable container image to the registry + +## Learning resources + +* [Creating an Azure Container Registry](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal?tabs=azure-cli) +* [Creating a GitHub Actions pipeline](https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net) +* [Docker and .NET](https://learn.microsoft.com/en-us/dotnet/core/docker/introduction) +* [Azure Container Registry Build](https://github.com/marketplace/actions/azure-container-registry-build) + diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-03.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-03.md new file mode 100644 index 000000000..ba67b15d9 --- /dev/null +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-03.md @@ -0,0 +1,38 @@ +# Challenge 3 - Create the Container App + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-04.md) + +## Goal + +Now that you have a deployable container image, you can setup the Container App to host you web app. As described above, you will use the Container Apps because it is a simple, scalable and straight-forward service that is perfectly suitable for this use case. However, the container image is highly portable and could be deployed into other container services as well. + +## Actions + +* Create an Azure Container App and the Environment +* Automate the deployment with GitHub Actions +* Make a change and deploy it + +Hint: Use this workflow task to get the latest container image tag from the registry. You can insert the task after the login to Azure and then use the variable `image_tag`: + + - name: Get Latest Container Image Tag + id: get_tag + run: | + TAG=$(az acr repository show-tags --name microhackregistry --repository microhackapp --orderby time_desc --output tsv --detail | head -n 1 | awk '{print $4}') + NUMERIC_TAG=$(echo "$TAG" | grep -oE '[0-9]+') + INCREMENTED_TAG=$((NUMERIC_TAG + 1)) + UPDATED_TAG=$(echo "$TAG" | sed "s/$NUMERIC_TAG/$INCREMENTED_TAG/") + echo "image_tag=$UPDATED_TAG" >> $GITHUB_OUTPUT + +## Success Criteria + +* You successfully deployed the container image to the Container App +* You can access the newly hosted web app +* You can make changes to the web app and deploy them into the Container App + +## Learning resources + +* [Creating an Azure Container App](https://learn.microsoft.com/en-us/azure/container-apps/quickstart-portal) +* [Connection Azure and GitHub (use option 2)](https://learn.microsoft.com/en-us/azure/developer/github/connect-from-azure-openid-connect) +* [Deploying Azure Container Apps with GitHub 1](https://learn.microsoft.com/en-us/azure/container-apps/github-actions) +* [Deploying Azure Container Apps with GitHub 2](https://github.com/Azure/container-apps-deploy-action) + diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-04.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-04.md new file mode 100644 index 000000000..c3a3933da --- /dev/null +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-04.md @@ -0,0 +1,29 @@ +# Challenge 4 - Make the Container App Production Ready + +[Previous Challenge Solution](challenge-03.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-05.md) + +## Goal + +Now that the app is up and running and you can deploy changes quickly, it is time to make some enhancements to make your application ready for production. + +## Actions + +* Enable authentication with Azure Entra ID +* Configure Autoscaling to 200 concurrent connections with 1 to 10 replicas +* Enable monitoring and logging +* Configure encryption + +## Success criteria + +* You have enabled authentication with Azure Entra ID +* You have configured the autoscaling rules +* You can check the logs in the Log Analytics workspace +* All traffic to/from the Container App is encrypted + +## Learning resources + +* [Enable Authentication on Azure Container Apps](https://learn.microsoft.com/en-us/azure/container-apps/authentication-azure-active-directory) +* [Scaling Azure Container Apps](https://learn.microsoft.com/en-us/azure/container-apps/scale-app?pivots=azure-portal) +* [Monitoring with Azure Container Apps](https://learn.microsoft.com/en-us/azure/container-apps/log-monitoring?tabs=bash) +* [Loggin with Azure Container Apps](https://learn.microsoft.com/en-us/azure/container-apps/log-options) + diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-05.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-05.md new file mode 100644 index 000000000..439caf36d --- /dev/null +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/challenge-05.md @@ -0,0 +1,23 @@ +# Challenge 5 - Host Your Own AI Models + +[Previous Challenge Solution](challenge-04.md) - **[Home](../Readme.md)** - [Next Challenge Solution](finish.md) + +## Goal + +Your production-ready Container App is still missing one thing, you cannot really use it for anything, yet. Time to host your own small AI model that you can chat with via the app. + +## Actions + +* Host an Ollama container image in a second Container App (or any other model) +* Start an Ollama model in the Container App +* Add the URL of the AI app to your main app via an environment variable + +## Success criteria + +* You can chat with an AI model via your app + +## Learning resources + +* [Ollama documentation](https://github.com/ollama/ollama) +* [Ollama on Docker Hub](https://hub.docker.com/r/ollama/ollama) + diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/finish.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/finish.md new file mode 100644 index 000000000..8fec77f2f --- /dev/null +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/challenges/finish.md @@ -0,0 +1,11 @@ +# Finish + +[Previous Challenge Solution](challenge-05.md) - **[Home](../Readme.md)** + +## Congratulations + +You finished the MicroHack *AppService to ContainerApps*. +If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. + +Thank you for investing the time and see you next time! + diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-1/img/challenge-1-operatingsystem.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-01/img/challenge-1-operatingsystem.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-1/img/challenge-1-operatingsystem.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-01/img/challenge-1-operatingsystem.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-1/img/challenge-1-runtimestack.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-01/img/challenge-1-runtimestack.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-1/img/challenge-1-runtimestack.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-01/img/challenge-1-runtimestack.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-1/img/challenge-1-url.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-01/img/challenge-1-url.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-1/img/challenge-1-url.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-01/img/challenge-1-url.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-1/solution.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-01/solution-01.md similarity index 98% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-1/solution.md rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-01/solution-01.md index c1496ac4d..46cac0d48 100644 --- a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-1/solution.md +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-01/solution-01.md @@ -1,5 +1,7 @@ # Walkthrough Challenge 1 - Prerequisites and Landing Zone +**[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-02/solution-02.md) + Duration: 30 minutes ### **Familiarize yourself with the app/environment** @@ -71,4 +73,4 @@ When migrating from the App Service to a containerized hosting, which service wo You successfully completed challenge 1! πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-2/solution.md) + diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-acrimage.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-acrimage.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-acrimage.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-acrimage.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-acrkeys.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-acrkeys.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-acrkeys.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-acrkeys.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-blankworkflow.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-blankworkflow.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-blankworkflow.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-blankworkflow.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-commitworkflow.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-commitworkflow.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-commitworkflow.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-commitworkflow.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createdockerfile.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createdockerfile.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createdockerfile.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createdockerfile.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createregistry.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createregistry.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createregistry.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createregistry.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createsecret.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createsecret.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createsecret.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createsecret.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createsecret2.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createsecret2.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createsecret2.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createsecret2.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createworkflow.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createworkflow.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-createworkflow.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-createworkflow.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-dockerfile.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-dockerfile.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-dockerfile.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-dockerfile.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-newworkflow.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-newworkflow.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-newworkflow.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-newworkflow.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-runworkflow.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-runworkflow.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-runworkflow.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-runworkflow.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-runworkflow2.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-runworkflow2.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-runworkflow2.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-runworkflow2.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-workflowtest.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-workflowtest.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/img/challenge-2-workflowtest.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/img/challenge-2-workflowtest.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/solution.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/solution-02.md similarity index 97% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/solution.md rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/solution-02.md index aaf23850c..c274a2954 100644 --- a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-2/solution.md +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-02/solution-02.md @@ -1,10 +1,8 @@ # Walkthrough Challenge 2 - Containerize the Application -Duration: 60 minutes - -## Prerequisites +[Previous Challenge Solution](../challenge-01/solution-01.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-03/solution-03.md) -Please make sure thet you successfully completed [Challenge 1](../challenge-1/solution.md) before continuing with this challenge. +Duration: 60 minutes ### **Task 1: Create an Azure Container Registry** @@ -207,4 +205,3 @@ Check the container repository in the Azure Container Registry to make sure that You successfully completed challenge 2! πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-3/solution.md) \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-appbasics.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-appbasics.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-appbasics.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-appbasics.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-appcontainer.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-appcontainer.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-appcontainer.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-appcontainer.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-appingress.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-appingress.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-appingress.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-appingress.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-appurl.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-appurl.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-appurl.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-appurl.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-changes.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-changes.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-changes.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-changes.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-environmentbasics.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-environmentbasics.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-environmentbasics.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-environmentbasics.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-environmentmonitoring.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-environmentmonitoring.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-environmentmonitoring.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-environmentmonitoring.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-environmentworkloadprofiles.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-environmentworkloadprofiles.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-environmentworkloadprofiles.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-environmentworkloadprofiles.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identityassignment-member.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identityassignment-member.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identityassignment-member.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identityassignment-member.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identityassignment-role.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identityassignment-role.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identityassignment-role.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identityassignment-role.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identityassignment.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identityassignment.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identityassignment.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identityassignment.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identitycreate.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identitycreate.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identitycreate.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identitycreate.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identitycredentials.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identitycredentials.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identitycredentials.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identitycredentials.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identitycredentialscreate.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identitycredentialscreate.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identitycredentialscreate.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identitycredentialscreate.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identityinfo.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identityinfo.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-identityinfo.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-identityinfo.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-repositorysecrets.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-repositorysecrets.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/challenge-3-repositorysecrets.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/challenge-3-repositorysecrets.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/chellenge-3-githuborgname.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/chellenge-3-githuborgname.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/chellenge-3-githuborgname.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/chellenge-3-githuborgname.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/chellenge-3-result.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/chellenge-3-result.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/img/chellenge-3-result.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/img/chellenge-3-result.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/solution.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/solution-03.md similarity index 98% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/solution.md rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/solution-03.md index ed873072d..916ba1b2e 100644 --- a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-3/solution.md +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-03/solution-03.md @@ -1,10 +1,8 @@ # Walkthrough Challenge 3 - Create the Container App -Duration: 60 minutes - -## Prerequisites +[Previous Challenge Solution](../challenge-02/solution-02.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-04/solution-04.md) -Please make sure thet you successfully completed [Challenge 2](../challenge-2/solution.md) before continuing with this challenge. +Duration: 60 minutes ### **Task 1: Create the Container App and the Environment** @@ -220,4 +218,3 @@ Right now, your workflow still uses the ACR name and password to authenticate to You successfully completed challenge 3! πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-4/solution.md) diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-authentication.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-authentication.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-authentication.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-authentication.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-authenticationselection.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-authenticationselection.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-authenticationselection.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-authenticationselection.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-authenticationsetup.jpeg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-authenticationsetup.jpeg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-authenticationsetup.jpeg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-authenticationsetup.jpeg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-authenticationsetup.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-authenticationsetup.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-authenticationsetup.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-authenticationsetup.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-logging.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-logging.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-logging.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-logging.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-loggingquery.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-loggingquery.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-loggingquery.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-loggingquery.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-scaling.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-scaling.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-scaling.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-scaling.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-scalingrule.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-scalingrule.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/img/challenge-4-scalingrule.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/img/challenge-4-scalingrule.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/solution.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/solution-04.md similarity index 95% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/solution.md rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/solution-04.md index 5ca9486d8..5a3cd3626 100644 --- a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-4/solution.md +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-04/solution-04.md @@ -1,10 +1,9 @@ # Walkthrough Challenge 4 - Make the Container App Production Ready -Duration: 60 minutes +[Previous Challenge Solution](../challenge-03/solution-03.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-05/solution-05.md) -## Prerequisites -Please make sure thet you successfully completed [Challenge 3](../challenge-3/solution.md) before continuing with this challenge. +Duration: 60 minutes ### **Task 1: Enable Authentication with Azure Entra ID** @@ -61,4 +60,4 @@ Remember, you can create custom domains and manage certificates in Azure as well You successfully completed challenge 4! πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-5/solution.md) + diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-aiappurl.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-aiappurl.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-aiappurl.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-aiappurl.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-cli.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-cli.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-cli.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-cli.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-createapp-basics.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-createapp-basics.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-createapp-basics.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-createapp-basics.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-createapp-container.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-createapp-container.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-createapp-container.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-createapp-container.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-createapp-imagetag.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-createapp-imagetag.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-createapp-imagetag.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-createapp-imagetag.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-createapp-ingress.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-createapp-ingress.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-createapp-ingress.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-createapp-ingress.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-urlnotavailable.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-urlnotavailable.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-urlnotavailable.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-urlnotavailable.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-workflow.jpg b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-workflow.jpg similarity index 100% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/img/challenge-5-workflow.jpg rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/img/challenge-5-workflow.jpg diff --git a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/solution.md b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/solution-05.md similarity index 95% rename from 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/solution.md rename to 03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/solution-05.md index 42a9964cf..4a1972925 100644 --- a/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-5/solution.md +++ b/03-Azure/01-01-App Innovation/01_AppServicetoContainerApps/walkthrough/challenge-05/solution-05.md @@ -1,10 +1,8 @@ # Walkthrough Challenge 5 - Host Your Own AI Models -Duration: 60 minutes - -## Prerequisites +[Previous Challenge Solution](../challenge-04/solution-04.md) - **[Home](../../Readme.md)** -Please make sure thet you successfully completed [Challenge 4](../challenge-4/solution.md) before continuing with this challenge. +Duration: 60 minutes ### **Task 1: Host the Ollama container image** @@ -64,4 +62,3 @@ As you can see, you can easily host applications or AI models and let them work You successfully completed challenge 5! πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** diff --git a/03-Azure/01-01-App Innovation/02_AKS/Readme.md b/03-Azure/01-01-App Innovation/02_AKS/Readme.md new file mode 100644 index 000000000..e632a8007 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/Readme.md @@ -0,0 +1,101 @@ +# Azure Kubernetes Service (AKS) MicroHack + +- [**MicroHack Introduction**](#microhack-introduction) +- [**MicroHack Context**](#microhack-context) +- [**Objectives**](#objectives) +- [**Prerequisites**](#prerequisites) +- [**MicroHack Challenges**](#microhack-challenges) +- [**Contributors**](#contributors) + +# MicroHack Introduction + +This MicroHack scenario walks through the deployment and management of Azure Kubernetes Service (AKS) with a focus on best practices and design principles. You'll work hands-on with containerized applications, learning how to deploy, expose, scale, and monitor workloads on AKS while integrating with Azure services like Azure Container Registry, Azure Backup, and Azure Managed Grafana. + +This lab is not a full explanation of Kubernetes or AKS as technologies. Please consider the following articles as recommended pre-reading to build foundational knowledge: + +**Required reading:** +- [Azure Kubernetes Service (AKS) documentation](https://learn.microsoft.com/en-us/azure/aks/) +- [Kubernetes core concepts for AKS](https://learn.microsoft.com/en-us/azure/aks/concepts-clusters-workloads) +- [What is Azure Container Registry?](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-intro) + +**Optional (read this after completing this lab to take your learning even deeper!):** +- [Best practices for AKS](https://learn.microsoft.com/en-us/azure/aks/best-practices) +- [AKS baseline architecture](https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/containers/aks/baseline-aks) + +# MicroHack Context + +This MicroHack scenario provides hands-on experience with Azure Kubernetes Service. You'll start by creating an Azure Container Registry and pushing container images, then deploy an AKS cluster and integrate it with ACR. Throughout the challenges, you'll deploy applications, expose them using load balancers, implement scaling strategies, configure persistent storage, set up backup and restore capabilities, and monitor your cluster with Azure Managed Grafana. + +# Objectives + +After completing this MicroHack you will: + +- Know how to build and manage an Azure Container Registry (ACR) +- Understand how to create and configure an AKS cluster with ACR integration +- Deploy containerized applications to AKS using kubectl +- Expose applications internally and externally using Kubernetes Services +- Implement horizontal pod autoscaling (HPA) and cluster autoscaling +- Configure persistent storage using Azure Disks +- Protect AKS workloads with Azure Backup +- Monitor AKS clusters and applications using Azure Managed Grafana + +# Prerequisites + +## General Prerequisites + +**IMPORTANT:** Before starting the challenges, you must complete the prerequisites setup: + +πŸ“‹ **[Complete Prerequisites - Setup Jumphost](prerequisites-setup-jumphost.md)** - **Start here to set up your environment** + +This prerequisite guide will help you: +- Create an Azure Resource Group for the lab +- Deploy a jumphost VM with all necessary tools pre-installed +- Configure your environment variables + +In order to use the MicroHack time most effectively, ensure the prerequisite setup is completed before starting Challenge 1. + +### Required Resources + +- **Azure Subscription** with Contributor permissions +- **Resource Group** (created during prerequisites setup) +- **Jumphost VM** (created during prerequisites setup) +- **Azure CLI** (pre-installed on jumphost) +- **kubectl** (pre-installed on jumphost) +- **Docker** (pre-installed on jumphost) + +### Permissions Required + +- **Contributor** role on your Resource Group +- **Owner or Contributor** role on the subscription (for Azure Backup configuration) + +# MicroHack Challenges + +## Challenges + +* [Challenge 1 - Create Azure Container Registry and Push Images](challenges/challenge-01.md) +* [Challenge 2 - Create an AKS Cluster with ACR Integration](challenges/challenge-02.md) +* [Challenge 3 - Deploy Applications on AKS](challenges/challenge-03.md) +* [Challenge 4 - Expose Application with Load Balancer](challenges/challenge-04.md) +* [Challenge 5 - Scaling in AKS](challenges/challenge-05.md) +* [Challenge 6 - Persistent Storage in AKS](challenges/challenge-06.md) +* [Challenge 7 - Backup and Restore with Azure Backup for AKS](challenges/challenge-07.md) +* [Challenge 8 - Monitoring with Azure Managed Grafana](challenges/challenge-08.md) +* [Finish](challenges/finish.md) + +## Solutions - Spoiler Warning ⚠️ + +The solutions for each challenge are provided below. Try to complete each challenge on your own before looking at the solutions! + +* [Solution 1 - Create Azure Container Registry and Push Images](walkthrough/solution-01.md) +* [Solution 2 - Create an AKS Cluster with ACR Integration](walkthrough/solution-02.md) +* [Solution 3 - Deploy Applications on AKS](walkthrough/solution-03.md) +* [Solution 4 - Expose Application with Load Balancer](walkthrough/solution-04.md) +* [Solution 5 - Scaling in AKS](walkthrough/solution-05.md) +* [Solution 6 - Persistent Storage in AKS](walkthrough/solution-06.md) +* [Solution 7 - Backup and Restore with Azure Backup for AKS](walkthrough/solution-07.md) +* [Solution 8 - Monitoring with Azure Managed Grafana](walkthrough/solution-08.md) + +## Contributors + +* Jessica Tibaldi [GitHub](https://github.com/jetiba); [LinkedIn](https://www.linkedin.com/in/jetiba/) +* Fabrice Krebs [GitHub](https://github.com/fabricekrebs); [LinkedIn](https://www.linkedin.com/in/fabricekrebs/) diff --git a/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-01.md b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-01.md new file mode 100644 index 000000000..862a3469f --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-01.md @@ -0,0 +1,28 @@ +# Challenge 1 - Create Azure Container Registry and Push Images + +**[Home](../Readme.md)** - [Next Challenge](challenge-02.md) + +## Goal + +The goal of this exercise is to create an Azure Container Registry (ACR) to store your Docker container images, then build and push container images to this registry, which will later be deployed to your AKS cluster. + +## Actions + +* Create an Azure Container Registry with a globally unique name +* Configure ACR to allow access and authentication +* Build Docker container images for the sample application +* Push the built images to your Azure Container Registry +* Verify that images are successfully stored in ACR + +## Success criteria + +* You have created an Azure Container Registry in your resource group +* You successfully authenticated to your ACR +* You have built and pushed backend and frontend container images to ACR +* You can list and view the images stored in your container registry + +## Learning resources +* [Azure Container Registry documentation](https://learn.microsoft.com/en-us/azure/container-registry/) +* [Push your first image to your Azure container registry](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-docker-cli) +* [ACR Tasks overview](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-tasks-overview) + diff --git a/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-02.md b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-02.md new file mode 100644 index 000000000..1a862965d --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-02.md @@ -0,0 +1,27 @@ +# Challenge 2 - Create an AKS Cluster with ACR Integration + +[Previous Challenge](challenge-01.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-03.md) + +## Goal + +The goal of this exercise is to create an Azure Kubernetes Service (AKS) cluster with specific configurations and integrate it with your Azure Container Registry (ACR) to enable seamless image pulling. + +## Actions + +* Plan your AKS cluster configuration (name, node size, node count, location) +* Create an AKS cluster using Azure CLI or Azure Portal +* Integrate the AKS cluster with your existing Azure Container Registry +* Configure kubectl to connect to your AKS cluster +* Verify cluster connectivity and node status + +## Success criteria + +* You have created an AKS cluster in your resource group +* You successfully integrated ACR with AKS for pulling images +* You have configured kubectl and can connect to your cluster +* You can view cluster nodes and their status using kubectl commands + +## Learning resources +* [Azure Kubernetes Service documentation](https://learn.microsoft.com/en-us/azure/aks/) +* [Create an AKS cluster](https://learn.microsoft.com/en-us/azure/aks/learn/quick-kubernetes-deploy-cli) +* [Authenticate with Azure Container Registry from AKS](https://learn.microsoft.com/en-us/azure/aks/cluster-container-registry-integration) diff --git a/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-03.md b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-03.md new file mode 100644 index 000000000..08e0053b4 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-03.md @@ -0,0 +1,28 @@ +# Challenge 3 - Deploy Applications on AKS + +[Previous Challenge](challenge-02.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-04.md) + +## Goal + +The goal of this exercise is to deploy containerized applications to your AKS cluster using images from your Azure Container Registry. You'll learn to deploy applications using kubectl commands and understand Kubernetes deployments. + +## Actions + +* Verify that your ACR images are available and accessible +* Create Kubernetes deployment manifests for your applications +* Deploy backend and frontend applications to your AKS cluster +* Verify that pods are running successfully +* Check application logs and troubleshoot any deployment issues + +## Success criteria + +* You have deployed backend application from your ACR to AKS +* You have deployed frontend application from your ACR to AKS +* All pods are running successfully (verify with kubectl get pods) +* You can view and inspect the deployments and their status +* You can access pod logs to verify application behavior + +## Learning resources +* [Deploy an application to AKS](https://learn.microsoft.com/en-us/azure/aks/learn/quick-kubernetes-deploy-cli#deploy-the-application) +* [Kubernetes Deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) +* [kubectl cheat sheet](https://kubernetes.io/docs/reference/kubectl/cheatsheet/) diff --git a/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-04.md b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-04.md new file mode 100644 index 000000000..97d2eb7b0 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-04.md @@ -0,0 +1,28 @@ +# Challenge 4 - Expose Application with Load Balancer + +[Previous Challenge](challenge-03.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-05.md) + +## Goal + +The goal of this exercise is to expose your deployed applications to the internet using Kubernetes Services and Azure Load Balancer. You'll learn about different service types and how to make your applications accessible. + +## Actions + +* Create a ClusterIP service to expose the backend application internally +* Create a LoadBalancer service to expose the frontend application externally +* Apply the service configurations to your cluster +* Obtain the external IP address assigned by Azure Load Balancer +* Test application accessibility from the internet + +## Success criteria + +* You have created a ClusterIP service for the backend application +* You have created a LoadBalancer service for the frontend application +* You can successfully access the frontend application via the external IP +* The backend service is accessible internally within the cluster +* You can verify the Azure Load Balancer created in your resource group + +## Learning resources +* [Kubernetes Services](https://kubernetes.io/docs/concepts/services-networking/service/) +* [Use a public load balancer in AKS](https://learn.microsoft.com/en-us/azure/aks/load-balancer-standard) +* [Service types in Kubernetes](https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types) diff --git a/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-05.md b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-05.md new file mode 100644 index 000000000..869d5cf9c --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-05.md @@ -0,0 +1,28 @@ +# Challenge 5 - Scaling in AKS + +[Previous Challenge](challenge-04.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-06.md) + +## Goal + +The goal of this exercise is to learn about scaling in Kubernetes and AKS, including pod autoscaling (HPA) and cluster autoscaling. You'll understand how to handle varying workloads by adjusting the number of pod replicas or cluster nodes. + +## Actions + +* Manually scale your deployment to a specific number of replicas +* Configure Horizontal Pod Autoscaler (HPA) based on CPU metrics +* Test autoscaling by generating load on your application +* Enable cluster autoscaler on your AKS cluster +* Observe pod and node scaling behavior + +## Success criteria + +* You have successfully scaled a deployment manually +* You have configured and deployed a Horizontal Pod Autoscaler +* You can observe HPA scaling pods based on CPU utilization +* You have enabled cluster autoscaler on your node pool +* You can verify that nodes scale up/down based on resource demands + +## Learning resources +* [Scale applications in AKS](https://learn.microsoft.com/en-us/azure/aks/tutorial-kubernetes-scale) +* [Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) +* [Cluster autoscaler in AKS](https://learn.microsoft.com/en-us/azure/aks/cluster-autoscaler) diff --git a/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-06.md b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-06.md new file mode 100644 index 000000000..f2370f934 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-06.md @@ -0,0 +1,28 @@ +# Challenge 6 - Persistent Storage in AKS + +[Previous Challenge](challenge-05.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-07.md) + +## Goal + +The goal of this exercise is to configure persistent storage for your applications using Azure Disks and Azure Files. You'll understand the difference between ephemeral and persistent storage, and when to use each Azure storage option. + +## Actions + +* Test the ephemeral nature of pod storage by deleting and recreating a pod +* Create a PersistentVolumeClaim (PVC) using Azure Disk +* Update your deployment to use the persistent volume +* Verify that data persists across pod deletions +* Understand the differences between Azure Disks and Azure Files + +## Success criteria + +* You have demonstrated that data is lost when pods are deleted without persistent storage +* You have created a PersistentVolumeClaim using Azure Disk +* You have updated your application deployment to mount the persistent volume +* You can verify that application data persists after pod deletion and recreation +* You understand when to use Azure Disk vs Azure Files for different scenarios + +## Learning resources +* [Persistent volumes in AKS](https://learn.microsoft.com/en-us/azure/aks/concepts-storage) +* [Dynamically create Azure Disks PV](https://learn.microsoft.com/en-us/azure/aks/azure-disk-csi) +* [Azure Files for AKS](https://learn.microsoft.com/en-us/azure/aks/azure-files-csi) diff --git a/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-07.md b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-07.md new file mode 100644 index 000000000..1403ef7e0 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-07.md @@ -0,0 +1,30 @@ +# Challenge 7 - Backup and Restore with Azure Backup for AKS + +[Previous Challenge](challenge-06.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-08.md) + +## Goal + +The goal of this exercise is to protect your AKS workloads using Azure Backup extension. You'll configure backup for your cluster, perform a backup of your application, and restore it to demonstrate disaster recovery capabilities. + +## Actions + +* Create an Azure Storage Account and Blob container for backup storage +* Create an Azure Backup Vault +* Install the Azure Backup extension on your AKS cluster +* Configure backup policy and perform an on-demand backup +* Simulate a disaster scenario by deleting resources +* Restore your application from the backup + +## Success criteria + +* You have created a Backup Vault and configured it for AKS +* You have successfully installed the Backup extension on your AKS cluster +* You have performed a successful backup of your application and namespace +* You can delete application resources to simulate a disaster +* You have successfully restored your application from the backup +* All application data and configurations are recovered after restore + +## Learning resources +* [Azure Backup for AKS](https://learn.microsoft.com/en-us/azure/backup/azure-kubernetes-service-backup-overview) +* [Back up AKS using Azure Backup](https://learn.microsoft.com/en-us/azure/backup/azure-kubernetes-service-cluster-backup) +* [Restore AKS using Azure Backup](https://learn.microsoft.com/en-us/azure/backup/azure-kubernetes-service-cluster-restore) diff --git a/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-08.md b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-08.md new file mode 100644 index 000000000..91588e4c1 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/challenges/challenge-08.md @@ -0,0 +1,28 @@ +# Challenge 8 - Monitoring with Azure Managed Grafana + +[Previous Challenge](challenge-07.md) - **[Home](../Readme.md)** - [Next Challenge](finish.md) + +## Goal + +The goal of this exercise is to monitor your AKS cluster and applications using Azure Managed Grafana. You'll explore built-in dashboards, understand key metrics, and interact with visualizations to monitor your workloads. + +## Actions + +* Verify that Azure Monitor for Containers is enabled on your AKS cluster +* Configure integration with Azure Managed Grafana +* Enable Prometheus metrics and container logs collection +* Explore pre-built Grafana dashboards for AKS +* Review key metrics like CPU, memory, network, and pod status + +## Success criteria + +* You have verified that monitoring is enabled on your AKS cluster +* You have successfully configured Grafana dashboards integration +* You can access Azure Managed Grafana and view AKS dashboards +* You can explore different built-in dashboards and understand key metrics +* You can navigate through container logs and performance metrics + +## Learning resources +* [Azure Managed Grafana](https://learn.microsoft.com/en-us/azure/managed-grafana/overview) +* [Monitor AKS with Azure Monitor](https://learn.microsoft.com/en-us/azure/aks/monitor-aks) +* [Container insights overview](https://learn.microsoft.com/en-us/azure/azure-monitor/containers/container-insights-overview) diff --git a/03-Azure/01-01-App Innovation/02_AKS/challenges/finish.md b/03-Azure/01-01-App Innovation/02_AKS/challenges/finish.md new file mode 100644 index 000000000..583a46e2c --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/challenges/finish.md @@ -0,0 +1,21 @@ +# Finish + +[Previous Challenge](challenge-08.md) - **[Home](../Readme.md)** + +## Congratulations + +You finished the MicroHack AKS. We hope you had the chance to learn about how to implement a successful Azure Kubernetes Service deployment, including: + +- Creating and managing Azure Container Registry +- Deploying and configuring AKS clusters +- Deploying containerized applications +- Exposing applications with load balancers +- Implementing scaling strategies (HPA and cluster autoscaler) +- Configuring persistent storage with Azure Disks +- Setting up backup and restore with Azure Backup for AKS +- Monitoring your cluster with Azure Managed Grafana + +If you want to give feedback please don't hesitate to open an Issue on the repository or get in touch with one of us directly. + +Thank you for investing the time and see you next time! + diff --git a/03-Azure/01-01-App Innovation/02_AKS/prerequisites-setup-jumphost.md b/03-Azure/01-01-App Innovation/02_AKS/prerequisites-setup-jumphost.md new file mode 100644 index 000000000..66cd1dd0f --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/prerequisites-setup-jumphost.md @@ -0,0 +1,266 @@ +# Exercise 0: Setup Your Environment - Resource Group and Jumphost + +## Objective +In this exercise, you will create an Azure Resource Group to organize your lab resources, and then set up a jumphost (virtual machine) in Azure that will serve as your management environment for the rest of the lab. This VM will have all the necessary tools pre-installed to work with Azure Kubernetes Service (AKS). + +## Prerequisites +- Make sure you have an active Azure subscription. +- Access to the Azure Portal (https://portal.azure.com) + +## Variables + +Throughout this lab, you'll use consistent naming with your initials for uniqueness: + +```bash +export YOUR_INITIALS="" # e.g., js for John Smith +export RESOURCE_GROUP="rg-aks-lab-${YOUR_INITIALS}" +export LOCATION="francecentral" +export VM_NAME="vm-aks-jumphost-${YOUR_INITIALS}" +export ACR_NAME="acrakslabacr${YOUR_INITIALS}" +export AKS_CLUSTER_NAME="aks-lab-${YOUR_INITIALS}" +``` + +**Note**: Replace `` with your actual initials in lowercase (e.g., `js` for John Smith). + +## Tasks + +### Task 1: Create an Azure Resource Group + +1. **Sign in to Azure Portal** + - Navigate to https://portal.azure.com + - Sign in with your Azure credentials + +2. **Define your naming convention** + + Throughout this lab, you'll use your initials in resource names to ensure uniqueness. + + - Format: `rg-aks-lab-` + - Example: `rg-aks-lab-js` (for John Smith) + - Location: `francecentral` + +3. **Create the resource group using Azure CLI** (if you have Azure CLI installed locally) + + ```bash + az login + az account show + + az group create \ + --name $RESOURCE_GROUP \ + --location $LOCATION + ``` + +4. **Or create via Azure Portal** + + - Search for "Resource groups" in the Azure Portal + - Click "+ Create" + - Select your subscription + - Enter the resource group name: `rg-aks-lab-` (e.g., `rg-aks-lab-js`) + - Select region: **France Central** + - Click "Review + create" + - Click "Create" + +5. **Verify the resource group** + + - You should see your resource group listed in the Azure Portal + - Note the name and location for use in the next task + +### Task 2: Create a Jumphost Virtual Machine + +1. **Navigate to Azure Portal** + - Sign in to the Azure Portal + - Click on "Create a resource" or use the search bar to find "Virtual Machine" + +2. **Configure the VM** + - **Subscription**: Select your subscription + - **Resource Group**: Select the resource group you just created (e.g., `rg-aks-lab-js`) + - **Virtual Machine Name**: Choose a name with your initials (e.g., `vm-aks-jumphost-js`) + - **Region**: **(Europe) France Central** (same as your resource group) + - **Image**: **Ubuntu Server 24.04 LTS - x64 Gen2** + - **Size**: **Standard_D2s_v3** (2 vCPUs, 8 GB RAM) + - **Authentication**: Select **Password** + - **Username**: Choose a username you'll remember (e.g., `azureuser`) + - **Password**: Create a strong password you'll remember + +3. **Networking Configuration** + - **Public IP**: Create a new Public IP + - **Inbound port rules**: Allow SSH (port 22) + - Leave other settings as default + +4. **Review and Create** + - Click "Review + create" + - Once validation passes, click "Create" + - Wait for the deployment to complete (2-5 minutes) + +5. **Alternative: Create VM using Azure CLI** + + If you prefer using the CLI: + + ```bash + read -s -p "Enter VM password: " PASSWORD + + az vm create \ + --resource-group $RESOURCE_GROUP \ + --name $VM_NAME \ + --location $LOCATION \ + --image Ubuntu2404 \ + --size Standard_D2s_v3 \ + --admin-username \ + --admin-password "$PASSWORD" \ + --public-ip-sku Standard + ``` + +6. **Get the VM Public IP** + + ```bash + az vm show \ + --resource-group $RESOURCE_GROUP \ + --name $VM_NAME \ + --show-details \ + --query "publicIps" \ + -o tsv + ``` + +### Task 3: Connect to Your Jumphost + +1. **Get Connection Information** + - Go to your VM resource in the portal + - Note the Public IP address + +2. **Connect via SSH** + ```bash + ssh @ + ``` + + Enter your password when prompted. + +### Task 4: Run the Configuration Script + +Once connected to your jumphost, run the following commands to set up your environment: + +1. **Download the configuration script located under resources / exercice-00 / setup-script.sh** + +2. **Make the script executable** + ```bash + chmod +x setup-script.sh + ``` + +3. **Execute the configuration script** + ```bash + ./setup-script.sh + ``` + + This script will install: + - Azure CLI (`az`) + - kubectl (Kubernetes command-line tool) + - Docker and Docker Compose + - Helm (Kubernetes package manager) + - K9s (terminal-based Kubernetes UI) + - GitHub CLI (`gh`) + - Other useful utilities (git, curl, etc.) + +4. **Verify the installation** + + **Note**: After the script completes, you may need to log out and log back in for Docker permissions to take effect: + ```bash + exit + ``` + Then reconnect via SSH. + + **Important**: After reconnecting, re-export your environment variables: + ```bash + export YOUR_INITIALS="" + export RESOURCE_GROUP="rg-aks-lab-${YOUR_INITIALS}" + export LOCATION="francecentral" + export VM_NAME="vm-aks-jumphost-${YOUR_INITIALS}" + export ACR_NAME="acrakslabacr${YOUR_INITIALS}" + export AKS_CLUSTER_NAME="aks-lab-${YOUR_INITIALS}" + ``` + + Check Azure CLI: + ```bash + az --version + ``` + + Check kubectl: + ```bash + kubectl version --client + ``` + + Check Docker: + ```bash + docker --version + ``` + + Check Helm: + ```bash + helm version + ``` + + Check K9s: + ```bash + k9s version + ``` + +### Task 5: Login to Azure + +1. **Authenticate with Azure** + ```bash + az login + ``` + + Follow the instructions to complete the authentication process. If you're working from a remote VM without a browser, use: + ```bash + az login --use-device-code + ``` + +2. **Verify your subscription** + ```bash + az account show + ``` + +3. **Set the correct subscription (if you have multiple)** + ```bash + az account list --output table + az account set --subscription "" + ``` + +### Task 6: Set Default Azure Configuration + +To avoid specifying resource group and location repeatedly: + +```bash +az configure --defaults group=$RESOURCE_GROUP +az configure --defaults location=$LOCATION +az configure --list-defaults +``` + +### Task 7: Download Lab Resources + +1. **Clone the lab repository** + ```bash + cd ~ + git clone https://github.com/fabricekrebs/aks-for-beginners.git + cd aks-for-beginners + ``` + +## Verification + +Before moving to the next exercise, ensure: +- [ ] Your resource group is created in France Central +- [ ] Your jumphost VM is running in the resource group +- [ ] You can connect to the VM via SSH +- [ ] Azure CLI is installed and you're logged in +- [ ] kubectl is installed +- [ ] Docker is installed +- [ ] Helm is installed +- [ ] K9s is installed + +## Expected Output + +When you run `az account show`, you should see your subscription details in JSON format. +When you run `kubectl version --client`, you should see the client version information. +When you run `helm version`, you should see the Helm version information. + +## Next Steps + +Once your environment is ready, proceed to [Exercise 1: Create Azure Container Registry and Push Images](01-create-acr-push-images.md) diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/preparing-jumphost/setup-script.sh b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/preparing-jumphost/setup-script.sh new file mode 100644 index 000000000..fa36f0cad --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/preparing-jumphost/setup-script.sh @@ -0,0 +1,59 @@ +set -e + +# Update and install prerequisites +sudo install -m 0755 -d /etc/apt/keyrings +sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc +sudo chmod a+r /etc/apt/keyrings/docker.asc +sudo tee /etc/apt/sources.list.d/docker.sources <> ~/.profile +echo "alias k=kubectl" >> ~/.profile +echo "complete -o default -F __start_kubectl k" >> ~/.profile + +# Add current user to docker group +sudo usermod -aG docker $USER + +# Final upgrade and cleanup +sudo NEEDRESTART_MODE=l apt-get dist-upgrade -y +sudo apt autoremove -y + +echo "βœ… Setup completed successfully!" \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/presentation/aks_presentation.pptx b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/presentation/aks_presentation.pptx new file mode 100644 index 000000000..6960fce37 Binary files /dev/null and b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/presentation/aks_presentation.pptx differ diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/.dockerignore b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/.dockerignore new file mode 100644 index 000000000..d87da77cb --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/.dockerignore @@ -0,0 +1,19 @@ +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.git +.gitignore +README.md +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +.DS_Store +*.log +coverage +.nyc_output +test +*.test.js +*.spec.js \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/.gitignore b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/.gitignore new file mode 100644 index 000000000..c4710f584 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/.gitignore @@ -0,0 +1,47 @@ +# Node.js dependencies +node_modules/ + +# Environment variables +.env +.env.local + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory used by testing tools +coverage/ +.nyc_output/ + +# Dependency directories +jspm_packages/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Build output +dist/ +build/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/Dockerfile b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/Dockerfile new file mode 100644 index 000000000..d3946b285 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/Dockerfile @@ -0,0 +1,7 @@ +FROM node:18-alpine +WORKDIR /app +COPY package*.json ./ +RUN npm ci --only=production && npm cache clean --force +COPY . . +EXPOSE 3001 +CMD ["npm", "start"] \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/package-lock.json b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/package-lock.json new file mode 100644 index 000000000..c3313dada --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/package-lock.json @@ -0,0 +1,5390 @@ +{ + "name": "akslab-backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "akslab-backend", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "mongoose": "^7.6.0", + "redis": "^4.6.8" + }, + "devDependencies": { + "jest": "^29.7.0", + "nodemon": "^3.0.1", + "supertest": "^6.3.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.2.tgz", + "integrity": "sha512-QgA5AySqB27cGTXBFmnpifAi7HxoGUeezwo6p9dI03MuDB6Pp33zgclqVb6oVK3j6I9Vesg0+oojW2XxB59SGg==", + "license": "MIT", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.1.tgz", + "integrity": "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==", + "license": "MIT", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@redis/graph": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", + "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", + "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", + "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.31", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz", + "integrity": "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001757", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", + "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.262", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz", + "integrity": "sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", + "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", + "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", + "license": "Apache-2.0", + "dependencies": { + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.8.7.tgz", + "integrity": "sha512-5Bo4CrUxrPITrhMKsqUTOkXXo2CoRC5tXxVQhnddCzqDMwRXfyStrxj1oY865g8gaekSBhxAeNkYyUSJvGm9Hw==", + "license": "MIT", + "dependencies": { + "bson": "^5.5.0", + "kareem": "2.5.1", + "mongodb": "5.9.2", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", + "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.1.tgz", + "integrity": "sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==", + "license": "MIT", + "workspaces": [ + "./packages/*" + ], + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.6.1", + "@redis/graph": "1.1.1", + "@redis/json": "1.0.7", + "@redis/search": "1.2.0", + "@redis/time-series": "1.1.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==", + "license": "MIT" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/superagent/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/supertest": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", + "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", + "deprecated": "Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "license": "MIT", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.1.2" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/package.json b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/package.json new file mode 100644 index 000000000..4f0b45f11 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/package.json @@ -0,0 +1,27 @@ +{ + "name": "akslab-backend", + "version": "1.0.0", + "description": "Backend API for AKS Lab Task Manager", + "main": "server.js", + "scripts": { + "start": "node server.js", + "dev": "nodemon server.js", + "test": "jest" + }, + "dependencies": { + "express": "^4.18.2", + "cors": "^2.8.5", + "body-parser": "^1.20.2", + "dotenv": "^16.3.1", + "mongoose": "^7.6.0", + "redis": "^4.6.8" + }, + "devDependencies": { + "nodemon": "^3.0.1", + "jest": "^29.7.0", + "supertest": "^6.3.3" + }, + "keywords": ["aks", "kubernetes", "node", "express", "api"], + "author": "AKS Lab", + "license": "MIT" +} \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/server.js b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/server.js new file mode 100644 index 000000000..118dfbbb3 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/backend/server.js @@ -0,0 +1,296 @@ +const express = require('express'); +const cors = require('cors'); +const bodyParser = require('body-parser'); +const fs = require('fs'); +const path = require('path'); +const { hostname } = require('os'); +require('dotenv').config(); + +const app = express(); +const PORT = process.env.PORT || 3001; + +// Middleware +app.use(cors()); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: true })); + +// Storage configuration +const DATA_PATH = process.env.DATA_PATH || '/data'; +const TASKS_FILE = path.join(DATA_PATH, 'tasks.json'); +let usePersistentStorage = false; + +// Check if persistent storage is available +try { + if (fs.existsSync(DATA_PATH)) { + fs.accessSync(DATA_PATH, fs.constants.W_OK); + usePersistentStorage = true; + console.log(`βœ… Persistent storage available at: ${DATA_PATH}`); + console.log(`πŸ“ Tasks will be saved to: ${TASKS_FILE}`); + } +} catch (error) { + console.log(`⚠️ Persistent storage not available - running in EPHEMERAL mode`); + console.log(`πŸ’‘ Data will be lost when the pod restarts`); +} + +// Storage functions +function loadTasks() { + if (!usePersistentStorage) { + return []; + } + + try { + if (fs.existsSync(TASKS_FILE)) { + const data = fs.readFileSync(TASKS_FILE, 'utf8'); + const parsed = JSON.parse(data); + console.log(`πŸ“– Loaded ${parsed.tasks.length} tasks from persistent storage`); + return parsed.tasks; + } + } catch (error) { + console.error('Error loading tasks from file:', error.message); + } + + return []; +} + +function saveTasks(tasks) { + if (!usePersistentStorage) { + return; + } + + try { + const data = { + tasks: tasks, + lastUpdated: new Date().toISOString() + }; + fs.writeFileSync(TASKS_FILE, JSON.stringify(data, null, 2), 'utf8'); + } catch (error) { + console.error('Error saving tasks to file:', error.message); + } +} + +function getNextId(tasks) { + if (tasks.length === 0) return 1; + return Math.max(...tasks.map(t => t.id)) + 1; +} + +// Initialize tasks from persistent storage or empty array +let tasks = loadTasks(); +let nextId = getNextId(tasks); + +// Utility function to add delay (for demonstrating scaling) +const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); + +// Add request logging middleware +app.use((req, res, next) => { + console.log(`${new Date().toISOString()} - ${req.method} ${req.path}`); + next(); +}); + +// Health check endpoint +app.get('/api/health', async (req, res) => { + // Simulate some processing time + await delay(100); + + const health = { + status: 'healthy', + timestamp: new Date().toISOString(), + uptime: process.uptime(), + version: process.env.npm_package_version || '1.0.0', + environment: process.env.NODE_ENV || 'development', + hostname: process.env.HOSTNAME || 'local', + memoryUsage: process.memoryUsage() + }; + + res.json(health); +}); + +// Get all tasks +app.get('/api/tasks', async (req, res) => { + try { + // Simulate database query delay + await delay(50); + + // Add some load simulation for scaling demo + const load = Math.random() * 200; + await delay(load); + + console.log(`Returning ${tasks.length} tasks`); + res.json({ + tasks: tasks, + hostname: process.env.HOSTNAME || 'local' + }); + } catch (error) { + console.error('Error fetching tasks:', error); + res.status(500).json({ error: 'Failed to fetch tasks' }); + } +}); + +// Get task by ID +app.get('/api/tasks/:id', async (req, res) => { + try { + const taskId = parseInt(req.params.id); + const task = tasks.find(t => t.id === taskId); + + if (!task) { + return res.status(404).json({ error: 'Task not found' }); + } + + res.json(task); + } catch (error) { + console.error('Error fetching task:', error); + res.status(500).json({ error: 'Failed to fetch task' }); + } +}); + +// Create new task +app.post('/api/tasks', async (req, res) => { + try { + const { text, completed = false } = req.body; + + if (!text || text.trim() === '') { + return res.status(400).json({ error: 'Task text is required' }); + } + + const newTask = { + id: nextId++, + text: text.trim(), + completed: Boolean(completed), + createdAt: new Date(), + updatedAt: new Date() + }; + + tasks.push(newTask); + saveTasks(tasks); + console.log(`Created new task: ${newTask.text}`); + + res.status(201).json(newTask); + } catch (error) { + console.error('Error creating task:', error); + res.status(500).json({ error: 'Failed to create task' }); + } +}); + +// Update task +app.put('/api/tasks/:id', async (req, res) => { + try { + const taskId = parseInt(req.params.id); + const { text, completed } = req.body; + + const taskIndex = tasks.findIndex(t => t.id === taskId); + + if (taskIndex === -1) { + return res.status(404).json({ error: 'Task not found' }); + } + + if (text !== undefined) { + tasks[taskIndex].text = text.trim(); + } + + if (completed !== undefined) { + tasks[taskIndex].completed = Boolean(completed); + } + + tasks[taskIndex].updatedAt = new Date(); + saveTasks(tasks); + + console.log(`Updated task ${taskId}: ${tasks[taskIndex].text}`); + res.json(tasks[taskIndex]); + } catch (error) { + console.error('Error updating task:', error); + res.status(500).json({ error: 'Failed to update task' }); + } +}); + +// Delete task +app.delete('/api/tasks/:id', async (req, res) => { + try { + const taskId = parseInt(req.params.id); + const taskIndex = tasks.findIndex(t => t.id === taskId); + + if (taskIndex === -1) { + return res.status(404).json({ error: 'Task not found' }); + } + + const deletedTask = tasks.splice(taskIndex, 1)[0]; + saveTasks(tasks); + console.log(`Deleted task ${taskId}: ${deletedTask.text}`); + + res.json({ message: 'Task deleted successfully', task: deletedTask }); + } catch (error) { + console.error('Error deleting task:', error); + res.status(500).json({ error: 'Failed to delete task' }); + } +}); + +// Get application metrics (for monitoring demo) +app.get('/api/metrics', (req, res) => { + const metrics = { + totalTasks: tasks.length, + completedTasks: tasks.filter(t => t.completed).length, + pendingTasks: tasks.filter(t => !t.completed).length, + uptime: process.uptime(), + memoryUsage: process.memoryUsage(), + cpuUsage: process.cpuUsage(), + timestamp: new Date().toISOString() + }; + + res.json(metrics); +}); + +// Simulate heavy load endpoint (for load testing) +app.get('/api/load-test', async (req, res) => { + const iterations = parseInt(req.query.iterations) || 1000; + const start = Date.now(); + + // Simulate CPU-intensive work + let result = 0; + for (let i = 0; i < iterations * 1000; i++) { + result += Math.sqrt(i); + } + + const duration = Date.now() - start; + + res.json({ + message: 'Load test completed', + iterations: iterations * 1000, + duration: `${duration}ms`, + result: Math.round(result), + timestamp: new Date().toISOString() + }); +}); + +// Error handling middleware +app.use((error, req, res, next) => { + console.error('Unhandled error:', error); + res.status(500).json({ + error: 'Internal server error', + timestamp: new Date().toISOString() + }); +}); + +// 404 handler +app.use((req, res) => { + res.status(404).json({ + error: 'Route not found', + path: req.path, + timestamp: new Date().toISOString() + }); +}); + +// Graceful shutdown +process.on('SIGTERM', () => { + console.log('SIGTERM received. Shutting down gracefully...'); + process.exit(0); +}); + +process.on('SIGINT', () => { + console.log('SIGINT received. Shutting down gracefully...'); + process.exit(0); +}); + +app.listen(PORT, '0.0.0.0', () => { + console.log(`πŸš€ Backend server running on port ${PORT}`); + console.log(`Environment: ${process.env.NODE_ENV || 'development'}`); + console.log(`Storage mode: ${usePersistentStorage ? 'PERSISTENT' : 'EPHEMERAL'}`); + console.log(`Health check available at: http://localhost:${PORT}/api/health`); +}); \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.dockerignore b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.dockerignore new file mode 100644 index 000000000..66dbe7316 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.dockerignore @@ -0,0 +1,17 @@ +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.git +.gitignore +README.md +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +.DS_Store +*.log +build +coverage +.nyc_output \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.env.example b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.env.example new file mode 100644 index 000000000..c85853261 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.env.example @@ -0,0 +1,5 @@ +# For local development +REACT_APP_API_URL=http://localhost:3001/api + +# For container/production deployment, set to: +# REACT_APP_API_URL=http://backend:3001/api \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.eslintrc.json b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.eslintrc.json new file mode 100644 index 000000000..bffb357a7 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.gitignore b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.gitignore new file mode 100644 index 000000000..9856fcad2 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/.gitignore @@ -0,0 +1,51 @@ +# Node.js dependencies +node_modules/ + +# Next.js build output +.next/ +out/ + +# Environment variables +.env +.env*.local + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory +coverage/ +.nyc_output/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Build output +dist/ +build/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Vercel +.vercel diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/Dockerfile b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/Dockerfile new file mode 100644 index 000000000..7b8859fdd --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/Dockerfile @@ -0,0 +1,26 @@ +# Build stage +FROM node:18-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +# Production stage +FROM node:18-alpine AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV PORT=3000 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/api/health/route.js b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/api/health/route.js new file mode 100644 index 000000000..d2e604448 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/api/health/route.js @@ -0,0 +1,18 @@ +import { NextResponse } from 'next/server' + +export const dynamic = 'force-dynamic' + +const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:3001' + +export async function GET() { + try { + const response = await fetch(`${BACKEND_URL}/api/health`, { + cache: 'no-store' + }) + const data = await response.json() + return NextResponse.json(data) + } catch (error) { + console.error('Health check failed:', error) + return NextResponse.json({ status: 'unhealthy' }, { status: 500 }) + } +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/api/tasks/[id]/route.js b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/api/tasks/[id]/route.js new file mode 100644 index 000000000..0974c6b87 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/api/tasks/[id]/route.js @@ -0,0 +1,37 @@ +import { NextResponse } from 'next/server' + +export const dynamic = 'force-dynamic' + +const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:3001' + +export async function PUT(request, { params }) { + try { + const { id } = params + const body = await request.json() + const response = await fetch(`${BACKEND_URL}/api/tasks/${id}`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }) + const data = await response.json() + return NextResponse.json(data) + } catch (error) { + console.error('Error updating task:', error) + return NextResponse.json({ error: 'Failed to update task' }, { status: 500 }) + } +} + +export async function DELETE(request, { params }) { + try { + const { id } = params + await fetch(`${BACKEND_URL}/api/tasks/${id}`, { + method: 'DELETE', + }) + return NextResponse.json({ success: true }) + } catch (error) { + console.error('Error deleting task:', error) + return NextResponse.json({ error: 'Failed to delete task' }, { status: 500 }) + } +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/api/tasks/route.js b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/api/tasks/route.js new file mode 100644 index 000000000..5ff0bfe61 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/api/tasks/route.js @@ -0,0 +1,36 @@ +import { NextResponse } from 'next/server' + +export const dynamic = 'force-dynamic' + +const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:3001' + +export async function GET() { + try { + const response = await fetch(`${BACKEND_URL}/api/tasks`, { + cache: 'no-store' + }) + const data = await response.json() + return NextResponse.json(data) + } catch (error) { + console.error('Error fetching tasks:', error) + return NextResponse.json({ error: 'Failed to fetch tasks' }, { status: 500 }) + } +} + +export async function POST(request) { + try { + const body = await request.json() + const response = await fetch(`${BACKEND_URL}/api/tasks`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }) + const data = await response.json() + return NextResponse.json(data) + } catch (error) { + console.error('Error creating task:', error) + return NextResponse.json({ error: 'Failed to create task' }, { status: 500 }) + } +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/components/TaskManager.js b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/components/TaskManager.js new file mode 100644 index 000000000..91914b0f6 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/components/TaskManager.js @@ -0,0 +1,124 @@ +'use client' + +import { useState } from 'react' + +export default function TaskManager({ initialTasks }) { + const [tasks, setTasks] = useState(initialTasks) + const [newTask, setNewTask] = useState('') + const [loading, setLoading] = useState(false) + + const fetchTasks = async () => { + try { + setLoading(true) + const response = await fetch('/api/tasks') + const data = await response.json() + setTasks(data) + } catch (error) { + console.error('Error fetching tasks:', error) + } finally { + setLoading(false) + } + } + + const addTask = async (e) => { + e.preventDefault() + if (!newTask.trim()) return + + try { + const response = await fetch('/api/tasks', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + text: newTask, + completed: false + }), + }) + const data = await response.json() + setTasks([...tasks, data]) + setNewTask('') + } catch (error) { + console.error('Error adding task:', error) + } + } + + const toggleTask = async (id) => { + try { + const task = tasks.find(t => t.id === id) + const response = await fetch(`/api/tasks/${id}`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + ...task, + completed: !task.completed + }), + }) + const data = await response.json() + setTasks(tasks.map(t => t.id === id ? data : t)) + } catch (error) { + console.error('Error updating task:', error) + } + } + + const deleteTask = async (id) => { + try { + await fetch(`/api/tasks/${id}`, { + method: 'DELETE', + }) + setTasks(tasks.filter(t => t.id !== id)) + } catch (error) { + console.error('Error deleting task:', error) + } + } + + return ( +
+
+ setNewTask(e.target.value)} + placeholder="Add a new task..." + className="task-input" + /> + +
+ + {loading ? ( +
Loading tasks...
+ ) : ( +
+ {tasks.length === 0 ? ( +

No tasks yet. Add one above!

+ ) : ( + tasks.map(task => ( +
+ toggleTask(task.id)} + /> + {task.text} + +
+ )) + )} +
+ )} + +
+

Total Tasks: {tasks.length}

+

Completed: {tasks.filter(t => t.completed).length}

+

Remaining: {tasks.filter(t => !t.completed).length}

+
+
+ ) +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/globals.css b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/globals.css new file mode 100644 index 000000000..a754353fb --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/globals.css @@ -0,0 +1,161 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background: #f5f5f5; +} + +.App { + text-align: center; + max-width: 800px; + margin: 0 auto; + padding: 20px; +} + +.App-header { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + padding: 30px; + border-radius: 10px; + color: white; + margin-bottom: 30px; +} + +.App-header h1 { + margin: 0 0 15px 0; + font-size: 2.5rem; +} + +.health-status { + font-size: 1.1rem; +} + +.status { + font-weight: bold; + padding: 5px 10px; + border-radius: 5px; +} + +.status.healthy { + background-color: #4CAF50; + color: white; +} + +.status.unhealthy { + background-color: #f44336; + color: white; +} + +.App-main { + background: white; + padding: 30px; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.task-form { + display: flex; + gap: 10px; + margin-bottom: 30px; +} + +.task-input { + flex: 1; + padding: 12px; + border: 2px solid #ddd; + border-radius: 5px; + font-size: 16px; +} + +.task-input:focus { + outline: none; + border-color: #667eea; +} + +.add-button { + padding: 12px 24px; + background: #667eea; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; + font-size: 16px; +} + +.add-button:hover { + background: #5a6fd8; +} + +.loading { + font-size: 1.2rem; + color: #666; + margin: 40px 0; +} + +.no-tasks { + font-size: 1.1rem; + color: #666; + margin: 40px 0; +} + +.task-list { + text-align: left; + margin-bottom: 30px; +} + +.task-item { + display: flex; + align-items: center; + gap: 15px; + padding: 15px; + border: 1px solid #ddd; + border-radius: 5px; + margin-bottom: 10px; + background: #f9f9f9; +} + +.task-item.completed { + opacity: 0.6; + background: #e8f5e8; +} + +.task-item input[type="checkbox"] { + transform: scale(1.2); +} + +.task-text { + flex: 1; + font-size: 1.1rem; +} + +.task-item.completed .task-text { + text-decoration: line-through; +} + +.delete-button { + background: none; + border: none; + cursor: pointer; + font-size: 1.2rem; +} + +.delete-button:hover { + transform: scale(1.1); +} + +.stats { + background: #f0f0f0; + padding: 20px; + border-radius: 5px; + display: flex; + justify-content: space-around; + text-align: center; +} + +.stats p { + margin: 0; + font-size: 1.1rem; + font-weight: bold; +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/layout.js b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/layout.js new file mode 100644 index 000000000..0274ed7cc --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/layout.js @@ -0,0 +1,14 @@ +import './globals.css' + +export const metadata = { + title: 'AKS Lab - Task Manager', + description: 'Task Manager application for AKS Lab', +} + +export default function RootLayout({ children }) { + return ( + + {children} + + ) +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/page.js b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/page.js new file mode 100644 index 000000000..b75016c0b --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/app/page.js @@ -0,0 +1,56 @@ +import TaskManager from './components/TaskManager' + +export const dynamic = 'force-dynamic' + +async function getTasks() { + const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001' + console.log('BACKEND_URL env:', process.env.BACKEND_URL) + console.log('Using backend URL for tasks:', backendUrl) + try { + const res = await fetch(`${backendUrl}/api/tasks`, { + cache: 'no-store' + }) + if (!res.ok) return {tasks: [], hostname: 'unknown' } + return res.json() + } catch (error) { + console.error('Error fetching tasks:', error) + return {tasks: [], hostname: 'unknown' } + } +} + +async function getHealth() { + const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001' + console.log('Using backend URL for health:', backendUrl) + try { + const res = await fetch(`${backendUrl}/api/health`, { + cache: 'no-store' + }) + if (!res.ok) return { status: 'unhealthy' } + return res.json() + } catch (error) { + console.error('Health check failed:', error) + return { status: 'unhealthy' } + } +} + +export default async function Home() { + const [initialTasks, healthData] = await Promise.all([ + getTasks(), + getHealth() + ]) + + return ( +
+
+

πŸš€ AKS Lab - Task Manager

+
+ Backend Status: {healthData.status} +
+
+ Backend Status: {initialTasks.hostname} +
+
+ +
+ ) +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/next.config.js b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/next.config.js new file mode 100644 index 000000000..5cd8cc341 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + output: 'standalone', +} + +module.exports = nextConfig diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/package-lock.json b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/package-lock.json new file mode 100644 index 000000000..be2568a0c --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/package-lock.json @@ -0,0 +1,706 @@ +{ + "name": "akslab-frontend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "akslab-frontend", + "version": "1.0.0", + "dependencies": { + "axios": "^1.6.0", + "next": "^14.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@next/env": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.33.tgz", + "integrity": "sha512-CgVHNZ1fRIlxkLhIX22flAZI/HmpDaZ8vwyJ/B0SDPTBuLZ1PJ+DWMjCHhqnExfmSQzA/PbZi8OAc7PAq2w9IA==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001757", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", + "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.33.tgz", + "integrity": "sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng==", + "license": "MIT", + "dependencies": { + "@next/env": "14.2.33", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + } + } +} diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/package.json b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/package.json new file mode 100644 index 000000000..d164e0396 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-01/sample-app/frontend/package.json @@ -0,0 +1,17 @@ +{ + "name": "akslab-frontend", + "version": "1.0.0", + "private": true, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "next": "^14.0.0", + "axios": "^1.6.0" + }, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start -p 3000", + "lint": "next lint" + } +} \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-03/k8s-manifests/backend.yaml b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-03/k8s-manifests/backend.yaml new file mode 100644 index 000000000..aa0d17161 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-03/k8s-manifests/backend.yaml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: backend + labels: + app: backend + version: v1 +spec: + replicas: 1 + selector: + matchLabels: + app: backend + template: + metadata: + labels: + app: backend + version: v1 + spec: + containers: + - name: backend + image: acrakslabmwms.azurecr.io/sample-app/backend:v1 + ports: + - containerPort: 3001 + name: http + env: + - name: NODE_ENV + value: "production" + - name: PORT + value: "3001" + resources: + requests: + memory: "128Mi" + cpu: "100m" + limits: + memory: "512Mi" + cpu: "1000m" + livenessProbe: + httpGet: + path: /api/health + port: 3001 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /api/health + port: 3001 + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-03/k8s-manifests/frontend.yaml b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-03/k8s-manifests/frontend.yaml new file mode 100644 index 000000000..40b01a954 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-03/k8s-manifests/frontend.yaml @@ -0,0 +1,28 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend + labels: + app: frontend + version: v1 +spec: + replicas: 1 + selector: + matchLabels: + app: frontend + template: + metadata: + labels: + app: frontend + version: v1 + spec: + containers: + - name: frontend + image: acrakslabmwms.azurecr.io/sample-app/frontend:v1 + imagePullPolicy: Always + ports: + - containerPort: 3000 + name: http + env: + - name: BACKEND_URL + value: "http://backend:3001" \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-04/k8s-manifests/backend-svc.yaml b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-04/k8s-manifests/backend-svc.yaml new file mode 100644 index 000000000..2b06fbf0f --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-04/k8s-manifests/backend-svc.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: backend + labels: + app: backend +spec: + selector: + app: backend + ports: + - protocol: TCP + port: 3001 + targetPort: 3001 + name: http + type: ClusterIP \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-04/k8s-manifests/frontend-svc.yaml b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-04/k8s-manifests/frontend-svc.yaml new file mode 100644 index 000000000..fafeb4d45 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-04/k8s-manifests/frontend-svc.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: frontend + labels: + app: frontend +spec: + selector: + app: frontend + ports: + - protocol: TCP + port: 80 + targetPort: 3000 + name: http + type: LoadBalancer \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-05/k8s-manifests/backend-hpa.yaml b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-05/k8s-manifests/backend-hpa.yaml new file mode 100644 index 000000000..7f8df6173 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-05/k8s-manifests/backend-hpa.yaml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: backend-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: backend + minReplicas: 1 + maxReplicas: 5 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-05/k8s-manifests/backend.yaml b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-05/k8s-manifests/backend.yaml new file mode 100644 index 000000000..b209529cb --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-05/k8s-manifests/backend.yaml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: backend + labels: + app: backend + version: v1 +spec: + replicas: 1 + selector: + matchLabels: + app: backend + template: + metadata: + labels: + app: backend + version: v1 + spec: + containers: + - name: backend + image: [your-acr-name].azurecr.io/[your-backend-image-name]:[tag] + ports: + - containerPort: 3001 + name: http + env: + - name: NODE_ENV + value: "production" + - name: PORT + value: "3001" + resources: + requests: + memory: "128Mi" + cpu: "100m" + limits: + memory: "256Mi" + cpu: "200m" + livenessProbe: + httpGet: + path: /api/health + port: 3001 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /api/health + port: 3001 + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-06/k8s-manifests/backend-stateful.yaml b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-06/k8s-manifests/backend-stateful.yaml new file mode 100644 index 000000000..30077a1e2 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-06/k8s-manifests/backend-stateful.yaml @@ -0,0 +1,58 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: backend + labels: + app: backend + version: v2 +spec: + serviceName: backend + replicas: 1 + selector: + matchLabels: + app: backend + template: + metadata: + labels: + app: backend + version: v2 + spec: + containers: + - name: backend + image: [your-acr-name].azurecr.io/[your-backend-image-name]:[tag] + ports: + - containerPort: 3001 + name: http + env: + - name: NODE_ENV + value: "production" + - name: PORT + value: "3001" + - name: DATA_PATH + value: "/data" + volumeMounts: + - name: task-data + mountPath: /data + resources: + requests: + memory: "128Mi" + cpu: "100m" + limits: + memory: "256Mi" + cpu: "200m" + livenessProbe: + httpGet: + path: /api/health + port: 3001 + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /api/health + port: 3001 + initialDelaySeconds: 5 + periodSeconds: 5 + volumes: + - name: task-data + persistentVolumeClaim: + claimName: task-data-pvc \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-06/k8s-manifests/pvc.yaml b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-06/k8s-manifests/pvc.yaml new file mode 100644 index 000000000..0374f6429 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/resources/solution-06/k8s-manifests/pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: task-data-pvc +spec: + accessModes: + - ReadWriteOnce + storageClassName: managed-csi + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-01.md b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-01.md new file mode 100644 index 000000000..fc9e0bb2c --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-01.md @@ -0,0 +1,270 @@ +# Exercise 1: Create Azure Container Registry and Push Images + +## Objective +In this exercise, you will create an Azure Container Registry (ACR) to store your Docker container images. You'll then build and push container images to this registry, which will later be deployed to your AKS cluster. + +## What is Azure Container Registry? + +Azure Container Registry (ACR) is a managed, private Docker registry service based on the open-source Docker Registry 2.0. It allows you to: +- Store and manage container images and artifacts +- Integrate seamlessly with Azure Kubernetes Service +- Implement security scanning and geo-replication +- Control access with Azure Active Directory + +## Prerequisites +- Completed Exercise 0 (Resource Group and Jumphost created) +- Docker installed on your jumphost (not required if using ACR Tasks) +- Azure CLI authenticated + +## Lab Variables + +Set up your environment variables with your initials: + +```bash +export YOUR_INITIALS="" # Replace with your initials (e.g., js for John Smith) +export RESOURCE_GROUP="rg-aks-lab-${YOUR_INITIALS}" +export LOCATION="francecentral" +export ACR_NAME="acrakslabACR${YOUR_INITIALS}" +``` + +Example for John Smith: +```bash +export YOUR_INITIALS="js" +export RESOURCE_GROUP="rg-aks-lab-js" +export LOCATION="francecentral" +export ACR_NAME="acrakslabjs" +``` + +## Tasks + +### Task 1: Create an Azure Container Registry + +1. **Define your ACR name** + + ACR names must be: + - Globally unique across all of Azure + - 5-50 characters long + - Contain only alphanumeric characters (no hyphens or special characters) + + **Naming format**: `acrakslabACR` + + Example: `acrakslabjs` (for John Smith with initials "js") + +2. **Create the ACR using Azure CLI** + + ```bash + az acr create \ + --name acrakslab \ + --resource-group rg-aks-lab- \ + --sku Basic \ + --location francecentral + ``` + + Replace `` with your initials (e.g., `js` for John Smith). + + Example: + ```bash + az acr create \ + --name acrakslabjs \ + --resource-group rg-aks-lab-js \ + --sku Basic \ + --location francecentral + ``` + + **SKU Options:** + - `Basic`: Cost-effective for development and testing + - `Standard`: More storage and throughput + - `Premium`: Highest storage, geo-replication, and advanced features + +3. **Verify the ACR creation** + ```bash + az acr show --name --output table + ``` + +### Task 2: Login to Azure Container Registry + +1. **Authenticate Docker with ACR** + ```bash + az acr login --name + ``` + + You should see: `Login Succeeded` + +2. **Get the ACR login server** (you'll need this later) + ```bash + az acr show --name --query loginServer --output tsv + ``` + + This will return something like: `.azurecr.io` + +3. **Save the login server as a variable** + ```bash + export ACR_LOGIN_SERVER=$(az acr show --name --query loginServer --output tsv) + echo $ACR_LOGIN_SERVER + ``` + +### Task 3: Build and Push the provided Sample Application Images + +#### Option A: Build images locally with Docker + +You can find the source code for the sample application in the [`resources/exercise-01/sample-app`](../resources/exercise-01/sample-app) directory. +The application consists of a simple backend API and a frontend UI. +You can build and push the images manually using Docker, following these steps: + +1. **Navigate to the sample application directory** + ```bash + cd ../resources/exercise-01/sample-app/backend + ``` + +2. **Review the Dockerfile** + ```bash + cat Dockerfile + ``` + +3. **Build the Docker image** + ```bash + docker build -t $ACR_LOGIN_SERVER/sample-app/backend:v1 . + ``` + +4. **Push the image to ACR** + ```bash + docker push $ACR_LOGIN_SERVER/sample-app/backend:v1 + ``` + +5. **Repeat for the frontend application** + ```bash + cd ../frontend + cat Dockerfile + docker build -t $ACR_LOGIN_SERVER/sample-app/frontend:v1 . + docker push $ACR_LOGIN_SERVER/sample-app/frontend:v1 + ``` + +#### Option B: Use ACR Build (Recommended) + +ACR can build images directly without local Docker: + +1. **Build a backend application** + ```bash + az acr build \ + --registry \ + --image sample-app/backend:v1 \ + ~/MicroHack/walkthrough/resources/exercise-01/sample-app/backend + ``` + +2. **Build a frontend application** + ```bash + az acr build \ + --registry \ + --image sample-app/frontend:v1 \ + ~/MicroHack/walkthrough/resources/exercise-01/sample-app/frontend + ``` + + This builds the image in Azure and pushes it to your registry automatically. + +#### Option C: Import a Public Image + +For testing, you can import a public image from Docker Hub: + +```bash +az acr import \ + --name \ + --source docker.io/library/nginx:latest \ + --image nginx:latest +``` + +### Task 4: List and Verify Images in ACR + +1. **List all repositories in your ACR** + ```bash + az acr repository list --name --output table + ``` + +2. **List tags for a specific repository** + ```bash + az acr repository show-tags \ + --name \ + --repository sample-app/backend \ + --output table + ``` + +3. **View detailed information about an image** + ```bash + az acr repository show \ + --name \ + --repository sample-app/backend + ``` +4. **You can do the same for the frontend image:** + ```bash + az acr repository show-tags \ + --name \ + --repository sample-app/frontend \ + --output table + + az acr repository show \ + --name \ + --repository sample-app/frontend + ``` + +## Verification Checklist + +Before moving to the next exercise, ensure: +- [ ] Azure Container Registry is created successfully +- [ ] You can login to ACR with `az acr login` +- [ ] At least one container image is pushed to ACR +- [ ] You can list repositories and tags +- [ ] You have noted your ACR login server name + +## Expected Output + +When listing repositories, you should see output like: + +``` +Result +----------- +sample-app +nginx +backend-app +frontend-app +``` + +## Best Practices + +- **Naming**: Use consistent naming for your images (e.g., `appname:version`) +- **Tagging**: Use semantic versioning tags (v1, v1.0.0, latest) +- **Security**: Avoid enabling admin access in production; use managed identities instead +- **Image Scanning**: Consider enabling Azure Defender for container registries +- **Retention Policies**: Set up retention policies to automatically clean up old images + +## Troubleshooting + +- **"unauthorized: authentication required" error**: Run `az acr login` again +- **Name not available**: ACR names must be globally unique; try a different name +- **Docker daemon not running**: Start Docker with `sudo systemctl start docker` +- **Build fails**: Check your Dockerfile syntax and ensure all required files are present +- **Push denied**: Verify you have the correct permissions on the ACR + +## Useful Commands + +```bash +# Check ACR quotas and usage +az acr show-usage --name + +# Delete a repository +az acr repository delete --name --repository sample-app --yes + +# Delete a specific image tag +az acr repository delete --name --image sample-app:v1 --yes + +# Show ACR credentials (if admin enabled) +az acr credential show --name +``` + +## Additional Resources + +- [Azure Container Registry Documentation](https://docs.microsoft.com/azure/container-registry/) +- [ACR Best Practices](https://docs.microsoft.com/azure/container-registry/container-registry-best-practices) +- [ACR Tasks](https://docs.microsoft.com/azure/container-registry/container-registry-tasks-overview) + +## Next Steps + +Once your images are stored in ACR, proceed to [Exercise 2: Create AKS Cluster with ACR Integration](02-create-aks-cluster.md) diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-02.md b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-02.md new file mode 100644 index 000000000..d8af9877d --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-02.md @@ -0,0 +1,377 @@ +# Exercise 2: Create an AKS Cluster with ACR Integration + +## Objective +In this exercise, you will create an Azure Kubernetes Service (AKS) cluster with specific configurations and integrate it with your Azure Container Registry (ACR) to enable seamless image pulling. + +## What is Azure Kubernetes Service (AKS)? + +Azure Kubernetes Service (AKS) is a managed Kubernetes service that simplifies deploying and managing containerized applications. AKS reduces the complexity of Kubernetes by: +- Managing the control plane (master nodes) for you +- Providing automatic upgrades and patching +- Integrating with other Azure services +- Offering built-in monitoring and security features + +## Prerequisites +- Completed Exercise 1 (ACR created with images) +- Resource Group created +- Azure CLI authenticated + +## Lab Variables + +Set up your environment variables: + +```bash +export YOUR_INITIALS="" # Replace with your initials (e.g., js for John Smith) +export RESOURCE_GROUP="rg-aks-lab-${YOUR_INITIALS}" +export AKS_CLUSTER_NAME="aks-lab-${YOUR_INITIALS}" +export ACR_NAME="acrakslabACR${YOUR_INITIALS}" +export LOCATION="francecentral" +``` + +Example for John Smith: +```bash +export YOUR_INITIALS="js" +export RESOURCE_GROUP="rg-aks-lab-js" +export AKS_CLUSTER_NAME="aks-lab-js" +export ACR_NAME="acrakslabjs" +export LOCATION="francecentral" +``` + +## Tasks + +### Task 1: Plan Your AKS Cluster Configuration + +Before creating the cluster, consider these key configuration options: + +**Cluster Name**: `aks-lab-` (e.g., `aks-lab-js` for John Smith) + +**Node Configuration**: +- **VM Size**: `Standard_B2s` (for lab) or `Standard_DS2_v2` (recommended) +- **Node Count**: Start with 2 nodes +- **Node Pool Name**: `nodepool1` (default system node pool) + +**Networking**: +- **Network Plugin**: `azure` (Azure CNI) - Provides better integration with Azure networking +- **Load Balancer**: Standard SKU + +**Authentication**: +- **Identity**: System-assigned managed identity (recommended) + +### Task 2: Create AKS Cluster with ACR Integration + +#### Method 1: Create AKS and Attach ACR (Recommended) + +```bash +# Set variables for easier reuse (use your initials, e.g., js for John Smith) +export RESOURCE_GROUP="rg-aks-lab-" +export AKS_CLUSTER_NAME="aks-lab-" +export ACR_NAME="acrakslabACR" +export LOCATION="francecentral" + +# Create AKS cluster with ACR integration +az aks create \ + --resource-group $RESOURCE_GROUP \ + --name $AKS_CLUSTER_NAME \ + --node-count 2 \ + --node-vm-size Standard_B2s \ + --enable-managed-identity \ + --attach-acr $ACR_NAME \ + --generate-ssh-keys \ + --location $LOCATION \ + --network-plugin azure \ + --load-balancer-sku standard +``` + +**Key Parameters Explained**: +- `--node-count 2`: Creates 2 worker nodes +- `--node-vm-size`: Specifies the size of each node VM +- `--enable-managed-identity`: Uses managed identity for authentication +- `--attach-acr`: Automatically configures ACR pull permissions +- `--generate-ssh-keys`: Creates SSH keys for node access +- `--network-plugin azure`: Uses Azure CNI for advanced networking features and better Azure integration +- `--load-balancer-sku standard`: Uses Standard Load Balancer + +**Note**: This process takes 5-10 minutes. The output will show cluster creation progress. + +#### Method 2: Create AKS First, Then Attach ACR + +If you already have an AKS cluster without ACR integration: + +```bash +# Attach ACR to existing AKS cluster +az aks update \ + --resource-group $RESOURCE_GROUP \ + --name $AKS_CLUSTER_NAME \ + --attach-acr $ACR_NAME +``` + +### Task 3: Understanding ACR Integration + +The `--attach-acr` flag automatically: +1. Creates a role assignment for the AKS managed identity +2. Grants `AcrPull` permission on the specified ACR +3. Allows AKS nodes to pull images without explicit credentials + +**Verify the integration**: +```bash +# Check the role assignment +az role assignment list \ + --scope $(az acr show --name $ACR_NAME --query id --output tsv) \ + --output table +``` + +You should see a role assignment with `AcrPull` role for your AKS managed identity. + +### Task 4: Get AKS Credentials and Connect + +#### Understanding AKS Credentials + +When you run `az aks get-credentials`, several important things happen: + +1. **What are Kubernetes credentials?** + - Kubernetes uses a kubeconfig file (usually at `~/.kube/config`) to store cluster connection information + - This file contains: + - **Cluster information**: API server endpoint, certificate authority data + - **User credentials**: Authentication tokens or certificates + - **Context**: Links a cluster with a user and optional namespace + +2. **What does get-credentials do?** + - Downloads the cluster's API server address + - Retrieves authentication credentials (using your Azure identity) + - Merges this information into your local kubeconfig file + - Sets the current context to point to your AKS cluster + - Allows `kubectl` to authenticate to the cluster using Azure AD + +3. **How authentication works:** + - AKS uses Azure Active Directory (Azure AD) for authentication + - When you use `kubectl`, it calls Azure AD to get a token + - This token is sent to the AKS API server to authenticate your requests + - Your Azure RBAC permissions determine what you can do in the cluster + +#### Download Cluster Credentials + +1. **Get credentials and merge into kubeconfig** + ```bash + az aks get-credentials \ + --resource-group $RESOURCE_GROUP \ + --name $AKS_CLUSTER_NAME + ``` + + Expected output: + ``` + Merged "aks-lab-js" as current context in /home/azureuser/.kube/config + ``` + +2. **Understanding the command options:** + + Additional useful flags: + ```bash + # Overwrite existing credentials (useful if you need to refresh) + az aks get-credentials \ + --resource-group $RESOURCE_GROUP \ + --name $AKS_CLUSTER_NAME \ + --overwrite-existing + + # Get admin credentials (bypasses Azure AD, not recommended for production) + az aks get-credentials \ + --resource-group $RESOURCE_GROUP \ + --name $AKS_CLUSTER_NAME \ + --admin + + # Save to a specific kubeconfig file + az aks get-credentials \ + --resource-group $RESOURCE_GROUP \ + --name $AKS_CLUSTER_NAME \ + --file ./my-cluster-config + ``` + +3. **View your kubeconfig file** + ```bash + # View the entire kubeconfig + cat ~/.kube/config + + # View current context + kubectl config current-context + + # List all contexts + kubectl config get-contexts + ``` + +4. **Verify the connection** + ```bash + kubectl cluster-info + ``` + + This shows the Kubernetes control plane and CoreDNS endpoints. + +5. **View cluster nodes** + ```bash + kubectl get nodes + ``` + + You should see 2 nodes in `Ready` status. + +6. **Check node details** + ```bash + kubectl get nodes -o wide + ``` + + This shows additional information like internal/external IPs, OS, and kernel version. + +### Task 5: Explore Your AKS Cluster + +1. **View namespaces** + ```bash + kubectl get namespaces + ``` + +2. **View system pods** + ```bash + kubectl get pods --all-namespaces + ``` + +3. **Check cluster version** + ```bash + kubectl version + ``` + +4. **View cluster configuration** + ```bash + kubectl config view + ``` + +### Task 6: View Cluster in Azure Portal + +1. **Navigate to your AKS cluster** + - Go to Azure Portal + - Search for "Kubernetes services" + - Click on your cluster name + +2. **Explore the portal features** + - **Overview**: View cluster status, version, location + - **Node pools**: See your node configuration + - **Networking**: Review network settings + - **Insights**: View monitoring data (if enabled) + - **Workloads**: View deployments (will be used in next exercise) + +### Task 7: Test ACR Integration + +Create a simple pod using an image from your ACR: + +```bash +# Replace with your ACR login server and image name +export ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --query loginServer --output tsv) + +# Create a test pod +kubectl run test-acr-pod \ + --image=$ACR_LOGIN_SERVER/sample-app/backend:v1 \ + --restart=Never + +# Check pod status (should pull image successfully) +kubectl get pod test-acr-pod + +# View pod details +kubectl describe pod test-acr-pod + +# Clean up test pod +kubectl delete pod test-acr-pod +``` + +If the image pulls successfully, your ACR integration is working correctly! + +## Configuration Best Practices + +### Recommended Configurations + +**For Development/Lab**: +```bash +--node-vm-size Standard_B2s +--node-count 1-2 +--network-plugin azure +``` + +**For Production**: +```bash +--node-vm-size Standard_DS2_v2 or higher +--node-count 3+ (for high availability) +--network-plugin azure +--enable-private-cluster +--enable-cluster-autoscaler +--network-policy azure (or calico) +``` + +### Security Configurations + +```bash +# Enable Azure Policy +az aks enable-addons \ + --resource-group $RESOURCE_GROUP \ + --name $AKS_CLUSTER_NAME \ + --addons azure-policy + +# Enable Azure Key Vault Provider for Secrets Store CSI Driver +az aks enable-addons \ + --resource-group $RESOURCE_GROUP \ + --name $AKS_CLUSTER_NAME \ + --addons azure-keyvault-secrets-provider +``` + +## Verification Checklist + +Before moving to the next exercise, ensure: +- [ ] AKS cluster is created and shows "Succeeded" provisioning state +- [ ] You can connect to the cluster with kubectl +- [ ] All nodes are in "Ready" status +- [ ] ACR is attached and role assignment exists +- [ ] Test pod can pull images from ACR +- [ ] You can view the cluster in Azure Portal + +## Expected Output + +**kubectl get nodes** should show: +``` +NAME STATUS ROLES AGE VERSION +aks-nodepool1-12345678-vmss000000 Ready agent 5m v1.27.x +aks-nodepool1-12345678-vmss000001 Ready agent 5m v1.27.x +``` + +## Troubleshooting + +- **Cluster creation fails**: Check subscription quota for VM cores +- **Cannot connect with kubectl**: Re-run `az aks get-credentials` +- **Nodes not ready**: Wait a few minutes; check with `kubectl describe node ` +- **Image pull fails**: Verify ACR attachment with `az aks show --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query identityProfile` +- **Permission issues**: Ensure your Azure account has proper RBAC roles + +## Useful Commands + +```bash +# Show AKS cluster details +az aks show --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME + +# List available Kubernetes versions +az aks get-versions --location $LOCATION --output table + +# Scale the node pool +az aks scale --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME --node-count 3 + +# Upgrade AKS cluster +az aks upgrade --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME --kubernetes-version + +# Stop AKS cluster (to save costs) +az aks stop --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME + +# Start AKS cluster +az aks start --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME +``` + +## Additional Resources + +- [AKS Documentation](https://docs.microsoft.com/azure/aks/) +- [AKS Best Practices](https://docs.microsoft.com/azure/aks/best-practices) +- [Authenticate with ACR from AKS](https://docs.microsoft.com/azure/aks/cluster-container-registry-integration) +- [AKS Networking Concepts](https://docs.microsoft.com/azure/aks/concepts-network) + +## Next Steps + +Now that your AKS cluster is ready and integrated with ACR, proceed to [Exercise 3: Deploy Applications on AKS](03-deploy-applications.md) diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-03.md b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-03.md new file mode 100644 index 000000000..90e99aded --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-03.md @@ -0,0 +1,311 @@ +# Exercise 3: Deploy Applications on AKS + +## Objective +In this exercise, you will deploy containerized applications to your AKS cluster using images from your Azure Container Registry. You'll learn to deploy applications using both kubectl commands and the Azure Portal. + +## What is a Kubernetes Deployment? + +A Deployment in Kubernetes is a resource that manages a replicated application. It provides: +- Declarative updates for Pods and ReplicaSets +- Rollback capability +- Scaling functionality +- Self-healing (automatically replaces failed pods) + +## Prerequisites +- Completed Exercise 2 (AKS cluster with ACR integration) +- kubectl configured to connect to your cluster +- Images available in your ACR + +## Tasks + +### Task 1: Prepare Your Deployment Configuration + +First, verify your ACR image details: + +```bash +# Set variables +export ACR_NAME="" +export ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --query loginServer --output tsv) + +# List available images +az acr repository list --name $ACR_NAME --output table + +# Check specific image tags +az acr repository show-tags --name $ACR_NAME --repository sample-app/backend --output table +az acr repository show-tags --name $ACR_NAME --repository sample-app/frontend --output table +``` + +### Task 2: Deploy Application Using kubectl + +#### Method A: Deploy Using Kubectl Run (Quick Test) + +```bash +# Deploy a simple pod +kubectl run backend \ + --image=$ACR_LOGIN_SERVER/sample-app/backend:v1 \ + --port=3001 + +# Check the pod status +kubectl get pods + +# View pod details +kubectl describe pod backend +``` +Please note the `--port` flag: it should be set to the port your application listens on inside the container. + +#### Method B: Deploy Using a Deployment (Recommended) + +1. **Find and review the deployments manifest** + You can find pre-build deployment manifests in the [`resources/exercise-03`](../resources/exercise-03/k8s-manifests) directory of the lab repository. + + **Important**: Replace the ACR Server name, image name and tag with your actual values. + +2. **Apply the deployment** + ```bash + kubectl apply -f backend.yaml + kubectl apply -f frontend.yaml + ``` + +3. **Verify the deployment** + ```bash + # Check deployment status + kubectl get deployments + + # Check pods created by the deployment + kubectl get pods + + # Watch pods being created + kubectl get pods --watch + ``` + + Press `Ctrl+C` to stop watching. + +4. **View detailed deployment information** + ```bash + kubectl describe deployment backend + kubectl describe deployment frontend + ``` + +### Task 3: Deploy Application Using Azure Portal + +The Azure Portal provides a visual interface for deploying applications to AKS. + +#### Deploy from Azure Container Registry via Portal + +1. **Navigate to your AKS cluster in Azure Portal** + - Go to "Kubernetes services" + - Click on your cluster name + +2. **Access the Workloads section** + - In the left menu, click on "Workloads" + - Click "+ Create" + +3. **Deploy using YAML Editor** + + - Select "Apply a YAML" + - Paste your deployment YAML + - Click "Apply" + +4. **Monitor the deployment** + - View the deployment in the "Workloads" section + - Click on the deployment to see details + - Check the "Pods" tab to see running pods + +#### Deploy a Sample Image Directly + +1. **Using a public image for testing** + + In the YAML editor, you can deploy a sample nginx application: + + ```yaml + apiVersion: apps/v1 + kind: Deployment + metadata: + name: nginx-demo + spec: + replicas: 2 + selector: + matchLabels: + app: nginx-demo + template: + metadata: + labels: + app: nginx-demo + spec: + containers: + - name: nginx + image: nginx:latest + ports: + - containerPort: 80 + ``` + +### Task 4: Manage Your Deployments + +1. **View deployment status** + ```bash + kubectl rollout status deployment/backend + kubectl rollout status deployment/frontend + ``` + +2. **View deployment history** + ```bash + kubectl rollout history deployment/backend + kubectl rollout history deployment/frontend + ``` + +> [!WARNING] +> Don't execute the following commands. They are for learning purposes only. + +3. **Scale a deployment** + ```bash + kubectl scale deployment backend --replicas=5 + kubectl get pods + ``` + +4. **Update deployment image** + ```bash + kubectl set image deployment/backend \ + backend=$ACR_LOGIN_SERVER/sample-app/backend:v2 + ``` + +5. **Check rollout status** + ```bash + kubectl rollout status deployment/backend + ``` + +6. **Rollback if needed** + ```bash + kubectl rollout undo deployment/backend + ``` + +### Task 5: View Application Logs + +1. **Get logs from a specific pod** + ```bash + # List pods + kubectl get pods + + # Get logs (replace with actual pod name) + kubectl logs + + # Follow logs in real-time + kubectl logs -f + ``` + +2. **Get logs from all pods in a deployment** + ```bash + kubectl logs -l app=sample-app --all-containers=true + ``` + +### Task 6: Access Backend locally for testing + +1. **Port forwarding to test application** + ```bash + # Forward local port to pod port + kubectl port-forward deployment/backend 5678:3001 + ``` + + Open a new terminal and test: + ```bash + curl http://localhost:5678/api/health + ``` + +2. **Execute commands inside a pod** + ```bash + kubectl exec -it -- /bin/bash + # Or for alpine-based images: + kubectl exec -it -- /bin/sh + ``` + +## Verification Checklist + +Before moving to the next exercise, ensure: +- [ ] At least one application is deployed successfully +- [ ] Pods are running (status: Running) +- [ ] You can view deployments in both kubectl and Azure Portal +- [ ] Images are pulled successfully from ACR +- [ ] You can access application logs +- [ ] You understand how to scale deployments + +## Expected Output + +**kubectl get deployments** should show: +``` +NAME READY UP-TO-DATE AVAILABLE AGE +sample-app 3/3 3 3 5m +backend-app 2/2 2 2 3m +frontend-app 3/3 3 3 3m +``` + +**kubectl get pods** should show: +``` +NAME READY STATUS RESTARTS AGE +sample-app-5d4f8c7b9d-abcde 1/1 Running 0 5m +sample-app-5d4f8c7b9d-fghij 1/1 Running 0 5m +sample-app-5d4f8c7b9d-klmno 1/1 Running 0 5m +... +``` + +## Troubleshooting + +- **ImagePullBackOff error**: Check ACR integration and image name + ```bash + kubectl describe pod + ``` +- **CrashLoopBackOff**: Check application logs for errors + ```bash + kubectl logs + ``` +- **Pods not starting**: Check resource constraints and node capacity + ```bash + kubectl describe nodes + kubectl top nodes + ``` +- **Cannot find image**: Verify image exists in ACR + ```bash + az acr repository list --name $ACR_NAME + ``` + +## Best Practices + +- **Use Deployments**: Instead of creating pods directly, use Deployments for better management +- **Set Resource Limits**: Always define resource requests and limits +- **Use Labels**: Apply meaningful labels for organization and selection +- **Health Checks**: Add liveness and readiness probes (covered in advanced topics) +- **ConfigMaps and Secrets**: Store configuration separately from container images +- **Version Tags**: Use specific version tags instead of `latest` + +## Useful Commands + +```bash +# Get all resources +kubectl get all + +# Delete a deployment +kubectl delete deployment sample-app + +# Edit a deployment +kubectl edit deployment sample-app + +# Get deployment YAML +kubectl get deployment sample-app -o yaml + +# Apply multiple files +kubectl apply -f ./deployments/ + +# Delete resources from file +kubectl delete -f deployment.yaml + +# Get events +kubectl get events --sort-by=.metadata.creationTimestamp +``` + +## Additional Resources + +- [Kubernetes Deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) +- [Deploy to AKS from ACR](https://docs.microsoft.com/azure/aks/tutorial-kubernetes-deploy-application) +- [Kubectl Cheat Sheet](https://kubernetes.io/docs/reference/kubectl/cheatsheet/) + +## Next Steps + +Your applications are now running in the cluster, but they're not accessible from outside. Proceed to [Exercise 4: Expose Application with Load Balancer](04-expose-application.md) to make your applications accessible. diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-04.md b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-04.md new file mode 100644 index 000000000..590a837f7 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-04.md @@ -0,0 +1,332 @@ +# Exercise 4: Expose Application with Load Balancer + +## Objective +In this exercise, you will expose your deployed applications to the internet using Kubernetes Services and Azure Load Balancer. You'll learn different service types and how to make your applications accessible from outside the cluster. + +## What is a Kubernetes Service? + +A Kubernetes Service is an abstraction that defines a logical set of Pods and a policy to access them. Services provide: +- Stable IP addresses and DNS names +- Load balancing across pods +- Service discovery within the cluster +- External access to applications + +### Service Types + +- **ClusterIP** (Default): Exposes service only within the cluster +- **NodePort**: Exposes service on each node's IP at a static port +- **LoadBalancer**: Exposes service externally using a cloud provider's load balancer +- **ExternalName**: Maps service to a DNS name + +## Prerequisites +- Completed Exercise 3 (Applications deployed) +- Running deployments in your AKS cluster +- kubectl configured + +## Tasks + +Find and review the service manifests in the [`resources/exercise-04`](../resources/exercise-04/k8s-manifest/) directory of the lab repository. + +### Task 1: Expose the Backend internally through ClusterIP + +This service will expose the backend application internally within the cluster using ClusterIP. + +1. **Apply the service configuration for the backend** + + ```bash + kubectl apply -f backend-svc.yaml + ``` + +2. **Verify the service** + ```bash + kubectl get services + kubectl describe service backend + ``` + + Note the ClusterIP assigned. This IP is only accessible within the cluster. + +### Task 2: Expose Frontend externally with LoadBalancer + +Now, let's expose an application to the internet using Azure Load Balancer. + +1. **Apply the service configuration for the frontend** + + ```bash + kubectl apply -f frontend-svc.yaml + ``` + +2. **Watch the service creation** + ```bash + kubectl get service frontend-svc --watch + ``` + + Wait for the `EXTERNAL-IP` to change from `` to an actual IP address. This can take 2-3 minutes. + Press `Ctrl+C` when the IP appears. + +4. **Get the external IP** + ```bash + kubectl get service frontend-svc + ``` + + Note the EXTERNAL-IP address. + +### Task 3: Access Your Application + +1. **Get the external IP address** + ```bash + export EXTERNAL_IP=$(kubectl get service frontend-svc -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo $EXTERNAL_IP + ``` + +2. **Test the application** + ```bash + curl http://$EXTERNAL_IP + ``` + +3. **Access from browser** + - Open your web browser + - Navigate to `http://` + - You should see your application + +### Task 4: View Load Balancer in Azure Portal + +1. **Navigate to your Resource Group** + - Go to Azure Portal + - Open the MC___ resource group + - You'll see a new Load Balancer resource called `kubernetes` created automatically + +2. **Examine the Load Balancer** + - Click on the Load Balancer + - View **Frontend IP configuration**: Shows the public IP + - View **Backend pools**: Shows your AKS nodes + - View **Health probes**: Shows health check configuration + - View **Load balancing rules**: Shows traffic distribution rules + +3. **View the Public IP Address** + - Click on the Public IP address associated with the load balancer + - Note the IP address and DNS name (if configured) + +### Task 5: Expose Application from Azure Portal + + +> [!WARNING] +> The following tasks are optional. You can skip them if you only want to learn about simple Load Balancer configuration. If instead you want to learn more, continue with the next task, but notice that the commands are just examples for reference, not directly aligned with the sample application and the manifests provided. + +You can also create services using the Azure Portal. + +1. **Navigate to your AKS cluster** + - Go to "Kubernetes services" + - Click on your cluster + +2. **Access Services and ingresses** + - In the left menu, click "Services and ingresses" + - Click "+ Create" + +3. **Create a LoadBalancer service** + - Select "Service" + - Compile the form with the value you have in the manifest file + - Click "Create" + - **OR** Select "Apply a YAML" + - Paste your service YAML definition + - Click "Apply" + +4. **Monitor the service creation** + - View the service in the "Services and ingresses" list + - Wait for the external IP to be assigned + - Click on the service to view details + +### Task 6: Create a LoadBalancer with Specific Configuration + +For more control over the load balancer, you can add annotations: + +```bash +cat > frontend-service-lb.yaml <" + labels: + app: frontend-app +spec: + type: LoadBalancer + selector: + app: frontend-app + ports: + - protocol: TCP + port: 80 + targetPort: 80 + sessionAffinity: ClientIP +EOF +``` + +Apply the service: +```bash +kubectl apply -f frontend-service-lb.yaml +``` + +### Task 7: Test Load Balancing + +Let's verify that traffic is being distributed across pods: + +1. **Scale up the deployment** + ```bash + kubectl scale deployment frontend --replicas=5 + ``` + +2. **Make multiple requests** + ```bash + for i in {1..10}; do + curl http://$EXTERNAL_IP + echo "Request $i completed" + done + ``` + +3. **Check logs from different pods** + ```bash + kubectl logs -l app=frontend-app --tail=5 + ``` + + You should see logs from multiple pods, indicating traffic distribution. + +### Task 8: Configure NodePort Service (Alternative) + +NodePort can be used when LoadBalancer is not available or for testing: + +```bash +cat > sample-app-nodeport.yaml < 443/TCP 1h +backend-service ClusterIP 10.0.45.23 8080/TCP 10m +sample-app-service LoadBalancer 10.0.132.45 20.123.45.67 80:31234/TCP 5m +frontend-service LoadBalancer 10.0.198.12 20.234.56.78 80:32456/TCP 3m +``` + +## Troubleshooting + +- **External IP stuck at ``**: + ```bash + kubectl describe service sample-app-service + kubectl get events --sort-by=.metadata.creationTimestamp + ``` + Check for quota issues or Azure subscription limits + +- **Cannot access application**: + - Verify pods are running: `kubectl get pods` + - Check service selector matches pod labels: `kubectl get pods --show-labels` + - Verify Network Security Group (NSG) rules in Azure Portal + +- **Connection timeout**: + - Check if pods are ready: `kubectl get pods` + - Verify pod logs: `kubectl logs ` + - Test from within cluster first: `kubectl run test --rm -it --image=busybox -- wget -O- http://sample-app-service` + +- **503 Service Unavailable**: + - Check pod health: `kubectl describe pod ` + - Verify container port matches service targetPort + +## Understanding Azure Load Balancer with AKS + +When you create a LoadBalancer service in AKS: + +1. **Azure Resources Created**: + - Public IP Address + - Load Balancer with frontend IP configuration + - Backend pool (AKS nodes) + - Health probe + - Load balancing rule + +2. **Traffic Flow**: + - External traffic β†’ Public IP β†’ Load Balancer β†’ Node β†’ kube-proxy β†’ Pod + +3. **High Availability**: + - Traffic is distributed across healthy pods + - If a pod fails, traffic is redirected automatically + - Health probes ensure only healthy pods receive traffic + +## Best Practices + +- **Use LoadBalancer for production**: Provides HA and automatic failover +- **ClusterIP for internal services**: Backend services don't need external access +- **Set resource limits**: Ensure pods can handle incoming traffic +- **Use health probes**: Add liveness and readiness probes to deployments +- **Consider Ingress**: For HTTP/HTTPS routing to multiple services (advanced topic) +- **Monitor costs**: Each LoadBalancer service creates a billable Azure Load Balancer + +## Useful Commands + +```bash +# List all services +kubectl get svc + +# Describe a service +kubectl describe svc sample-app-service + +# Get service endpoints (pods behind the service) +kubectl get endpoints sample-app-service + +# Edit a service +kubectl edit svc sample-app-service + +# Delete a service +kubectl delete svc sample-app-service + +# Port forward for testing +kubectl port-forward svc/sample-app-service 8080:80 + +# Get service YAML +kubectl get svc sample-app-service -o yaml +``` + +## Additional Resources + +- [Kubernetes Services](https://kubernetes.io/docs/concepts/services-networking/service/) +- [AKS Load Balancer](https://docs.microsoft.com/azure/aks/load-balancer-standard) +- [Service Types in Kubernetes](https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types) +- [Azure Load Balancer Documentation](https://docs.microsoft.com/azure/load-balancer/) + +## Next Steps + +Your applications are now accessible from the internet! Proceed to [Exercise 5: Scaling in AKS](05-scaling.md) to learn about autoscaling. diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-05.md b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-05.md new file mode 100644 index 000000000..f843f7f53 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-05.md @@ -0,0 +1,407 @@ +# Exercise 5: Scaling in AKS + +## Objective +In this exercise, you will learn about scaling in Kubernetes and AKS, including pod autoscaling (HPA/VPA) and node pool autoscaling. You'll understand how to handle varying workloads by adjusting the number of pod replicas or cluster nodes. + +## What is Scaling in Kubernetes? + +Scaling allows your applications to handle varying workloads by adjusting the number of pod replicas or cluster nodes. + +**Types of Scaling**: +- **Horizontal Pod Autoscaler (HPA)**: Scales the number of pod replicas based on metrics +- **Vertical Pod Autoscaler (VPA)**: Adjusts CPU and memory requests/limits for pods +- **Cluster Autoscaler**: Scales the number of nodes in your cluster + +## Prerequisites +- Completed Exercise 4 (Applications exposed) +- Running AKS cluster with deployed applications +- kubectl configured + +## Tasks + +### Task 1: Manual Scaling + +Let's start with manual scaling to understand the basics. +Let's use the deployment for the backend application we created in Exercise 3. + +1. **Scale pods manually using kubectl** + ```bash + # Scale up to 3 replicas + kubectl scale deployment backend --replicas=3 + + # Verify the scaling + kubectl get pods -l app=backend + ``` + +2. **Watch pods being created** + ```bash + kubectl get pods --watch + ``` + Press `Ctrl+C` to stop watching. + +3. **Scale down** + ```bash + kubectl scale deployment backend --replicas=2 + kubectl get pods -l app=backend + ``` + +### Task 2: Horizontal Pod Autoscaler (HPA) + +HPA automatically scales the number of pods based on observed CPU utilization or custom metrics. + +#### Prerequisites for HPA + +1. **Verify Metrics Server is installed** (usually pre-installed in AKS) + ```bash + kubectl get deployment metrics-server -n kube-system + ``` + + You should see the metrics-server deployment with READY status (e.g., `2/2`). + This kind of system components are always deployed in the `kube-system` namespace, as DaemonSets, deployments that are spread across all nodes. + +2. **Only if not installed, enable it** + ```bash + kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml + ``` + + Wait for the Metrics Server to be ready: + ```bash + kubectl wait --for=condition=ready pod -l k8s-app=metrics-server -n kube-system --timeout=120s + ``` + +3. **Verify metrics are available** + ```bash + kubectl top nodes + kubectl top pods + ``` + + If you see CPU and memory usage (not errors), the Metrics Server is working correctly. + + **Note**: It may take 60-90 seconds after cluster creation for metrics to become available. + +#### Create HPA + +1. **Ensure your deployment has resource requests** (required for HPA) + + Check the backend deployment file [`../resources/exercise-03/k8s-manifests/backend.yaml`](../resources/exercise-03/k8s-manifests/backend.yaml) to confirm it has resource requests defined. + If not, add the following configuration under container specs (be sure to follow YAML indentation): + ```yaml + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 256Mi + ``` + You can also find the corrected file version in [`../resources/exercise-05/k8s-manifests/`](../resources/exercise-05/k8s-manifests/). + + Apply the deployment: + ```bash + kubectl apply -f sample-app-with-resources.yaml + ``` + + **Wait for pods to be ready and metrics to be collected** (important!): + ```bash + kubectl wait --for=condition=ready pod -l app=backend --timeout=120s + ``` + + Wait an additional 60 seconds for the Metrics Server to collect initial metrics. + + Verify metrics are available for the new pods: + ```bash + kubectl top pods -l app=backend + ``` + +2. **Create a Horizontal Pod Autoscaler** + + Find and review the HPA manifest in [`../resources/exercise-05/k8s-manifests/backend-hpa.yaml`](../resources/exercise-05/k8s-manifests/backend-hpa.yaml). + + Apply the HPA: + ```bash + kubectl apply -f backend-hpa.yaml + ``` + +3. **Alternatively, create HPA using kubectl command** + ```bash + kubectl autoscale deployment backend \ + --cpu-percent=50 \ + --min=1 \ + --max=5 + ``` + +4. **Verify HPA** + ```bash + kubectl get hpa + kubectl describe hpa backend-hpa + ``` + + You should see CPU metrics like `cpu: 1%/50%` (current/target). + + **If you see warnings about "no metrics returned"**: This is normal for the first 1-2 minutes after creating the HPA. Wait a bit and check again. + + > [!TIP] + > HPA uses a stabilization window to avoid rapid scaling up and down. The default is 300 seconds (5 minutes). This means HPA will wait for 5 minutes of stable metrics before scaling down. + If you have scaled up manually in the task 1.1 you have 3 replicas when you configured the HPA. It will be scaled down automatically to 1 after 5 minutes. + See [Horizontal Pod Autoscaler Concepts](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) for more details. + +5. **Monitor HPA in action** + ```bash + kubectl get hpa sample-app-hpa --watch + ``` + +#### Test HPA + +1. **Generate load** + ```bash + # Generate load using a load generator pod + kubectl run -it --rm load-generator --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://backend:3001/api/load-test?iterations=50000; done" + ``` + +3. **Watch the pods scale** + ```bash + kubectl get hpa backend-hpa --watch + kubectl get pods -l app=backend-hpa --watch + ``` + + After a few minutes, you should see the number of pods increase. + + The result should look similar to this: + + ``` + NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE + backend-hpa Deployment/backend cpu: 1%/50% 1 5 1 87m + backend-hpa Deployment/backend cpu: /50% 1 5 4 87m + backend-hpa Deployment/backend cpu: /50% 1 5 4 88m + backend-hpa Deployment/backend cpu: 237%/50% 1 5 4 89m + ``` + +4. **Stop the load generator** (press `Ctrl+C`) + +5. **Watch pods scale down** (this takes several minutes) + ```bash + kubectl get hpa backend-hpa --watch + ``` + + > [!TIP] + > Remember the stabilization window: HPA will wait for 5 minutes of stable metrics before scaling down. + +### Task 3: Vertical Pod Autoscaler (VPA) + +VPA automatically adjusts CPU and memory requests/limits based on usage. + +**Note**: VPA is not installed by default in AKS and requires manual installation. It's an advanced topic. + +#### Understanding VPA + +**VPA Modes**: +- **Auto**: VPA assigns resource requests on pod creation and updates them during pod lifecycle +- **Initial**: VPA assigns resource requests only on pod creation +- **Off**: VPA only provides recommendations without applying them +- **Recreate**: VPA assigns resource requests on pod creation and updates them by recreating pods + +#### View VPA Recommendations (Informational) + +```bash +# VPA installation steps (informational only) +# 1. Clone VPA repo +# git clone https://github.com/kubernetes/autoscaler.git +# cd autoscaler/vertical-pod-autoscaler +# ./hack/vpa-up.sh + +# Create VPA in "Off" mode to get recommendations +cat > vpa-recommender.yaml < \ + --cluster-name aks-lab- \ + --output table + ``` + +2. **Enable cluster autoscaler on existing node pool** + ```bash + az aks nodepool update \ + --resource-group rg-aks-lab- \ + --cluster-name aks-lab- \ + --name nodepool1 \ + --enable-cluster-autoscaler \ + --min-count 1 \ + --max-count 5 + ``` + +3. **Verify autoscaler is enabled** + ```bash + az aks nodepool show \ + --resource-group rg-aks-lab- \ + --cluster-name aks-lab- \ + --name nodepool1 \ + --query 'enableAutoScaling' + ``` + +4. **View current nodes** + ```bash + kubectl get nodes + ``` + +5. **Test node autoscaling by creating many pods** + ```bash + # Create a deployment with many replicas + kubectl create deployment autoscale-test --image=nginx --replicas=30 + + # Watch nodes being added + kubectl get nodes --watch + ``` + +6. **Monitor cluster autoscaler logs** + ```bash + kubectl logs -n kube-system -l app=cluster-autoscaler + ``` + +7. **Clean up test deployment** + ```bash + kubectl delete deployment autoscale-test + ``` + + Watch nodes scale down (this takes 10-15 minutes): + ```bash + kubectl get nodes --watch + ``` + +8. **Configure autoscaler via Azure Portal** + - Navigate to your AKS cluster + - Go to "Node pools" + - Select your node pool + - Click "Scale" + - Enable "Autoscale" toggle + - Set minimum and maximum node count + - Click "Save" + +### Task 5: Manual Node Pool Scaling + +You can also manually scale node pools: + +```bash +# Scale node pool to 3 nodes +az aks nodepool scale \ + --resource-group rg-aks-lab- \ + --cluster-name aks-lab- \ + --name nodepool1 \ + --node-count 3 + +# Verify +kubectl get nodes +``` + +## Verification Checklist + +Ensure you have successfully: +- [ ] Manually scaled deployments up and down +- [ ] Created and tested Horizontal Pod Autoscaler +- [ ] Enabled cluster autoscaler on node pool +- [ ] Tested node autoscaling with high pod count +- [ ] Monitored autoscaler behavior + +## Summary of Scaling Concepts + +### Horizontal Pod Autoscaler (HPA) +- **Purpose**: Scale pod replicas based on metrics +- **Use case**: Handle varying application load +- **Metrics**: CPU, memory, custom metrics +- **Scale range**: Min/Max replica count +- **Decision time**: Every 15-30 seconds + +### Vertical Pod Autoscaler (VPA) +- **Purpose**: Adjust resource requests/limits +- **Use case**: Optimize resource allocation +- **Metrics**: Historical CPU/memory usage +- **Updates**: On pod creation or recreation +- **Best for**: Applications with unpredictable resource needs + +### Cluster Autoscaler +- **Purpose**: Scale cluster nodes +- **Use case**: Handle overall cluster capacity +- **Trigger**: Pending pods due to insufficient resources +- **Scale up**: Adds nodes when pods can't be scheduled +- **Scale down**: Removes underutilized nodes (after 10-15 min) + +## Troubleshooting + +### Scaling Issues + +- **HPA shows "no metrics returned" or "FailedGetResourceMetric"**: + - This is normal during the first 1-2 minutes after creating pods + - Metrics Server needs time to collect initial data + - Solution: Wait 60-90 seconds and check again + ```bash + kubectl get hpa --watch + ``` + - Verify Metrics Server is running: + ```bash + kubectl get deployment metrics-server -n kube-system + kubectl top pods + ``` + +- **HPA not scaling**: Check metrics server and resource requests + ```bash + kubectl top pods + kubectl describe hpa + ``` + +- **Nodes not autoscaling**: Check autoscaler logs + ```bash + kubectl logs -n kube-system -l app=cluster-autoscaler + ``` + +- **Pods pending**: Check node resources + ```bash + kubectl describe node + kubectl top nodes + ``` + +## Best Practices + +### Scaling +- Start with HPA for application scaling +- Use cluster autoscaler for infrastructure scaling +- Set appropriate resource requests/limits +- Test autoscaling before production +- Monitor costs with autoscaling enabled +- Don't combine HPA and VPA on CPU/memory metrics + +## Additional Resources + +- [Kubernetes HPA](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) +- [AKS Cluster Autoscaler](https://docs.microsoft.com/azure/aks/cluster-autoscaler) +- [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler) + +## Next Steps + +Continue to Exercise 6 to learn about persistent storage in AKS! diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-06.md b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-06.md new file mode 100644 index 000000000..368a9879f --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-06.md @@ -0,0 +1,507 @@ +# Exercise 6: Persistent Storage in AKS + +## Objective +In this exercise, you will learn how to configure persistent storage for your applications using Azure Disks and Azure Files. You'll understand the difference between ephemeral and persistent storage, and when to use each Azure storage option. + +## Understanding Storage in Kubernetes + +By default, pod storage is ephemeral (temporary). When a pod is deleted, its data is lost. Persistent storage is needed for: +- Databases +- User uploads +- Configuration data +- Logs + +**Azure Storage Options for AKS**: +- **Azure Disks**: Block storage, can only be mounted to one pod at a time (ReadWriteOnce) +- **Azure Files**: SMB/NFS file shares, can be mounted to multiple pods (ReadWriteMany) +- **Azure Blob Storage**: Object storage via CSI driver + +## Prerequisites +- Completed Exercise 4 (Applications exposed) +- Running AKS cluster with deployed applications +- kubectl configured + +## Tasks + +### Task 0: Test the non persistent nature of the actual configuration + +1. Before to start with this task, make sure you have the sample application deployed and exposed as per Exercise 3 and 4. + +2. Scale delete the HPA + ```bash + kubectl delete hpa backend-hpa + ``` +3. Make sure that the backend deployment is running with only one replica + ```bash + kubectl get deployment backend + ``` +4. If not, scale it to one replica + ```bash + kubectl scale deployment backend --replicas=1 + ``` +5. Test the non-persistent nature of the current backend deployment: + - Open your web browser + - Navigate to `http://` + - Add a task in the UI (e.g., "Test persistent storage") + - Delete the backend pod + + ```bash + # Delete pod + kubectl delete pod $POD_NAME + + # Wait for new pod to be created + kubectl get pods -l app=backend --watch + ``` + + Press `Ctrl+C` to stop watching once the pod is running. + + - Refresh your browser + - Now you can see that the task you added earlier is not there! This demonstrates that the data are ephemeral, only saved in the memory of the pod. + +### Task 1: Understanding Storage Classes + +Before creating persistent storage, let's explore the available storage classes in AKS. + +1. **View available storage classes** + ```bash + kubectl get storageclass + ``` + + Some of the default classes in AKS are: + - `managed-csi`: Azure Disk (default) + - `azurefile-csi`: Azure Files + - `managed-csi-premium`: Premium Azure Disk + +2. **Describe a storage class** + ```bash + kubectl describe storageclass managed-csi + ``` + +3. **View storage class details** + ```bash + kubectl get storageclass managed-csi -o yaml + ``` + +### Task 2: Using Azure Disks with Persistent Volumes + +Azure Disks provide block-level storage for single-pod applications like databases. +You can find the manifests for this exercise in the [`resources/exercise-06`](../resources/exercise-06/k8s-manifests) directory of the lab repository. Please review the configuration for the PersistentVolumeClaim (PVC) and StatefulSet files before proceeding. + +1. **Create a Persistent Volume Claim (PVC) using Azure Disk** + + ```bash + kubectl apply -f pvc.yaml + ``` + +2. **Verify PVC creation** + ```bash + kubectl get pvc task-data-pvc + ``` + + Status should change from `Pending` to `Bound`. + +3. **Create a StatefulSet for the backend that uses the PVC** + First of all, delete the existing backend deployment if you have it running: + ```bash + kubectl delete deployment backend + ``` + + It is not required to delete the Service, as it will remain the same. + + Remember to update the image name in the `backend-stateful.yaml` file with your actual backend image from your ACR. + + Apply the manifest: + ```bash + kubectl apply -f backend-stateful.yaml + ``` + +4. **View the automatically created Persistent Volume** + ```bash + kubectl get pv + ``` + +5. **Wait for pod to be ready** + ```bash + kubectl get pods -l app=backend --watch + ``` + + You will see something like: + ``` + NAME READY STATUS RESTARTS AGE + backend-0 1/1 Running 0 30s + ``` + + Press `Ctrl+C` to stop watching. + +6. **Test persistence by deleting and recreating the pod** + + - Open your web browser + - Navigate to `http://` + - Add a task in the UI + - Delete the backend pod + + ```bash + # Delete pod + kubectl delete pod $POD_NAME + + # Wait for new pod to be created + kubectl get pods -l app=backend --watch + ``` + + Press `Ctrl+C` to stop watching once the pod is running. + + - Refresh your browser + - Now you can see that the task you added earlier is still there! This demonstrates that the Azure Disk persists beyond the pod lifecycle. + +> [!WARNING] +> The following tasks are optional. You can skip them if you only want to learn about Azure Disks. If instead you want to learn about Azure Files, continue with the next task, but notice that the commands are just examples for reference, not directly aligned with the sample application and the manifests provided. + +### Task 3: Using Azure Files for Shared Storage + +Azure Files allows multiple pods to mount the same volume simultaneously, making it ideal for shared content. + +1. **Create a PVC using Azure Files** + + ```bash + cat > azure-files-pvc.yaml < app-with-shared-storage.yaml < /shared/shared-file.txt" + + # Read from second pod + kubectl exec ${PODS[1]} -- cat /shared/shared-file.txt + + # Read from third pod + kubectl exec ${PODS[2]} -- cat /shared/shared-file.txt + ``` + + All pods can read the same file! This demonstrates the ReadWriteMany capability of Azure Files. + +6. **Write from multiple pods** + ```bash + # Each pod writes to a different file + kubectl exec ${PODS[0]} -- bash -c "echo 'Data from pod 0' > /shared/pod-0.txt" + kubectl exec ${PODS[1]} -- bash -c "echo 'Data from pod 1' > /shared/pod-1.txt" + kubectl exec ${PODS[2]} -- bash -c "echo 'Data from pod 2' > /shared/pod-2.txt" + + # List files from any pod + kubectl exec ${PODS[0]} -- ls -la /shared/ + ``` + +### Task 4: View Storage Resources in Azure Portal + +1. **View Persistent Volumes in Kubernetes** + ```bash + kubectl get pv + kubectl describe pv + ``` + +2. **In Azure Portal** + - Navigate to your resource group `rg-aks-lab-` + - You'll see **Disk** resources (for Azure Disks) + - You'll see a **Storage Account** (for Azure Files) + - Click on them to view details, size, and pricing tier + +3. **View PVC details** + ```bash + kubectl get pvc + kubectl describe pvc azure-disk-pvc + kubectl describe pvc azure-files-pvc + ``` + +### Task 5: Comparison - Azure Disks vs Azure Files + +Let's test the key difference: Azure Disks can only be mounted to one pod, while Azure Files can be shared. + +1. **Try to scale the Azure Disk deployment to 2 replicas** + ```bash + kubectl scale deployment app-with-disk --replicas=2 + kubectl get pods -l app=app-with-disk + ``` + +2. **Check pod status** + ```bash + kubectl describe pod -l app=app-with-disk + ``` + + You'll likely see one pod running and another stuck in `ContainerCreating` or `Pending` state because Azure Disks only support ReadWriteOnce (single node attachment). + +3. **Scale back to 1 replica** + ```bash + kubectl scale deployment app-with-disk --replicas=1 + ``` + +4. **Compare with Azure Files deployment** (already has 3 replicas) + ```bash + kubectl get pods -l app=shared-app + ``` + + All 3 pods are running because Azure Files supports ReadWriteMany. + +**Key Takeaway**: +- **Azure Disks**: Use for databases, single-pod applications +- **Azure Files**: Use for shared content, multi-pod applications + +### Task 6: Update Your Sample Application with Persistent Storage + +Let's update your sample application to use persistent storage: + +```bash +cat > sample-app-with-storage.yaml <.azurecr.io/sample-app:v1 + ports: + - containerPort: 80 + volumeMounts: + - name: data + mountPath: /data + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 256Mi + volumes: + - name: data + persistentVolumeClaim: + claimName: sample-app-data +EOF +``` + +Apply the configuration: +```bash +kubectl apply -f sample-app-with-storage.yaml +``` + +Verify the deployment: +```bash +kubectl get pods -l app=sample-app-persistent +kubectl get pvc sample-app-data +``` + +### Task 7: Storage Performance Tiers + +Azure offers different performance tiers for storage: + +1. **View storage class options** + ```bash + kubectl get storageclass + ``` + +2. **Create a PVC with Premium storage** (for high-performance workloads) + ```bash + cat > azure-disk-premium-pvc.yaml < + ``` + Check for quota limits or storage class issues + +- **Mount failures**: + ```bash + kubectl describe pod + ``` + Check for permission issues or already-mounted disks (Azure Disk limitation) + +- **Data not persisting**: + - Verify PVC is bound: `kubectl get pvc` + - Check mount path in pod: `kubectl describe pod ` + - Ensure correct volume name in deployment YAML + +- **Multiple pods can't mount Azure Disk**: + - This is expected behavior (ReadWriteOnce) + - Use Azure Files (ReadWriteMany) for multi-pod scenarios + +## Best Practices + +### Storage Selection +- Use **Azure Disks** for: + - Databases (PostgreSQL, MySQL, MongoDB) + - Single-pod applications requiring persistent data + - High-performance workloads (use Premium tier) + +- Use **Azure Files** for: + - Shared content across multiple pods + - Legacy applications requiring SMB/NFS + - Content management systems + - Shared configuration files + +### Storage Management +- Choose appropriate storage class (Standard vs Premium) +- Set appropriate storage size (can be expanded later) +- Implement backup strategies for critical data +- Use storage quotas to control costs +- Monitor storage usage and performance +- Clean up unused PVCs to avoid charges + +### Data Persistence +- Always use PVCs for stateful applications +- Test data persistence before production +- Document mount paths and storage requirements +- Use init containers for data initialization +- Consider using StatefulSets for complex stateful applications + +## Additional Resources + +- [AKS Storage Options](https://docs.microsoft.com/azure/aks/concepts-storage) +- [Azure Disk CSI Driver](https://docs.microsoft.com/azure/aks/azure-disk-csi) +- [Azure Files CSI Driver](https://docs.microsoft.com/azure/aks/azure-files-csi) +- [Kubernetes Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) +- [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/) + +## Congratulations! + +You've completed all the core AKS exercises! You now know how to: +- βœ… Set up an AKS environment +- βœ… Create and manage container registries +- βœ… Deploy and expose applications +- βœ… Implement autoscaling at pod and node levels +- βœ… Configure persistent storage with Azure Disks and Azure Files + +## Next Steps + +Continue learning about: +- **Ingress controllers** (NGINX, Application Gateway) for advanced routing +- **Azure Monitor and Application Insights** for observability +- **Azure Policy for AKS** for governance +- **GitOps** with Flux or ArgoCD for declarative deployments +- **Service Mesh** (Istio, Linkerd) for advanced networking +- **Security best practices** (Pod Security Standards, Network Policies) +- **Backup and disaster recovery** with Velero +- **StatefulSets** for complex stateful applications diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-07.md b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-07.md new file mode 100644 index 000000000..c88694987 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-07.md @@ -0,0 +1,398 @@ +# Exercise 7: Backup and Restore with Azure Backup for AKS + +## Objective +In this exercise, you will learn how to protect your AKS workloads using Azure Backup extension. You'll configure backup for your cluster, perform a backup of your application, and restore it to demonstrate disaster recovery capabilities. + +## What is Azure Backup for AKS? + +Azure Backup for AKS provides a cloud-native, enterprise-ready backup solution that allows you to: +- Back up and restore containerized applications and data +- Protect against accidental deletion or data corruption +- Meet compliance and governance requirements +- Perform disaster recovery scenarios + +**Key Features**: +- Application-consistent backups +- Namespace-level or cluster-wide backups +- Scheduled or on-demand backups +- Point-in-time restore capabilities +- Integration with Azure Policy + +## Prerequisites +- Completed Exercise 6 (Persistent Storage configured) +- Running AKS cluster with deployed applications +- Access to Azure Portal +- Owner or Contributor role on the subscription + +## Tasks + +### Task 0: Create Storage Account and Backup Vault + +Azure Backup for AKS requires a storage account with a blob container and a backup vault to store backup data. + +1. **Create a Storage Account using Azure CLI** + + Open your terminal and run the following commands: + + ```bash + # Create a storage account for backup + az storage account create \ + --name stbackupaks \ + --resource-group $RESOURCE_GROUP \ + --location $LOCATION \ + --sku Standard_LRS \ + --kind StorageV2 \ + --enable-hierarchical-namespace false + + # Verify storage account creation + az storage account show \ + --name stbackupaks \ + --resource-group $RESOURCE_GROUP \ + --output table + ``` + + > **Note**: Replace `` with your actual initials (e.g., `stbackupaksjd` for John Doe). Storage account names must be globally unique and lowercase. + +2. **Create Blob Container via Azure Portal** + + Due to organizational policies that may restrict SAS token usage, we'll create the container through the Portal: + + - Navigate to **Storage accounts** in Azure Portal + - Find and click on your storage account: `stbackupaks` + - In the left menu, click **Containers** (under Data storage) + - Click **+ Container** at the top + - **Name**: `aks-backups` + - **Public access level**: Private (no anonymous access) + - Click **Create** + +3. **Verify Container Creation** + - You should now see the `aks-backups` container in the list + - Click on it to verify it's empty and ready for backup data + +4. **Create Backup Vault using Azure CLI** + + ```bash + # Create a backup vault for AKS + az dataprotection backup-vault create \ + --resource-group $RESOURCE_GROUP \ + --vault-name backup-vault-aks- \ + --location $LOCATION \ + --type SystemAssigned \ + --storage-settings datastore-type="VaultStore" type="LocallyRedundant" + + # Verify backup vault creation + az dataprotection backup-vault show \ + --resource-group $RESOURCE_GROUP \ + --vault-name backup-vault-aks- \ + --output table + ``` + +### Task 1: Enable Azure Backup Extension for AKS + +In this task, we'll enable the backup extension from the Azure Portal. + +1. **Navigate to your AKS cluster in Azure Portal** + - Sign in to [Azure Portal](https://portal.azure.com) + - Go to **All resources** or **Kubernetes services** + - Select your AKS cluster: `aks-lab-` + +2. **Access Backup Settings** + - In the left navigation menu, scroll down to **Settings** + - Click on **Backup** + - You'll see a prompt to install the backup extension + +3. **Install Backup Extension** + - Click **Install Extension** + - Select the storage account: `stbackupaks` + - Select the blob container: `aks-backups` + - Click **Install** + - Wait for the extension to be installed (this typically takes around 6 minutes) + +4. **Verify Extension Installation** + - Once installation completes, go to your AKS cluster + - Navigate to **Settings** > **Extensions + applications** + - You should see `azure-aks-backup` extension with status "Succeeded" + + Alternatively, verify using Azure CLI: + ```bash + az k8s-extension list \ + --cluster-name $AKS_CLUSTER_NAME \ + --resource-group $RESOURCE_GROUP \ + --cluster-type managedClusters + ``` + +### Task 2: Configure Backup from AKS Backup Settings + +Now that the backup extension is installed, we'll configure the backup policy and instance directly from the AKS cluster. + +1. **Navigate to AKS Backup Settings** + - Go back to your AKS cluster in Azure Portal + - In the left navigation menu, scroll down to **Settings** + - Click on **Backup** + - You should see that the extension is installed successfully + +2. **Start Backup Configuration** + - Click **Configure Backup** button + - This will open the backup configuration wizard + +3. **Select Backup Vault** + - **Backup vault**: Select your backup vault `backup-vault-aks-` + - The vault should be in the same region as your AKS cluster + - Click **Next** + +4. **Grant Permissions to Backup Vault** + + The backup vault needs permissions to access your AKS cluster and storage account. + + - In the wizard, you'll see a section for **Permissions** + - Click **Grant Permission** next to: + - **AKS cluster**: Grants the vault's managed identity access to backup your cluster + - **Storage Account**: Grants the vault access to store backup data + - Wait for permissions to be granted (this takes 1-2 minutes) + - You should see "Permission granted" status with green checkmarks + - The system will automatically validate the permissions + - Click **Next** once permissions are granted and validated + +5. **Configure or Select Backup Policy** + + Now you'll define when and how backups are taken. + + **Option A: Create New Policy** + - Click **Create a new policy** + - **Policy name**: `aks-daily-backup-policy` + - **Schedule**: + - **Backup frequency**: Select "Hourly" or "Daily" + - If Daily: Choose time (e.g., 2:00 AM UTC) + - If Hourly: Choose frequency (every 4, 6, 8, 12 hours) + - **Retention**: + - **Default**: 3-5 days (for this exercise) + - Avoid longer retention periods to minimize storage costs + - > **Important**: Since this is a lab exercise, use minimal retention (3-5 days) to avoid unnecessary storage consumption and costs + - Click **Create** + + **Option B: Use Existing Policy** + - Select an existing backup policy from the dropdown + - Review the policy settings + - Click **Next** + +6. **Select Datasources to Backup** + + Define what should be included in backups. + + - **Add a Datasource to backup**: Choose one of: + - **All namespaces**: Backup everything in the cluster + - **Include specific namespaces**: Select specific namespaces (Recommended) + + - For this lab, select **Include specific namespaces**: + - Check the box for **default** (where your application is deployed) + - You can select multiple namespaces if needed + + - **Include cluster-scoped resources**: + - Under the other options you could select: + - Cluster scope + - Persistent Volumes + - Secrets + + - **Backup hooks** (Optional - Advanced): + - Leave empty for now + - These allow running custom commands before/after backup + + - **Label selectors** (Optional): + - Leave empty to backup all resources in selected namespaces + - Or add labels to backup only specific resources (e.g., `app=backend`) + + - Click **Next** + +7. **Vallidate the permissions:** + - Click on **Validate** + - If you see an error : + - Click **Assign Missing Roles** button + - Wait for the role assignment to complete + - Click **Validate** again + - All checks should now pass with green checkmarks + +8. **Review and Create Backup Configuration** + + - Review the configuration summary: + - Vault name and location + - Selected AKS cluster + - Backup policy (schedule and retention) + - Resources to backup (namespaces) + - Permissions status + + - Click **Configure backup** + - Wait for the configuration to complete (2-3 minutes) + - You should see "Backup configuration successful" message + +9. **Verify Backup Configuration** + + - Stay in your AKS cluster **Backup** section + - After a couple of minutes, you should see the backup instance move to a proction status **Protection configured** + +### Task 3: Perform an On-Demand Backup + +Before testing restore, let's ensure we have a recent backup of our application. + +1. **Access Backup Section** + - Stay in your AKS cluster **Settings** > **Backup** section + - You should see the backup is configured with your vault + +2. **Trigger On-Demand Backup** + - Select the backup job ellipsis, Backup Now + - Click **Backup now** button at the top + - A side panel will open + - **Retention**: + - Select the **Retention rule** + - Click **Backup** to start the backup + +3. **Monitor Backup Progress** + - Click on **Triggering backup ... ** tab in the notification on the top. + - You'll see your backup job with status "In progress" + - Refresh the page periodically + - Wait for the backup to complete (5-10 minutes depending on cluster size) + - Status should change to "Completed" + + **What's happening during backup:** + - The backup extension creates snapshots of your resources + - Kubernetes manifests are captured (Deployments, Services, ConfigMaps, etc.) + - Persistent Volume data is backed up + - All data is stored in your backup vault and blob container + +4. **Verify Backup using Azure CLI** + ```bash + # List backup instances + az dataprotection backup-instance list \ + --resource-group $RESOURCE_GROUP \ + --vault-name backup-vault-aks- \ + --output table + ``` + +5. **View Backup Details and Recovery Points** + - In your AKS **Backup** section, click on the **Restore** option on the top + - Select the backup instance + - Click **Continue** + - Note the **Recovery point** (timestamp) + - Check the restore parameters + - Click: **Next: Review + restore** + +### Task 4: Restore from Backup + +Now let's restore our application from the backup we created. +1. **View Backup Details and Recovery Points** + - In your AKS **Backup** section, click on the **Restore** option on the top + - Select the backup instance + - Click **Continue** + - Note the **Recovery point** (timestamp) + - Check the restore parameters + - Click: **Next: Review + restore** + + +## Verification Checklist + +Ensure you have successfully: +- [ ] Enabled Azure Backup extension on your AKS cluster +- [ ] Created a Backup vault +- [ ] Configured a backup policy +- [ ] Performed an on-demand backup +- [ ] Simulated a disaster by deleting resources +- [ ] Successfully restored your application from backup +- [ ] Verified that all resources and data were restored +- [ ] Explored backup reports and monitoring + +## Key Concepts + +### Backup Scope +- **Namespace-level**: Backup specific namespaces +- **Cluster-wide**: Backup entire cluster including cluster-scoped resources +- **Label selectors**: Backup resources matching specific labels + +### Recovery Point Objective (RPO) +- How much data you can afford to lose +- Daily backups = 24-hour RPO +- Hourly backups = 1-hour RPO + +### Recovery Time Objective (RTO) +- How quickly you need to restore +- Depends on cluster size and data volume +- Typically 5-15 minutes for small clusters + +### Backup Types +- **Scheduled backups**: Automatic, policy-driven +- **On-demand backups**: Manual, immediate +- **Application-consistent**: Ensures data integrity + +## Troubleshooting + +### Backup Extension Installation Failed +- Check if you have sufficient permissions (Owner/Contributor) +- Verify AKS cluster is in a supported region +- Check Azure service health status + +### Backup Job Failed +```bash +# Check extension logs +kubectl logs -n azure-aks-backup -l app=azure-aks-backup + +# Check backup instance status +az dataprotection backup-instance list \ + --resource-group $RESOURCE_GROUP \ + --vault-name backup-vault-aks- +``` + +### Restore Failed +- Verify target cluster has sufficient resources +- Check for resource conflicts (existing resources with same names) +- Review restore job logs in Azure Portal + +### PVC Not Restored +- Ensure storage class exists in target cluster +- Check if PVC was included in backup scope +- Verify sufficient storage quota + +## Best Practices + +### Backup Strategy +- Define clear RPO/RTO requirements +- Test restore procedures regularly +- Backup production namespaces separately +- Include cluster-scoped resources (RBAC, ConfigMaps) +- Use label selectors for granular control + +### Retention Policy +- Keep daily backups for 7-30 days +- Keep weekly backups for 3-6 months +- Keep monthly backups for 1 year +- Comply with regulatory requirements + +### Security +- Use Azure RBAC to control backup access +- Encrypt backups at rest +- Enable soft delete protection +- Audit backup and restore operations + +### Cost Optimization +- Choose appropriate retention periods +- Clean up old recovery points +- Use lifecycle management policies +- Monitor storage consumption + +## Additional Resources + +- [Azure Backup for AKS Documentation](https://docs.microsoft.com/azure/backup/azure-kubernetes-service-backup-overview) +- [Backup Extension for AKS](https://docs.microsoft.com/azure/backup/azure-kubernetes-service-cluster-backup) +- [Best Practices for AKS Backup](https://docs.microsoft.com/azure/backup/azure-kubernetes-service-backup-best-practices) +- [Azure Backup Pricing](https://azure.microsoft.com/pricing/details/backup/) + +## Cost Considerations + +Azure Backup for AKS charges are based on: +- **Protected instances**: Number of namespaces backed up +- **Storage**: Volume of backup data stored +- **Operations**: Backup and restore operations + +Estimated monthly cost for this lab (1 namespace, 7-day retention): ~$5-10 USD + +## Next Steps + +Continue to [Exercise 8: Monitoring with Azure Managed Grafana](08-monitoring-grafana.md) to learn about observability and monitoring! + diff --git a/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-08.md b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-08.md new file mode 100644 index 000000000..61ae6ca95 --- /dev/null +++ b/03-Azure/01-01-App Innovation/02_AKS/walkthrough/solution-08.md @@ -0,0 +1,79 @@ +# Exercise 8: Monitoring with Azure Managed Grafana + +## Objective +In this exercise, you will learn how to monitor your AKS cluster and applications using the pre-configured Azure Managed Grafana dashboards. You'll explore built-in dashboards, understand key metrics, and interact with visualizations to monitor your workloads. + +## What is Azure Managed Grafana? + +Azure Managed Grafana is a fully managed service that provides: +- Pre-built dashboards for Azure services +- Integration with Azure Monitor and Prometheus +- Real-time metrics and visualization +- Interactive data exploration +- High availability and automatic scaling + +**Key Benefits**: +- No infrastructure management +- Native integration with Azure services +- Secure authentication with Azure AD +- Built-in high availability +- Pre-configured dashboards ready to use + +## Prerequisites +- Completed Exercise 4 (Applications deployed and exposed) +- Running AKS cluster with applications +- Access to Azure Portal +- Azure Managed Grafana already configured (provided in your environment) + +## Tasks + +### Task 1: Verify Azure Monitor for Containers + +First, verify that monitoring is enabled on your AKS cluster. + +1. **Navigate to your AKS cluster in Azure Portal** + - Sign in to [Azure Portal](https://portal.azure.com) + - Go to **Kubernetes services** + - Select your AKS cluster: `aks-lab-` + +2. **Configure Dashboards with Grafana** + - In the left navigation menu, click **Monitoring** > **Dashboards with Grafana** + - Click on Configure + - Select **Enable Prometheus metrics** and **Container logs** + - Click on **Configure** + - After around 5 minutes refresh the pages. + +3. **Review the differnt Dashboards with Grafana** + - Take some time to review the differents **Buil-in dashboard** of Grafana. + +## Congratulations! + +You've completed all AKS exercises! You now have comprehensive knowledge of: +- βœ… AKS cluster setup and management +- βœ… Container registry and image management +- βœ… Application deployment and exposure +- βœ… Scaling (HPA and Cluster Autoscaler) +- βœ… Persistent storage (Azure Disks and Files) +- βœ… Backup and disaster recovery +- βœ… Monitoring and observability with Grafana + +### What You Can Do Next +- Explore more advanced Grafana features (alerts, custom queries) +- Investigate Azure Monitor Workbooks for additional insights +- Learn about Application Insights for application-level monitoring +- Study Azure Policy for governance and compliance + +## Cleanup + +To avoid ongoing charges, remember to delete your resources: +```bash +az group delete --name $RESOURCE_GROUP --yes --no-wait +``` + +This will remove: +- AKS cluster +- Log Analytics workspace +- Container Registry +- Backup vault +- Storage accounts +- All other lab resources \ No newline at end of file diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/Readme.md b/03-Azure/01-02 Data/02-SQL_Modernization/Readme.md index 2d00834af..a626dc446 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/Readme.md +++ b/03-Azure/01-02 Data/02-SQL_Modernization/Readme.md @@ -39,89 +39,20 @@ This MicroHack has a few but important prerequisites * Basic database knowledge * Microsoft Teams Desktop Sharing should be allowed to collaborate with other participants (only for remote deliveries) -## Challenge 1 - Prerequisites and landing zone preparation -### Goal +## Challenges -The goal of this exercise is to migrate an on-premises SQL Server 2012 database to Azure SQL Database Managed Instance (SQL MI). +* [Challenge 1 - Assessment and migration with Azure Data Studio](challenges/challenge-01.md) **<- Start here** +* [Challenge 2 - Monitoring and Performance on Azure SQL Managed Instance](challenges/challenge-02.md) +* [Challenge 3 - Security on Azure SQL Managed Instance](challenges/challenge-03.md) -### Actions -* Perform assessments to reveal any feature parity and compatibility issues -* Analyze workload to identify the appropriate SKU size -* Migrate the on-premises databases into Azure, using Azure migration services +## Solutions - Spoilerwarning -### Success criteria +* [Solution 1 - Assessment and migration with Azure Data Studio](./walkthrough/challenge-01/solution-01.md) +* [Solution 2 - Monitoring and Performance on Azure SQL Managed Instance](./walkthrough/challenge-02/solution-02.md) +* [Solution 3 - Security on Azure SQL Managed Instance](./walkthrough/challenge-03/solution-03.md) -* You successfully assessed the databases against the SQL PaaS target architectures -* You successfully captured the workload and received SKU sizing guidance -* You have successfully migrated the on-premises databases to Azure SQL MI -* You have successfully loggeg in via SSMS to Azure SQL MI - -### Learning resources -* [SQL Server to Azure SQL Managed Instance: Migration guide - Azure SQL Managed Instance](https://learn.microsoft.com/en-us/azure/azure-sql/migration-guides/managed-instance/sql-server-to-managed-instance-guide?view=azuresql) - -### Solution steps - -* [MicroHack Challenge 1](./Challenges/01-MicroHack-database_assessment_and_migration_with_Azure_Data_Studio.md) - -## Challenge 2 - Monitoring and Performance on Azure SQL Managed Instance - -### Goal - -The goal of this exercise is to understand monitoring and perfomance optimzation on an Azure SQL Managed Instance. - -### Actions - -* Identifying performance issues, their root causes and fixing the problem -* Use the Azure Portal to identify performance bottlenecks -* Using Log Analytics with KQL to visualize Azure SQL MI and database stats - -### Success criteria - -* You have identifed the most consuming stored procedure based on the total_worker_time (CPU) -* You successfully reviewed the performance graph showing CPU utilization in the Azure Portal -* You have successfully queried the AzureDiagnostics using KQL to receive the different diagnostics - -### Learning resources -* [Monitor Azure SQL Managed Instance - Azure SQL Managed Instance](https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/monitoring-sql-managed-instance-azure-monitor?view=azuresql) - -### Solution steps - -* [MicroHack Challenge 2](./Challenges/02-MicroHack-monitoring_and_performance_on_Azure_SQL_Managed_Instance.md) - -## Challenge 3 - Security on Azure SQL Managed Instance - -### Goal - -The goal of this exercise is to understand the layered security model available when running databases in Azure. - -### Actions - -* Perform data discovery & classification as a built-in capability for discovering, classifying, labelling and protecting sensitive data in databases -* Review the Azure Defender for SQL – Vulnerability Assessment -* Azure Defender for SQL – Advanced Threat Protection - -### Success criteria - -* You have successfully created data classification recommendations and added custom data classification -* You successfully used Vulnerability Assessment to generate the initial vulnerability scan baseline -* You have successfully reviewed Advanced Threat Protection and created a security alerts on an anomalous activity. - -### Learning resources -* [Security Overview - Azure SQL Database & Azure SQL Managed Instance & Azure Synapse Analytics](https://learn.microsoft.com/en-us/azure/azure-sql/database/security-overview?view=azuresql) - -### Solution steps - -* [MicroHack Challenge 3](./Challenges/03-MicroHack-security_on_Azure_SQL_Managed_Instance.md) - -## Finish - -Congratulations! You finished the MicroHack SQL Modernization. We hope you had the chance to learn about the how to successfully migrate your on-premises SQL Server databases to Azure with key takeaways around cost optimization, increased flexibility and scalability, improved security and compliance, and simplified management and monitoring. - -If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. - -Thank you for investing your time, we look forward to seeing you again! ## Contributors diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/challenges/challenge-01.md b/03-Azure/01-02 Data/02-SQL_Modernization/challenges/challenge-01.md new file mode 100644 index 000000000..abe36f6ee --- /dev/null +++ b/03-Azure/01-02 Data/02-SQL_Modernization/challenges/challenge-01.md @@ -0,0 +1,24 @@ +# Challenge 1 - Assessment and migration with Azure Data Studio + +**[Home](../Readme.md)** - [Next Challenge Solution](challenge-02.md) + +## Goal + +The goal of this exercise is to migrate an on-premises SQL Server 2012 database to Azure SQL Database Managed Instance (SQL MI). + +## Actions + +* Perform assessments to reveal any feature parity and compatibility issues +* Analyze workload to identify the appropriate SKU size +* Migrate the on-premises databases into Azure, using Azure migration services + +## Success criteria + +* You successfully assessed the databases against the SQL PaaS target architectures +* You successfully captured the workload and received SKU sizing guidance +* You have successfully migrated the on-premises databases to Azure SQL MI +* You have successfully loggeg in via SSMS to Azure SQL MI + +## Learning resources +* [SQL Server to Azure SQL Managed Instance: Migration guide - Azure SQL Managed Instance](https://learn.microsoft.com/en-us/azure/azure-sql/migration-guides/managed-instance/sql-server-to-managed-instance-guide?view=azuresql) + diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/challenges/challenge-02.md b/03-Azure/01-02 Data/02-SQL_Modernization/challenges/challenge-02.md new file mode 100644 index 000000000..799d5f292 --- /dev/null +++ b/03-Azure/01-02 Data/02-SQL_Modernization/challenges/challenge-02.md @@ -0,0 +1,23 @@ +# Challenge 2 - Monitoring and Performance on Azure SQL Managed Instance + +[Previous Challenge Solution](challenge-01.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-03.md) + +## Goal + +The goal of this exercise is to understand monitoring and perfomance optimzation on an Azure SQL Managed Instance. + +## Actions + +* Identifying performance issues, their root causes and fixing the problem +* Use the Azure Portal to identify performance bottlenecks +* Using Log Analytics with KQL to visualize Azure SQL MI and database stats + +## Success criteria + +* You have identifed the most consuming stored procedure based on the total_worker_time (CPU) +* You successfully reviewed the performance graph showing CPU utilization in the Azure Portal +* You have successfully queried the AzureDiagnostics using KQL to receive the different diagnostics + +## Learning resources +* [Monitor Azure SQL Managed Instance - Azure SQL Managed Instance](https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/monitoring-sql-managed-instance-azure-monitor?view=azuresql) + diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/challenges/challenge-03.md b/03-Azure/01-02 Data/02-SQL_Modernization/challenges/challenge-03.md new file mode 100644 index 000000000..fb9e43cc3 --- /dev/null +++ b/03-Azure/01-02 Data/02-SQL_Modernization/challenges/challenge-03.md @@ -0,0 +1,23 @@ +# Challenge 3 - Security on Azure SQL Managed Instance + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** - [Next Challenge Solution](finish.md) + +## Goal + +The goal of this exercise is to understand the layered security model available when running databases in Azure. + +## Actions + +* Perform data discovery & classification as a built-in capability for discovering, classifying, labelling and protecting sensitive data in databases +* Review the Azure Defender for SQL – Vulnerability Assessment +* Azure Defender for SQL – Advanced Threat Protection + +## Success criteria + +* You have successfully created data classification recommendations and added custom data classification +* You successfully used Vulnerability Assessment to generate the initial vulnerability scan baseline +* You have successfully reviewed Advanced Threat Protection and created a security alerts on an anomalous activity. + +## Learning resources +* [Security Overview - Azure SQL Database & Azure SQL Managed Instance & Azure Synapse Analytics](https://learn.microsoft.com/en-us/azure/azure-sql/database/security-overview?view=azuresql) + diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/challenges/finish.md b/03-Azure/01-02 Data/02-SQL_Modernization/challenges/finish.md new file mode 100644 index 000000000..0bc2c6130 --- /dev/null +++ b/03-Azure/01-02 Data/02-SQL_Modernization/challenges/finish.md @@ -0,0 +1,11 @@ +# Finish + +[Previous Challenge Solution](challenge-03.md) - **[Home](../Readme.md)** + +## Congratulations + +You finished the MicroHack *SQL modernization*. +If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. + +Thank you for investing the time and see you next time! + diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/Challenges/01-MicroHack-database_assessment_and_migration_with_Azure_Data_Studio.md b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md similarity index 57% rename from 03-Azure/01-02 Data/02-SQL_Modernization/Challenges/01-MicroHack-database_assessment_and_migration_with_Azure_Data_Studio.md rename to 03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md index be8889034..36a724eed 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/Challenges/01-MicroHack-database_assessment_and_migration_with_Azure_Data_Studio.md +++ b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md @@ -1,10 +1,12 @@ -# MicroHack Challenge 1 +# Walkthrough Challenge 1 - Assessment and migration with Azure Data Studio + +**[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-02/solution-02.md) ## Assessment and migration with Azure Data Studio ### Contents -[Migration architecture and Azure components](#_Toc146707477) +[Migration architecture and Azure components](#migration-architecture-and-azure-components) [Generic Migration Content](#generic-migration-content) @@ -18,7 +20,7 @@ # Migration architecture and Azure components -![generated](../Images/MigrationArchitecture.png) +![generated](../../Images/MigrationArchitecture.png) # Generic Migration Content @@ -32,7 +34,7 @@ In this section we'll connect to the Azure Portal and retrieve SQL MI informatio |**Narrative**| **Screenshot**| **Notes**| |:------------|:--------------|:---------| -| On your Win10 VM open Edge browser and got to: [**HTTPS://portal.azure.com**](HTTPS://portal.azure.com) **Username and Password:** *(see your Teams Group)* In the Azure portal, open the **SQLHACK-SHARED** **Resource Group** and locate the **SQL managed instance** and open it. **Note the Host Name (FQDN)** sqlhackmi-xxxxx.xxxxxxx.database.windows.net. All other **details from the "DB Migration Lab and Parameters.pdf"** | ![](../Images/d414d816749bacbe40707d20930a6da5.png)| | +| On your Win10 VM open Edge browser and got to: [**HTTPS://portal.azure.com**](HTTPS://portal.azure.com) **Username and Password:** *(see your Teams Group)* In the Azure portal, open the **SQLHACK-SHARED** **Resource Group** and locate the **SQL managed instance** and open it. **Note the Host Name (FQDN)** sqlhackmi-xxxxx.xxxxxxx.database.windows.net. All other **details from the "DB Migration Lab and Parameters.pdf"** | ![](../../Images/d414d816749bacbe40707d20930a6da5.png)| | # Assess the application databases for Azure SQL Database suitability using the Database Migration Assistant @@ -40,21 +42,21 @@ In this section we will use the Data Migration Assistant (DMA) to assess the app |**Narrative**| **Screenshot**| **Notes**| |:------------|:--------------|:---------| -|We need to determine the suitability of the database(s) for migration to Azure. This includes checking for compatibility and feature support with Azure Database. You should already have a remote (Bastion) session open to your teams Win10 Management VM**,** if so run DMA from the Start menus or Desktop icon.|![A screen shot of a computer Description automatically generated](../Images/3967dd1b4dd31f5c19623f51ce94d486.png)|Database Migration Assistant (DMA) is a free download from Microsoft. It can be used to assess a number of database migration & upgrade scenarios not just SQL Server to Azure SQL Database.| -|You should see this screenshot to the right. Select the **"+"** to create a new **assessment** project|![](../Images/e2b4706b838049af733fed665f6ada16.png)| -|Select/Enter the following details: **Project name:** **Workshop1**
**Assessment type:** **Database Engine**
**Source server type:** **SQL Server**
**Target server type:** **Azure SQL Database**
Click **'Create'**|![](../Images/f562a7f4e609509f7032a192b15447d3.png)| Our first project assessment assumes we will be migrating to Azure SQL DB, so the options shown in the screenshot need to be selected.| -|Select the assessment checks (Report Type) to be made:
**Check database compatibility**
**Check feature parity**
Click **'Next'**|![](../Images/fec55ffa6e1278f1c5e336de2b67c7ff.png) | DMA can test for both database compatibility and feature parity compliance against the Azure target. As this is the initial evaluation, we are assessing a database(s) we will perform all of these tests.| -|Enter the source/legacy SQL details:
**Server Name:** **LEGACYSQL2012**
**Authentication Type:** **SQL Server Authentication**
**Username:** **_Will be provided during hack_**
**Password:** **_Will be provided during hack_**
**Untick "Encrypt connection"**
Click **'Connect'**
*If you get an error logging in check that the Win10 keyboard language.|![A screenshot of a login box Description automatically generated](../Images/b2f7457ed4a46050afcd18073d4cd96c.png)|When performing this within your own subscription you will enter the host, authentication and connection types according to your company guidelines and practices. *Bear in mind that DMA needs to connect to a source SQL Server using an account that belongs to the* **sysadmin** *role.* As this document is produced within a workshop environment Active Directory, Certificates and encryption has not been setup.| -|Select **only** the 3 databases used by your 'Online Transaction Monitor' app. These will have a **TEAMxx** prefix where XX should be replaced by your team number.
**TEAMxx_LocalMasterDataDb**
**TEAMxx_SharedMasterDb**
**TEAMxx_TenantDataDb**.
Click **'Add'** to add them to the assessment. | ![](../Images/9488ec94afd6312aa62f3d0855683c83.png)|DMA will show all databases located on the Source host and display them so you can decide which ones to include in this assessment project. **Note**: you can assess multiple databases at the same time. -| You should now see the screen on the right with the relevant TEAMxx databases listed. Select '**Start Assessment'**|![](../Images/ace5ff77e60d0379b3856db4497d306b.png)|**Note**: DMA allows you to either 'Add' or 'Remove' additional data sources as needed at this point. Also note that DMA provides some high-level metadata about the databases including their compatibility level the total size of each database. [Using Data Migration Assistant to assess an application's data access layer](https://techcommunity.microsoft.com/t5/microsoft-data-migration/using-data-migration-assistant-to-assess-an-application-s-data/ba-p/990430) | -| DMA will now show the results of the assessment using 2 separate reports:
**'SQL Server feature parity'** which is a server level report highlighting any server settings or components (e.g. MSDTC) that the source DBs are using that isn't supported on the target – in this case Azure SQL Database. In our assessment there are 'Unsupported" or "Partially Supported" features reported (**CLR**, **cross database queries, several trace flags**).

**'Compatibility Issues'** which is a database level report detailing individual objects that have compatibility issues. Select **TEAMxx_TenantDataDb** Note the 'Migration blockers' and 'Breaking Changes' including CLR which the database uses. CLR is not supported on Azure SQL DB but is supported by Azure SQL Database Managed Instance (SQLMI).|![](../Images/b9132f0c444aff5c9af7d4ebe165c543.png)![](../Images/70795f03ccd50ba39f7aafef5e5d2808.png)|**Note**: Toggle the parity and compatibility issues radio button (top left) to switch between the 2 reports. 'SQL Server feature parity' shows what features are not supported in the target data source. Under the 'Details' and 'Databases' sections on the right you will find remedial action that are required and the databases impacted. 'Compatibility Issues' shows, over the compatibility tabs, issues that need to be addressed to permit the database(s) to run, in the chosen compatibility level (e.g. 160, 150, 140, 130, 120, 110, 100). If you have multiple databases, as with the example screenshot, you need to highlight EACH database to see the compatibility issues.| +|We need to determine the suitability of the database(s) for migration to Azure. This includes checking for compatibility and feature support with Azure Database. You should already have a remote (Bastion) session open to your teams Win10 Management VM**,** if so run DMA from the Start menus or Desktop icon.|![A screen shot of a computer Description automatically generated](../../Images/3967dd1b4dd31f5c19623f51ce94d486.png)|Database Migration Assistant (DMA) is a free download from Microsoft. It can be used to assess a number of database migration & upgrade scenarios not just SQL Server to Azure SQL Database.| +|You should see this screenshot to the right. Select the **"+"** to create a new **assessment** project|![](../../Images/e2b4706b838049af733fed665f6ada16.png)| +|Select/Enter the following details: **Project name:** **Workshop1**
**Assessment type:** **Database Engine**
**Source server type:** **SQL Server**
**Target server type:** **Azure SQL Database**
Click **'Create'**|![](../../Images/f562a7f4e609509f7032a192b15447d3.png)| Our first project assessment assumes we will be migrating to Azure SQL DB, so the options shown in the screenshot need to be selected.| +|Select the assessment checks (Report Type) to be made:
**Check database compatibility**
**Check feature parity**
Click **'Next'**|![](../../Images/fec55ffa6e1278f1c5e336de2b67c7ff.png) | DMA can test for both database compatibility and feature parity compliance against the Azure target. As this is the initial evaluation, we are assessing a database(s) we will perform all of these tests.| +|Enter the source/legacy SQL details:
**Server Name:** **LEGACYSQL2012**
**Authentication Type:** **SQL Server Authentication**
**Username:** **_Will be provided during hack_**
**Password:** **_Will be provided during hack_**
**Untick "Encrypt connection"**
Click **'Connect'**
*If you get an error logging in check that the Win10 keyboard language.|![A screenshot of a login box Description automatically generated](../../Images/b2f7457ed4a46050afcd18073d4cd96c.png)|When performing this within your own subscription you will enter the host, authentication and connection types according to your company guidelines and practices. *Bear in mind that DMA needs to connect to a source SQL Server using an account that belongs to the* **sysadmin** *role.* As this document is produced within a workshop environment Active Directory, Certificates and encryption has not been setup.| +|Select **only** the 3 databases used by your 'Online Transaction Monitor' app. These will have a **TEAMxx** prefix where XX should be replaced by your team number.
**TEAMxx_LocalMasterDataDb**
**TEAMxx_SharedMasterDb**
**TEAMxx_TenantDataDb**.
Click **'Add'** to add them to the assessment. | ![](../../Images/9488ec94afd6312aa62f3d0855683c83.png)|DMA will show all databases located on the Source host and display them so you can decide which ones to include in this assessment project. **Note**: you can assess multiple databases at the same time. +| You should now see the screen on the right with the relevant TEAMxx databases listed. Select '**Start Assessment'**|![](../../Images/ace5ff77e60d0379b3856db4497d306b.png)|**Note**: DMA allows you to either 'Add' or 'Remove' additional data sources as needed at this point. Also note that DMA provides some high-level metadata about the databases including their compatibility level the total size of each database. [Using Data Migration Assistant to assess an application's data access layer](https://techcommunity.microsoft.com/t5/microsoft-data-migration/using-data-migration-assistant-to-assess-an-application-s-data/ba-p/990430) | +| DMA will now show the results of the assessment using 2 separate reports:
**'SQL Server feature parity'** which is a server level report highlighting any server settings or components (e.g. MSDTC) that the source DBs are using that isn't supported on the target – in this case Azure SQL Database. In our assessment there are 'Unsupported" or "Partially Supported" features reported (**CLR**, **cross database queries, several trace flags**).

**'Compatibility Issues'** which is a database level report detailing individual objects that have compatibility issues. Select **TEAMxx_TenantDataDb** Note the 'Migration blockers' and 'Breaking Changes' including CLR which the database uses. CLR is not supported on Azure SQL DB but is supported by Azure SQL Database Managed Instance (SQLMI).|![](../../Images/b9132f0c444aff5c9af7d4ebe165c543.png)![](../../Images/70795f03ccd50ba39f7aafef5e5d2808.png)|**Note**: Toggle the parity and compatibility issues radio button (top left) to switch between the 2 reports. 'SQL Server feature parity' shows what features are not supported in the target data source. Under the 'Details' and 'Databases' sections on the right you will find remedial action that are required and the databases impacted. 'Compatibility Issues' shows, over the compatibility tabs, issues that need to be addressed to permit the database(s) to run, in the chosen compatibility level (e.g. 160, 150, 140, 130, 120, 110, 100). If you have multiple databases, as with the example screenshot, you need to highlight EACH database to see the compatibility issues.| || **Because we need to migrate CLR Stored Procs, we need to repeat the assessment with Azure SQL DB Managed Instance as the target to see if it's compatible**|| -|Once you've reviewed the assessment click the back arrow to see a list of current DMA projects. You should see this screenshot to the right. Select the **"+"** to create a new **assessment** project.|![](../Images/26f6da81414339b45fd763f27b58c84f.png)|| -|Select/Enter the following details:
**Project name:** **Workshop2**
**Assessment type:** **Database Engine**
**Source server type:** **SQL Server**
**Target server type:** **Azure SQL Database Managed Instance**
Click **'Create'** | ![](../Images/3b368b382479a605d9cc34179ebc7459.png)| Our 2nd assessment project assumes we will be migrating to Azure SQL DB Managed Instance, so the options shown in the screenshot need to be selected.| -|Select the assessment checks (Report Type) to be made: **Check database compatibility** **Check feature parity**
Click **'Next'** | ![](../Images/1b111d1094432ba5dca382cc10bd4a8b.png)|As we saw previously DMA can test for both database compatibility and feature parity compliance against the chosen target. As before we will assess all the databases against all of the tests.| -| Enter the source/legacy SQL details:
**Server Name:** **LEGACYSQL2012**
**Authentication Type:** **SQL Server Authentication**
**Username:** **_Will be provided during hack_**
**Password:** **_Will be provided during hack_**
**Untick "Encrypt connection"**
Click **'Connect'**|![A screenshot of a login box Description automatically generated](../Images/b2f7457ed4a46050afcd18073d4cd96c.png) | When performing this within your own subscription you will enter the host, authentication and connection types according to your company guidelines and practices. *Bear in mind that DMA needs to connect to a source SQL Server using an account that belongs to the sysadmin role.* As this document is produced within a workshop environment Active Directory, Certificates and encryption has not been setup.| -| You should now see the screen on the right with the relevant TEAMXX databases listed. Select '**Start Assessment'** | ![](../Images/ec0d16f58c29f404b13f9204a9c691e4.png) | **Note**: DMA allows you to either 'Add' or 'Remove' additional data sources as needed at this point. Also note that DMA has identified what compatibility level each source database is running under.| -| As before DMA will now show the results from the assessment as the separate 2 reports. Note the '**SQL Server feature parity**' report will either be clean The '**Compatibility Issues**' report should be clear for all 3 databases showing that they can be migrated to Azure SQLDB Managed Instance without changes.|![](../Images/6d2872ff60eb0f2926900c12e81c352b.png) | Note: Toggle the parity and compatibility Issues radio button (top left) to see how DMA. 'SQL Server feature parity' shows what features are not supported in the target data source. Under 'Details' and 'Databases' you will find remedial action that are required and the databases impacted. 'Compatibility Issues' shows, over the compatibility tabs, issues that need to be addressed to permit the database(s) to run, in the chosen compatibility level (e.g. 160, 150,140, 130, 120, 110,100). If you have multiple databases, as with the example screenshot, you need to highlight **EACH** database to see the compatibility issues. | +|Once you've reviewed the assessment click the back arrow to see a list of current DMA projects. You should see this screenshot to the right. Select the **"+"** to create a new **assessment** project.|![](../../Images/26f6da81414339b45fd763f27b58c84f.png)|| +|Select/Enter the following details:
**Project name:** **Workshop2**
**Assessment type:** **Database Engine**
**Source server type:** **SQL Server**
**Target server type:** **Azure SQL Database Managed Instance**
Click **'Create'** | ![](../../Images/3b368b382479a605d9cc34179ebc7459.png)| Our 2nd assessment project assumes we will be migrating to Azure SQL DB Managed Instance, so the options shown in the screenshot need to be selected.| +|Select the assessment checks (Report Type) to be made: **Check database compatibility** **Check feature parity**
Click **'Next'** | ![](../../Images/1b111d1094432ba5dca382cc10bd4a8b.png)|As we saw previously DMA can test for both database compatibility and feature parity compliance against the chosen target. As before we will assess all the databases against all of the tests.| +| Enter the source/legacy SQL details:
**Server Name:** **LEGACYSQL2012**
**Authentication Type:** **SQL Server Authentication**
**Username:** **_Will be provided during hack_**
**Password:** **_Will be provided during hack_**
**Untick "Encrypt connection"**
Click **'Connect'**|![A screenshot of a login box Description automatically generated](../../Images/b2f7457ed4a46050afcd18073d4cd96c.png) | When performing this within your own subscription you will enter the host, authentication and connection types according to your company guidelines and practices. *Bear in mind that DMA needs to connect to a source SQL Server using an account that belongs to the sysadmin role.* As this document is produced within a workshop environment Active Directory, Certificates and encryption has not been setup.| +| You should now see the screen on the right with the relevant TEAMXX databases listed. Select '**Start Assessment'** | ![](../../Images/ec0d16f58c29f404b13f9204a9c691e4.png) | **Note**: DMA allows you to either 'Add' or 'Remove' additional data sources as needed at this point. Also note that DMA has identified what compatibility level each source database is running under.| +| As before DMA will now show the results from the assessment as the separate 2 reports. Note the '**SQL Server feature parity**' report will either be clean The '**Compatibility Issues**' report should be clear for all 3 databases showing that they can be migrated to Azure SQLDB Managed Instance without changes.|![](../../Images/6d2872ff60eb0f2926900c12e81c352b.png) | Note: Toggle the parity and compatibility Issues radio button (top left) to see how DMA. 'SQL Server feature parity' shows what features are not supported in the target data source. Under 'Details' and 'Databases' you will find remedial action that are required and the databases impacted. 'Compatibility Issues' shows, over the compatibility tabs, issues that need to be addressed to permit the database(s) to run, in the chosen compatibility level (e.g. 160, 150,140, 130, 120, 110,100). If you have multiple databases, as with the example screenshot, you need to highlight **EACH** database to see the compatibility issues. | **We are now ready to migrate the application databases to Azure SQL Database Managed Instance** @@ -65,29 +67,29 @@ In this section we will use the Azure Data Studio (ADS) to assess the applicatio |**Narrative**| **Screenshot**| **Notes**| |:------------|:--------------|:---------| -|We need to determine the suitability of the database(s) for migration to Azure. This includes checking for compatibility and feature support with Azure Database. You should already have an RDP (or Bastion) session open to your teams Win10 Management VM, if so run Azure Data Studio (ADS) from the Start menus or Desktop icon.|![](../Images/b75f90f39b5b822bc14d18ae2ffb8621.png)| Azure Data Studio (ADS) is a free download from Microsoft. It can be used to perform database administration as well as assess a number of database migration & upgrade scenarios not just SQL Server to Azure SQL Database. [Download and install Azure Data Studio](https://learn.microsoft.com/en-us/sql/azure-data-studio/download-azure-data-studio?view=sql-server-ver16&tabs=redhat-install%2Credhat-uninstall)| -|Select "extensions" icon on the bottom left ( or press : CTRL + Shift + X) and search for: "**Azure SQL migration**" in the extension market and click Install. (If extension is not compatible with the ADS version installed, upgrade ADS under Help \> Check for Updates).|![](../Images/a12dd92f76c6242ff3ff60b275ead646.png)| See also: [Azure SQL migration extension for Azure Data Studio](https://learn.microsoft.com/en-us/sql/azure-data-studio/extensions/azure-sql-migration-extension?view=sql-server-ver16) | -|Open your browser and navigate to Login in with the credential provided Select the Azure Storage Account "sqlhack…" in the Resource Group: "SQLHACK-SHARED" And click: Access Keys on the left.|![](../Images/4ea143728ad4a3ec730760572f785d2e.png)| You can note the Key to the notepad and reuse it in following steps. | -|Create database backup in SSMS: Open SQL Server Management Studio (SSMS) on your Team VM. |![](../Images/286fb2e6d1d6b23789b3d3d16af409f5.png) | | -|In SSMS connect to: **legacysql2012**
Use the credentials:
**User**: **_Will be provided during hack_**
**Password**: **_Will be provided during hack_**|![](../Images/25bce50ae5aedc9358b1c09cddbdd9e5.png)|| -|**DO NOT EXECUTE THIS STEP** This is for reference only, as only a single credential is required! In SSMS open new query and create the credential using the following script: *USE [master]* *GO* *CREATE CREDENTIAL [Azurebackupstorage] WITH IDENTITY = '\'* *,SECRET = '\'*|![](../Images/289bd8ec4d83a70c8290893a42e7c2a3.png)| _**This should be only done only by the trainer.**_| -|Backup your team databases: Select your 3 team databases and create a full back to URL for each database
**TEAMXX_TenantDataDB** **TEAMXX_LocalMasterDataDB**
**TEAMXX_SharedMasterDataDB**|![](../Images/47cdd668bd3f86a4d89336bd93c8eea7.png)| This is the wizard experience in SSMS, you can also take backups using T-SQL scripts. There are some samples below, for this. | -|Backup database: Select Backup to URL Select the credential "Azurebackupstorage" Make sure you enter the Azure container name as follows: **migration/team\_\** e.g. for team01 **migration\\team01_localmasterdatadb**. Repeat this process for the remaining 2 databases: **TEAMXX_LocalMasterDataDB** **TEAMXX_SharedMasterDataDB** Use SSMS like above or use TSQL commands in the right hand side.|![](../Images/c8e2b67d79caf6a59890bee57dba263d.png)![](../Images/50d6aabc1ac11857c2a5ff2f7d6961fb.png) | [**You can also directly use TSQL to BackUp your Databases**](#t-sql-backup-code) | -|Switch to Azure portal on your web browser. Review and check that the **full backup** exists in each folder in the Azure Storage account.| *![](../Images/bc48ffffb341a8f7288bab66aa51c224.png)*|| -|In Azure Data Studio on your Team VM Connect to legacy SQL Server 2012 using "**New Connection**" | ![](../Images/d20118abebd0f983cb4c31db10098012.png)|| -| Enter server name and credentials.
Connection string: legacysql2012
**User**: **_Will be provided during hack_**
**Password**: **_Will be provided during hack_**.
Click Connect |![](../Images/e606818baf281ade6ac7bc84885c904a.png)|| -| Right Click on the SQL Server instance on the left hand side and select "**Manage**".|![](../Images/7accfb1944733173f52473afe3a4bf06.png)|| -| Select Azure SQL migration and choose "**New migration**" |![](../Images/5791f84a179b493d2325f7fef83571c0.png)|| -|Select your team databases:
**TEAMXX_TenantDataDB**
**TEAMXX_LocalMasterDataDB**
**TEAMXX_SharedMasterDataDB**
Click Next |![](../Images/0090bffa2e9bab5fce9ab882913500c0.png)|| -|Run assessment and receive recommendation Select Azure SQL target: **Azure SQL managed instance** Select "**Get Azure Recommendation**" Select the Log path: **C:\\Logs** and start the Performance Collection (If "C:\\Logs" folder doesn't exist, create this folder). You will see that data collection is in progress. Stop the performance collection **after \~10 min** by clicking on "Stop Data Collection" and review the recommended configuration which has now automatically appeared on the upper side.|![](../Images/f224cdfd145b933329a09589fce83717.png)![](../Images/86725ae84d4d19a6a6aab6652c018fe7.png)![](../Images/df840e717b23bd5d951fca011db0e0ba.png)![](../Images/66e97c5183db9f232356cf2a4900e054.png)![](../Images/735183829e72b24d22d8de7544fac0fc.png)|| -|Review the details of the recommended configuration in that you click on "View Details" under Azure SQL Managed Instance Tab.|![](../Images/fd722fca02ec3892686fef5a13273d01.png) | Please note that you can also save the recommendation report| -|Click on View/Select and select the 3 team databases for migration:
**TEAMXX_TenantDataDB**
**TEAMXX_LocalMasterDataDB**
**TEAMXX_SharedMasterDataDB**
Click Next|![](../Images/62bdf7248a303255111fe2dccf27a63b.png)![](../Images/a2c33df0563053cfc72e190908168372.png)![](../Images/b9c6e7783ef5e123c08e2d0c85215430.png)|| -|Select Azure Target (SQL MI). For this, you need to add your account that you use to login to Azure Portal: sqlhackuser**XX**@M365x59576877.onmicrosoft.com \&sqlhack@demo\_**XX**!|![](../Images/5630199a66cc115b379d7a46b1fe34b4.png)|| -| Select the Azure subscription, the Location, Resource Group and Azure SQL MI FDQN Name which are automatically provided from your Account. Click Next.|![](../Images/552e04b9711d318cca4b9b26e1f33664.png)|| -|Step 4: Select database migration service Select "**offline migration**" Select the existing Azure Database Migration Service: **sqlhack-dmsV2**|![](../Images/df0f6c23d4f68e630d11ee175b1fb414.png)| You can also do an Online Migration for mission critical workloads using DMS. There are additional steps that you should take for this. Please use the information in the following tutorial for Online Migration:[Tutorial: Migrate SQL Server to Azure SQL Managed Instance online by using Azure Data Studio - Azure Database Migration Service \| Microsoft Learn](https://learn.microsoft.com/en-us/azure/dms/tutorial-sql-server-managed-instance-online-ads) (You can also create a new Database Migration Service within minutes of you do the exercise in your own subscription. For this you can click on "create new in Step 6")| -|In the data source configuration select the last full backup file and click Next | ![](../Images/6ccfcae25882df567a7b51dcba3ecac5.png)|| -| Review summary and start migration.|![](../Images/ecdb9fede863af06e2ca346a80af669e.png)|| -| Review progress in Azure Data Studio Click on Refresh from time to time to check the latest status of the migration until it succeeds.|![](../Images/4a12363cf88d0a17e353598df4caee28.png)![](../Images/9f8c3cb1370893365f91d97b69a8dc55.png)![](../Images/2991c3b319d8b486cf78d26782d3f740.png)|| +|We need to determine the suitability of the database(s) for migration to Azure. This includes checking for compatibility and feature support with Azure Database. You should already have an RDP (or Bastion) session open to your teams Win10 Management VM, if so run Azure Data Studio (ADS) from the Start menus or Desktop icon.|![](../../Images/b75f90f39b5b822bc14d18ae2ffb8621.png)| Azure Data Studio (ADS) is a free download from Microsoft. It can be used to perform database administration as well as assess a number of database migration & upgrade scenarios not just SQL Server to Azure SQL Database. [Download and install Azure Data Studio](https://learn.microsoft.com/en-us/sql/azure-data-studio/download-azure-data-studio?view=sql-server-ver16&tabs=redhat-install%2Credhat-uninstall)| +|Select "extensions" icon on the bottom left ( or press : CTRL + Shift + X) and search for: "**Azure SQL migration**" in the extension market and click Install. (If extension is not compatible with the ADS version installed, upgrade ADS under Help \> Check for Updates).|![](../../Images/a12dd92f76c6242ff3ff60b275ead646.png)| See also: [Azure SQL migration extension for Azure Data Studio](https://learn.microsoft.com/en-us/sql/azure-data-studio/extensions/azure-sql-migration-extension?view=sql-server-ver16) | +|Open your browser and navigate to Login in with the credential provided Select the Azure Storage Account "sqlhack…" in the Resource Group: "SQLHACK-SHARED" And click: Access Keys on the left.|![](../../Images/4ea143728ad4a3ec730760572f785d2e.png)| You can note the Key to the notepad and reuse it in following steps. | +|Create database backup in SSMS: Open SQL Server Management Studio (SSMS) on your Team VM. |![](../../Images/286fb2e6d1d6b23789b3d3d16af409f5.png) | | +|In SSMS connect to: **legacysql2012**
Use the credentials:
**User**: **_Will be provided during hack_**
**Password**: **_Will be provided during hack_**|![](../../Images/25bce50ae5aedc9358b1c09cddbdd9e5.png)|| +|**DO NOT EXECUTE THIS STEP** This is for reference only, as only a single credential is required! In SSMS open new query and create the credential using the following script: *USE [master]* *GO* *CREATE CREDENTIAL [Azurebackupstorage] WITH IDENTITY = '\'* *,SECRET = '\'*|![](../../Images/289bd8ec4d83a70c8290893a42e7c2a3.png)| _**This should be only done only by the trainer.**_| +|Backup your team databases: Select your 3 team databases and create a full back to URL for each database
**TEAMXX_TenantDataDB** **TEAMXX_LocalMasterDataDB**
**TEAMXX_SharedMasterDataDB**|![](../../Images/47cdd668bd3f86a4d89336bd93c8eea7.png)| This is the wizard experience in SSMS, you can also take backups using T-SQL scripts. There are some samples below, for this. | +|Backup database: Select Backup to URL Select the credential "Azurebackupstorage" Make sure you enter the Azure container name as follows: **migration/team\_\** e.g. for team01 **migration\\team01_localmasterdatadb**. Repeat this process for the remaining 2 databases: **TEAMXX_LocalMasterDataDB** **TEAMXX_SharedMasterDataDB** Use SSMS like above or use TSQL commands in the right hand side.|![](../../Images/c8e2b67d79caf6a59890bee57dba263d.png)![](../../Images/50d6aabc1ac11857c2a5ff2f7d6961fb.png) | [**You can also directly use TSQL to BackUp your Databases**](#t-sql-backup-code) | +|Switch to Azure portal on your web browser. Review and check that the **full backup** exists in each folder in the Azure Storage account.| *![](../../Images/bc48ffffb341a8f7288bab66aa51c224.png)*|| +|In Azure Data Studio on your Team VM Connect to legacy SQL Server 2012 using "**New Connection**" | ![](../../Images/d20118abebd0f983cb4c31db10098012.png)|| +| Enter server name and credentials.
Connection string: legacysql2012
**User**: **_Will be provided during hack_**
**Password**: **_Will be provided during hack_**.
Click Connect |![](../../Images/e606818baf281ade6ac7bc84885c904a.png)|| +| Right Click on the SQL Server instance on the left hand side and select "**Manage**".|![](../../Images/7accfb1944733173f52473afe3a4bf06.png)|| +| Select Azure SQL migration and choose "**New migration**" |![](../../Images/5791f84a179b493d2325f7fef83571c0.png)|| +|Select your team databases:
**TEAMXX_TenantDataDB**
**TEAMXX_LocalMasterDataDB**
**TEAMXX_SharedMasterDataDB**
Click Next |![](../../Images/0090bffa2e9bab5fce9ab882913500c0.png)|| +|Run assessment and receive recommendation Select Azure SQL target: **Azure SQL managed instance** Select "**Get Azure Recommendation**" Select the Log path: **C:\\Logs** and start the Performance Collection (If "C:\\Logs" folder doesn't exist, create this folder). You will see that data collection is in progress. Stop the performance collection **after \~10 min** by clicking on "Stop Data Collection" and review the recommended configuration which has now automatically appeared on the upper side.|![](../../Images/f224cdfd145b933329a09589fce83717.png)![](../../Images/86725ae84d4d19a6a6aab6652c018fe7.png)![](../../Images/df840e717b23bd5d951fca011db0e0ba.png)![](../../Images/66e97c5183db9f232356cf2a4900e054.png)![](../../Images/735183829e72b24d22d8de7544fac0fc.png)|| +|Review the details of the recommended configuration in that you click on "View Details" under Azure SQL Managed Instance Tab.|![](../../Images/fd722fca02ec3892686fef5a13273d01.png) | Please note that you can also save the recommendation report| +|Click on View/Select and select the 3 team databases for migration:
**TEAMXX_TenantDataDB**
**TEAMXX_LocalMasterDataDB**
**TEAMXX_SharedMasterDataDB**
Click Next|![](../../Images/62bdf7248a303255111fe2dccf27a63b.png)![](../../Images/a2c33df0563053cfc72e190908168372.png)![](../../Images/b9c6e7783ef5e123c08e2d0c85215430.png)|| +|Select Azure Target (SQL MI). For this, you need to add your account that you use to login to Azure Portal: sqlhackuser**XX**@M365x59576877.onmicrosoft.com \&sqlhack@demo\_**XX**!|![](../../Images/5630199a66cc115b379d7a46b1fe34b4.png)|| +| Select the Azure subscription, the Location, Resource Group and Azure SQL MI FDQN Name which are automatically provided from your Account. Click Next.|![](../../Images/552e04b9711d318cca4b9b26e1f33664.png)|| +|Step 4: Select database migration service Select "**offline migration**" Select the existing Azure Database Migration Service: **sqlhack-dmsV2**|![](../../Images/df0f6c23d4f68e630d11ee175b1fb414.png)| You can also do an Online Migration for mission critical workloads using DMS. There are additional steps that you should take for this. Please use the information in the following tutorial for Online Migration:[Tutorial: Migrate SQL Server to Azure SQL Managed Instance online by using Azure Data Studio - Azure Database Migration Service \| Microsoft Learn](https://learn.microsoft.com/en-us/azure/dms/tutorial-sql-server-managed-instance-online-ads) (You can also create a new Database Migration Service within minutes of you do the exercise in your own subscription. For this you can click on "create new in Step 6")| +|In the data source configuration select the last full backup file and click Next | ![](../../Images/6ccfcae25882df567a7b51dcba3ecac5.png)|| +| Review summary and start migration.|![](../../Images/ecdb9fede863af06e2ca346a80af669e.png)|| +| Review progress in Azure Data Studio Click on Refresh from time to time to check the latest status of the migration until it succeeds.|![](../../Images/4a12363cf88d0a17e353598df4caee28.png)![](../../Images/9f8c3cb1370893365f91d97b69a8dc55.png)![](../../Images/2991c3b319d8b486cf78d26782d3f740.png)|| # Confirm application databases have been migrated to Azure SQL Managed Instance diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/Challenges/02-MicroHack-monitoring_and_performance_on_Azure_SQL_Managed_Instance.md b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-02/solution-02.md similarity index 78% rename from 03-Azure/01-02 Data/02-SQL_Modernization/Challenges/02-MicroHack-monitoring_and_performance_on_Azure_SQL_Managed_Instance.md rename to 03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-02/solution-02.md index 3a270bb5f..6100cb412 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/Challenges/02-MicroHack-monitoring_and_performance_on_Azure_SQL_Managed_Instance.md +++ b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-02/solution-02.md @@ -1,4 +1,6 @@ -# MicroHack challenge 2 +# Walkthrough Challenge 2 - Monitoring and Performance on Azure SQL Managed Instance + +[Previous Challenge Solution](../challenge-01/solution-01.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-03/solution-03.md) ## Monitoring and Performance on Azure SQL Managed Instance @@ -19,7 +21,7 @@ # Migration architecture and Azure components -![generated](../Images/MigrationArchitecture.png) +![generated](../../Images/MigrationArchitecture.png) # Lab Overview & Background @@ -69,9 +71,9 @@ As we are using Azure SQL Managed Instance we can also use the richness of the A |**Narrative/Instructions**| **Screenshot**| **Notes**| |:------------|:--------------|:---------| -| Open the Azure Portal (portal.azure.com) and open the shared SQL Managed Instance. Scroll down the **Overview** screen until you see the performance graph showing CPU utilization. Toggle the switches next to view CPU consumption over 1 hour, 24 hours and 7 days. Has the CPU usage pattern changed over time? | ![](../Images/87dbf84394a8aa06fb53d5985eaaa0aa.png) | | -| Click into the graph to go into Metrics chart screen. Here you have more flexibility over the data being reported and the format of the chart. Let’s add Storage Space Used the chart. Click **Add Metric** In the Metric drop down select **Storage Space Used**. . | ![](../Images/6daca573871745a2ac17e9c65da58aa7.png) | Notice that from the chart screen you can alter the type of chart (Line, Area, Bar, Scatter to data Grid), set up alerts, and pin the chart to your Azure Portal dashboard. | -| Click **Local Time** on the top right of the chart to view the data for various time intervals.|![](../Images/b0766aea6531c7cbf9d482aee37d4c84.png)|| +| Open the Azure Portal (portal.azure.com) and open the shared SQL Managed Instance. Scroll down the **Overview** screen until you see the performance graph showing CPU utilization. Toggle the switches next to view CPU consumption over 1 hour, 24 hours and 7 days. Has the CPU usage pattern changed over time? | ![](../../Images/87dbf84394a8aa06fb53d5985eaaa0aa.png) | | +| Click into the graph to go into Metrics chart screen. Here you have more flexibility over the data being reported and the format of the chart. Let’s add Storage Space Used the chart. Click **Add Metric** In the Metric drop down select **Storage Space Used**. . | ![](../../Images/6daca573871745a2ac17e9c65da58aa7.png) | Notice that from the chart screen you can alter the type of chart (Line, Area, Bar, Scatter to data Grid), set up alerts, and pin the chart to your Azure Portal dashboard. | +| Click **Local Time** on the top right of the chart to view the data for various time intervals.|![](../../Images/b0766aea6531c7cbf9d482aee37d4c84.png)|| ## Using Log Analytics with KQL to visualize SQL MI and Database Stats @@ -80,10 +82,10 @@ Now that we can use the global monitoring tool Log Analytics to identify which S |**Narrative/Instructions**| **Screenshot**| **Notes**| |:------------|:--------------|:---------| -| On the Azure Portal, on the SQL Managed Instance Resource, **click on Logs** on the left Menu. You will find several query templates You can test the **CPU utilization threshold template** And modify the parameters if needed.|![](../Images/7ac7f4ea0bf678241cccc8d2bc0e348f.png)|| -||**![](../Images/ce136344cc4d9c981d780e733b4260d7.png)**|| -| Create a new Query| ![](../Images/ef049ae85146b0b3e9a80c2ccd6cbb58.png)|| -|You can try the following queries. AzureDiagnostics is the table receiving the different diagnostics. Modify the Time Range, By default 24hours

![](../Images/7d9ba55500e1cb33c5296437df11b02a.png)|//general queries
// query 1 without filter
AzureDiagnostics

// query 2 SQL MI Resource usage
AzureDiagnostics
\| where Resource == "SQLHACKMI-WORWEGR7VULCU" //replace with your SQL MI Instance Name
\| where Category == "ResourceUsageStats"

// query 3 on database: waits Stats
AzureDiagnostics
\| where Resource == "TENANTCRM"
\| where Category == "QueryStoreWaitStatistics"

// query 4 on database: errors
AzureDiagnostics
\| where Resource == "TENANTCRM"
\| where Category == "Errors"| Language Reference [SQL to Kusto query translation](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/sqlcheatsheet) | -|On the results for each of the queries, change the to **Chart**

![](../Images/dea1e46afaecbef9b0005c3e95b20144.png)
The chart Formatting is on the right.| // more specific queries
//Query get CPU usage
AzureDiagnostics
\| where Resource == "SQLHACKMI-WORWEGR7VULCU" and TimeGenerated \> ago(2h) //replace with your SQL MI Instance Name
\| where Category == "ResourceUsageStats"
\| project TimeGenerated, todecimal(avg_cpu_percent_s)
// visualize the resulset as a chart ![](../Images/dc5f8134b938a54b4b3f00262894ec55.png)

// Query get database Waits Stats
AzureDiagnostics
\| where Category == "QueryStoreWaitStatistics"
\| summarize Total_Wait_Ms = max(todouble(total_query_wait_time_ms_d)) by wait_category_s, DatabaseName_s
\| order by Total_Wait_Ms desc

// visualize the resulset as a chart
![](../Images/4dd51a5f1f7285ddafeb49aa9cad6d44.png)|| +| On the Azure Portal, on the SQL Managed Instance Resource, **click on Logs** on the left Menu. You will find several query templates You can test the **CPU utilization threshold template** And modify the parameters if needed.|![](../../Images/7ac7f4ea0bf678241cccc8d2bc0e348f.png)|| +||**![](../../Images/ce136344cc4d9c981d780e733b4260d7.png)**|| +| Create a new Query| ![](../../Images/ef049ae85146b0b3e9a80c2ccd6cbb58.png)|| +|You can try the following queries. AzureDiagnostics is the table receiving the different diagnostics. Modify the Time Range, By default 24hours

![](../../Images/7d9ba55500e1cb33c5296437df11b02a.png)|//general queries
// query 1 without filter
AzureDiagnostics

// query 2 SQL MI Resource usage
AzureDiagnostics
\| where Resource == "SQLHACKMI-WORWEGR7VULCU" //replace with your SQL MI Instance Name
\| where Category == "ResourceUsageStats"

// query 3 on database: waits Stats
AzureDiagnostics
\| where Resource == "TENANTCRM"
\| where Category == "QueryStoreWaitStatistics"

// query 4 on database: errors
AzureDiagnostics
\| where Resource == "TENANTCRM"
\| where Category == "Errors"| Language Reference [SQL to Kusto query translation](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/sqlcheatsheet) | +|On the results for each of the queries, change the to **Chart**

![](../../Images/dea1e46afaecbef9b0005c3e95b20144.png)
The chart Formatting is on the right.| // more specific queries
//Query get CPU usage
AzureDiagnostics
\| where Resource == "SQLHACKMI-WORWEGR7VULCU" and TimeGenerated \> ago(2h) //replace with your SQL MI Instance Name
\| where Category == "ResourceUsageStats"
\| project TimeGenerated, todecimal(avg_cpu_percent_s)
// visualize the resulset as a chart ![](../../Images/dc5f8134b938a54b4b3f00262894ec55.png)

// Query get database Waits Stats
AzureDiagnostics
\| where Category == "QueryStoreWaitStatistics"
\| summarize Total_Wait_Ms = max(todouble(total_query_wait_time_ms_d)) by wait_category_s, DatabaseName_s
\| order by Total_Wait_Ms desc

// visualize the resulset as a chart
![](../../Images/4dd51a5f1f7285ddafeb49aa9cad6d44.png)|| We’ve now seen how the various performance monitoring and diagnosis tools – the Azure Portal, DMVs and the Query Store reports all revealed that the CPU was under pressure. The DMVs and Query Store reports also allowed us to drill-down to root cause and identify the worst offending query. In the real world you would now progress to tune the offending query to reduce the overall load on the Managed Instances CPUs and thereby improve the databases and environment performance. diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/Challenges/03-MicroHack-security_on_Azure_SQL_Managed_Instance.md b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-03/solution-03.md similarity index 87% rename from 03-Azure/01-02 Data/02-SQL_Modernization/Challenges/03-MicroHack-security_on_Azure_SQL_Managed_Instance.md rename to 03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-03/solution-03.md index 86493b0ae..86fc60669 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/Challenges/03-MicroHack-security_on_Azure_SQL_Managed_Instance.md +++ b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-03/solution-03.md @@ -1,4 +1,6 @@ -# MicroHack +# Walkthrough Challenge 3 - Security on Azure SQL Managed Instance + +[Previous Challenge Solution](../challenge-02/solution-02.md) - **[Home](../../Readme.md)** ## Security on Azure SQL Managed Instance @@ -28,7 +30,7 @@ This hands-on lab will introduces you to the layered security model available when running databases in Azure. The activities within this hands-on lab will progress from the outer security layers that protect the perimeter of Azure SQL through to the inner layers that protect the information contained within the data. -![](../Images/e978dd39c792bae310e16883257d560c.png) +![](../../Images/e978dd39c792bae310e16883257d560c.png) Because SQL Managed Instance always runs in a private network the Network Security layer has already been implemented at the vNet level. Equally we have already defined and implemented Azure AD and SQL Server logins, roles and permissions so the Access Management tier has also been pre-built. @@ -66,11 +68,11 @@ Whenever a database is deployed or schema changes are made to an existing databa |:------------|:--------------| |Within the Azure Portal navigate to the shared Azure SQL Managed Instance screen. Scroll down to the list of databases and click on your teams **TEAMXX_TenantDataDb** database.| |On the blade on the left, under the **Security** section click β€œ**Data Discovery & Classification**”| -|The Data Discovery and Classification **Overview** shows that no data classifications have been made but based on the automatic classification scan there are a number of potential data classification recommendations as shown at the top of the report: Click the blue information bar (highlighted in yellow) to view the data classification recommendations|![](../Images/77f07ddfaec5bb313ca73bcc36af4c0b.png)| -| The recommendations show the name of the schema, table and column with intelligent information type classification and sensitivity recommendations. As can be seen the **Customer** table in the **SalesLT** schema contains the columns **FirstName** and **LastName**. The initial data classification scan has identified that the **Information type** of these columns from a data classification perspective is **Name** and the **Sensitivity Label** for these columns is recommended to be **Confidential – GDPR**.|![](../Images/8dfe7cd131156b72ff7c659924919e03.png)| -|Select the **FirstName** and **LastName** classification recommendations by selecting the recommendation rows, click **Accept selected recommendations** and then click **Save**. Click the **Overview** tab on the Data Discovery & Classification report to look at the saved data classifications. There are now two columns classified from the Customer table with the information type of **Name** and the sensitivity label **Confidential – GDPR**.| ![](../Images/b21f2a93ac8bc7713174058ad42439e4.png)| -| Now let’s add a custom data classification which is not based on the auto recommendations. Switch back to the **Classification** tab at the top of the report click β€œ**+ Add classification**”.| ![](../Images/16591a75d63422cb521b90d8c702fd52.png)| -|On the **Add Classification** blade on the far right of the screen set the following values and then click **Add Classification** and then **Save** to save your new classification. Click the **Overview** tab to look at the saved data classifications.

**Schema name**: SalesLT
**Table name**: Product
**Column name**: ListPrice
**Information type**: Financial
**Sensitivity Label**: Highly Confidential

**Click:** Add Classification
**Click:** Save |![](../Images/1230233d11cd470db39b3987f2816fdf.png)| +|The Data Discovery and Classification **Overview** shows that no data classifications have been made but based on the automatic classification scan there are a number of potential data classification recommendations as shown at the top of the report: Click the blue information bar (highlighted in yellow) to view the data classification recommendations|![](../../Images/77f07ddfaec5bb313ca73bcc36af4c0b.png)| +| The recommendations show the name of the schema, table and column with intelligent information type classification and sensitivity recommendations. As can be seen the **Customer** table in the **SalesLT** schema contains the columns **FirstName** and **LastName**. The initial data classification scan has identified that the **Information type** of these columns from a data classification perspective is **Name** and the **Sensitivity Label** for these columns is recommended to be **Confidential – GDPR**.|![](../../Images/8dfe7cd131156b72ff7c659924919e03.png)| +|Select the **FirstName** and **LastName** classification recommendations by selecting the recommendation rows, click **Accept selected recommendations** and then click **Save**. Click the **Overview** tab on the Data Discovery & Classification report to look at the saved data classifications. There are now two columns classified from the Customer table with the information type of **Name** and the sensitivity label **Confidential – GDPR**.| ![](../../Images/b21f2a93ac8bc7713174058ad42439e4.png)| +| Now let’s add a custom data classification which is not based on the auto recommendations. Switch back to the **Classification** tab at the top of the report click β€œ**+ Add classification**”.| ![](../../Images/16591a75d63422cb521b90d8c702fd52.png)| +|On the **Add Classification** blade on the far right of the screen set the following values and then click **Add Classification** and then **Save** to save your new classification. Click the **Overview** tab to look at the saved data classifications.

**Schema name**: SalesLT
**Table name**: Product
**Column name**: ListPrice
**Information type**: Financial
**Sensitivity Label**: Highly Confidential

**Click:** Add Classification
**Click:** Save |![](../../Images/1230233d11cd470db39b3987f2816fdf.png)| |Open SQL Server Management Studio, connect to the shared SQL Managed Instance and open a new TSQL query window connected to your **TEAMXX_TenantDataDb** database

Run the SELECT statements opposite against your **TEAMXX_TenantDataDb** database.|\-- 1 Data Discovery & Classification
SELECT
c.FirstName
,c.LastName
,c.\*
FROM SalesLT.Customer c;
SELECT
p.ListPrice
FROM SalesLT.Product p;| |Nothing out of the ordinary happens - two simple result sets should be returned containing the FirstName, LastName and ListPrice columns.|| @@ -99,14 +101,14 @@ More details on Azure SQL vulnerability assessments can be found in the [officia |:------------|:--------------| |In the Azure portal navigate to the shared SQL Managed Instance.|| |Scroll down the Overview screen until you see the list of databases and click on your **TEAMXX_TenantDataDB** database.|| -|In the **TEAMXX_TenantDataDB** database screen. On the left hand blade click **Microsoft Defender for Cloud** in the Security section

Scroll down the screen to the bottom and click the β€œ**View additional findings in Vulnerability Assessment**” link| **![](../Images/61f9daaab94d010440353726ce0642ac.png)**| -|The β€œVulnerability Assessment” page can be used to run a scan, view scan history and will show the number of checks that have been passed and failed for the last scan with failed checks listed in the table below.

Run a scan if prompted to do so which should only take a few minutes.|![](../Images/4e20eb2e48b94ed12377644adfa0c223.png)| -|Review the lists of passed and failed checks. Notice that the report is specific to database you ran the scan for but does also include events against the system database and therefore flag server configuration issues.|![](../Images/4e20eb2e48b94ed12377644adfa0c223.png)| +|In the **TEAMXX_TenantDataDB** database screen. On the left hand blade click **Microsoft Defender for Cloud** in the Security section

Scroll down the screen to the bottom and click the β€œ**View additional findings in Vulnerability Assessment**” link| **![](../../Images/61f9daaab94d010440353726ce0642ac.png)**| +|The β€œVulnerability Assessment” page can be used to run a scan, view scan history and will show the number of checks that have been passed and failed for the last scan with failed checks listed in the table below.

Run a scan if prompted to do so which should only take a few minutes.|![](../../Images/4e20eb2e48b94ed12377644adfa0c223.png)| +|Review the lists of passed and failed checks. Notice that the report is specific to database you ran the scan for but does also include events against the system database and therefore flag server configuration issues.|![](../../Images/4e20eb2e48b94ed12377644adfa0c223.png)| |In the **Findings** tab, which lists the failed checks, click on finding:| **ID:**VA1256
**Security Check:** User CLR assemblies should not be defined in the database | -|Note the detailed report lists the rule’s details, the offending CLRs and a remediation script to remove them.
However, because these 2 CLRs are an integral part of our migrated legacy application we need to keep them. But equally we don’t want them to be continuously flagged as an issue in the Vulnerability Assessment reports. To do this we can add exceptions to the Vulnerability Assessment’s β€œbaseline” position.| **![](../Images/513774bfdaa4a39a5a52c78e2ab1051c.png)**| -|On the details page for V1256 click **Add all results as baseline** and select **Yes** in the Set base line message. Adding the results as the baseline will update the Vulnerability Assessment rules engine to accept the current CLR Assemblies as allowable and set a new baseline position for the rule.

Notice, in the upper side of the details page for 1256, a warning saying There are pending baseline changes. Run a new scan to see updated results.|![](../Images/dd88f48958763545c8790b7ede6d3655.png)![](../Images/b5659230dc09a911ebc6391b0c836c58.png)| -|Close the details page for 1256 to get back to the Assessment summary page and notice the same warning|![](../Images/9bbb41c86fe1d57f00cbfd7e80ff87e1.png)| -|Click the **Scan** button to run a manual scan which will take a about a minute. Once the scan completes the finding VA1256 will be removed from the Findings list.
When making changes to a Vulnerability Assessment baseline it may be necessary for compliance reasons to export a Scan Findings report to show the security posture of the Azure SQL Database in relation to the amended baseline.

To export the results of a scan to reflect the current baseline click β€œ**Export Scan Results**” at the top of the portal screen:

**NOTE: Excel is \*not\* installed on your lab VMs** *so you will have to copy the report to your own desktop to have a look at it.*|![](../Images/c2a55a83a6bda8f54771b591df69541c.png)| +|Note the detailed report lists the rule’s details, the offending CLRs and a remediation script to remove them.
However, because these 2 CLRs are an integral part of our migrated legacy application we need to keep them. But equally we don’t want them to be continuously flagged as an issue in the Vulnerability Assessment reports. To do this we can add exceptions to the Vulnerability Assessment’s β€œbaseline” position.| **![](../../Images/513774bfdaa4a39a5a52c78e2ab1051c.png)**| +|On the details page for V1256 click **Add all results as baseline** and select **Yes** in the Set base line message. Adding the results as the baseline will update the Vulnerability Assessment rules engine to accept the current CLR Assemblies as allowable and set a new baseline position for the rule.

Notice, in the upper side of the details page for 1256, a warning saying There are pending baseline changes. Run a new scan to see updated results.|![](../../Images/dd88f48958763545c8790b7ede6d3655.png)![](../../Images/b5659230dc09a911ebc6391b0c836c58.png)| +|Close the details page for 1256 to get back to the Assessment summary page and notice the same warning|![](../../Images/9bbb41c86fe1d57f00cbfd7e80ff87e1.png)| +|Click the **Scan** button to run a manual scan which will take a about a minute. Once the scan completes the finding VA1256 will be removed from the Findings list.
When making changes to a Vulnerability Assessment baseline it may be necessary for compliance reasons to export a Scan Findings report to show the security posture of the Azure SQL Database in relation to the amended baseline.

To export the results of a scan to reflect the current baseline click β€œ**Export Scan Results**” at the top of the portal screen:

**NOTE: Excel is \*not\* installed on your lab VMs** *so you will have to copy the report to your own desktop to have a look at it.*|![](../../Images/c2a55a83a6bda8f54771b591df69541c.png)| @@ -124,11 +126,11 @@ More information in Azure Defender for SQL – Advanced Threat Protection can be |:------------|:--------------| |In the Azure portal navigate to the shared SQL Managed Instance.||| |Scroll down the Overview screen until you see the list of databases and click on your **TEAMXX_TenantDataDB** database.||| -|In the **TEAMXX_TenantDataDB** database screen, on the left-hand blade click **Microsoft Defender for Cloud** in the Security section Scroll down to the **Security incidents and alters heading** – note no incidents or alerts are listed:| **![](../Images/eec68b37bb4694ee925c4cc6f5c34938.png)**|| +|In the **TEAMXX_TenantDataDB** database screen, on the left-hand blade click **Microsoft Defender for Cloud** in the Security section Scroll down to the **Security incidents and alters heading** – note no incidents or alerts are listed:| **![](../../Images/eec68b37bb4694ee925c4cc6f5c34938.png)**|| |On the team VM, open a new query window in SQL Server Management Studio connected to your **TEAMXX_TenantDataDB** database.||| |To simulate a potential SQL injection query copy the following SELECT into the new query window **BUT DON’T RUN IT YET**:|--Advanced Threat Protection
SELECT \*
FROM sys.databases
WHERE database_id like '' or 1 = 1 -- ' and family = 'test1';|Notice that the logic in the WHERE clause will always equate to true and the positioning of single-quotes including in the comment represents a potential SQL injection vulnerability| -|Before running the query change the connection properties as show opposite using the **Query\\Connection\\Change Connection**… menu in SSMS.

Click **Connect**| Specify the name of the team Azure SQL Database: **TEAMXX_TenantDataDB** ![Graphical user interface, application Description automatically generated](../Images/82b9ed825ade0d643bc7758660735c06.png)
On β€œAdditional Connection Parameters add a connection string option to specify the application name: **Application Name=webappname**
![](../Images/1684cc725d25a813222954105a73f264.png) | +|Before running the query change the connection properties as show opposite using the **Query\\Connection\\Change Connection**… menu in SSMS.

Click **Connect**| Specify the name of the team Azure SQL Database: **TEAMXX_TenantDataDB** ![Graphical user interface, application Description automatically generated](../../Images/82b9ed825ade0d643bc7758660735c06.png)
On β€œAdditional Connection Parameters add a connection string option to specify the application name: **Application Name=webappname**
![](../../Images/1684cc725d25a813222954105a73f264.png) | |Run the query.

It will return a list of databases on the server.|| -|Back in the Azure Portal **Microsoft Defender for Cloud** screen, after a few minutes an Alert should be generated:

**NOTE:** It might take up to 10mins for the alert to appear in the portal| ![Graphical user interface Description automatically generated with low confidence](../Images/a181cd65084cdd5f3515875e20bea999.png)| -|Once the Later appears click on it to see the details.

Depending on the progress of other teams you may see multiple entries in the details table.|![A screenshot of a computer Description automatically generated](../Images/619ec45260df07ebfec33d52e66706f2.png)| +|Back in the Azure Portal **Microsoft Defender for Cloud** screen, after a few minutes an Alert should be generated:

**NOTE:** It might take up to 10mins for the alert to appear in the portal| ![Graphical user interface Description automatically generated with low confidence](../../Images/a181cd65084cdd5f3515875e20bea999.png)| +|Once the Later appears click on it to see the details.

Depending on the progress of other teams you may see multiple entries in the details table.|![A screenshot of a computer Description automatically generated](../../Images/619ec45260df07ebfec33d52e66706f2.png)| |Try clicking on the Alert.

Note that you can drill further into the alert to see more details, get explanations and links to documentation on the alert and even advice on how negate and remediate the problem.|| diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/Readme.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/Readme.md index 68e1c0ea9..e2fc7ad3a 100644 --- a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/Readme.md +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/Readme.md @@ -6,16 +6,7 @@ - [What is Azure Arc?](#what-is-azure-arc) - [**MicroHack context**](#microhack-context) - [**Objectives**](#objectives) -- [**MicroHack Challenges**](#microhack-challenges) - - [General prerequisites](#general-prerequisites) - - [Challenge 1 - Azure Arc prerequisites & onboarding](#challenge-1---azure-arc-prerequisites--onboarding) - - [Challenge 2 - Azure Monitor integration](#challenge-2---azure-monitor-integration) - - [Challenge 3 - Access Azure resources using Managed Identities from your on-premises servers](#challenge-3---access-azure-resources-using-managed-identities-from-your-on-premises-servers) - - [Challenge 4 - Microsoft Defender for Cloud integration with Azure Arc](#challenge-4---microsoft-defender-for-cloud-integration-with-azure-arc) - - [Challenge 5 - Best Practices assessment for Windows Server](#challenge-5---best-practices-assessment-for-windows-server) - - [Challenge 6 - Activate ESU for Windows Server 2012 R2 via Arc (optional)](#challenge-6---activate-esu-for-windows-server-2012-r2-via-arc---optional) - - [Challenge 7 - Azure Machine Configuration (optional)](#challenge-7---azure-machine-configuration---optional) - +- [**MicroHack Challenges**](#challenges) - [**Contributors**](#contributors) ## MicroHack introduction @@ -64,7 +55,6 @@ After completing this MicroHack you will: - Understand use cases and possible scenarios in your hybrid world to modernize your infrastructure estate - Get insights into real world challenges and scenarios -## MicroHack Challenges ### General prerequisites @@ -81,227 +71,29 @@ This MicroHack has a few but important prerequisites to be understood before sta - [Visual Studio Code](https://code.visualstudio.com/) - [Git SCM](https://git-scm.com/download/) -## Challenge 1 - Azure Arc prerequisites & onboarding - -### Goal - -In challenge 1 you will prepare your Azure environemnt for onboarding of existing Windows- and Linux servers and onboard them to Azure Arc. - -### Actions - -- Verify all necessary Azure resources are in place - - Resource Group (Name: mh-arc-servers-rg) - - Service Principal (Name: mh-arc-servers-sp) -- Service Principal (Name: LabUser-xx-arc-servers-sp) -- Enable required Resource Providers (if not already enabled) -- Prep existing servers` operating system on-prem - - Hint: We are using Azure VMs to simulate on-prem servers -- Onboard existing servers to Azure Arc - - win2012-vm may be skipped unless you plan to do the optional Challenge 6 (Extended Security Updates) - -### Success criteria - -- You created an Azure resource group -- You created an service principal with the required role membership -- Successfully prepared existing servers -- Onboarded servers which is visible in the Azure Arc machines blade in the Azure Portal - -### Learning resources - -- [Plan and deploy Azure Arc-enabled servers](https://learn.microsoft.com/azure/azure-arc/servers/plan-at-scale-deployment) -- [Prerequisites for Connect hybrid machines with Azure Arc-enabled servers](https://learn.microsoft.com/azure/azure-arc/servers/learn/quick-enable-hybrid-vm#prerequisites) -- [Connect hybrid machines with Azure Arc-enabled servers](https://learn.microsoft.com/azure/azure-arc/servers/learn/quick-enable-hybrid-vm#generate-installation-script) -- [Create a service principal for onboarding](https://learn.microsoft.com/azure/azure-arc/servers/onboard-service-principal#create-a-service-principal-for-onboarding-at-scale) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-1/solution.md) - -## Challenge 2 - Azure Monitor, Update Manager, and Change Tracking integration - -### Goal - -In challenge 2 you will onboard your Windows and Linux virtual machines to Azure Monitor using the Azure Monitoring Agent (AMA) to leverage Azure Update Manager, Change Tracking, Inventory and more. - -### Actions - -- Create all necessary Azure resources - - Log Analytics workspace (Name: mh-arc-servers-kv-law) -- Configure Data Collection Rules to collect Windows event logs and Linux syslog -- Enable Azure Monitor for Azure Arc-enabled Servers with Azure Policy initiative -- Enable and configure Update Manager -- Enable Change Tracking and Inventory -- Enable VM Insights - - -### Success criteria - -- You have a Log Analytics Workspace -- You successfully linked the necessary Azure Policy initiative to the Azure resource group -- You can query the Log Analytics Workspace for events of your virtual machines -- All virtual machines have the latest Windows and Linux updates installed -- You can browse through the software inventory of your virtual machines -- You can use VM Insights to get a detailed view of your virtual machines - -### Learning resources - -- [Create a Log Analytics workspace in the Azure portal](https://docs.microsoft.com/azure/azure-monitor/logs/quick-create-workspace) -- [Deployment options for Azure Monitor agent on Azure Arc-enabled servers](https://learn.microsoft.com/azure/azure-arc/servers/concept-log-analytics-extension-deployment) -- [Data collection rules in Azure Monitor](https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview) -- [Azure Policy built-in definitions for Azure Arc-enabled servers](https://docs.microsoft.com/azure/azure-arc/servers/policy-reference) -- [Azure Update Manager](https://learn.microsoft.com/azure/update-manager/overview) -- [Enable Change Tracking and Inventory using Azure Monitoring Agent](https://learn.microsoft.com/azure/automation/change-tracking/enable-vms-monitoring-agent?tabs=singlevm%2Cmultiplevms&pivots=single-portal) -- [Monitor a hybrid machine with VM insights](https://docs.microsoft.com/azure/azure-arc/servers/learn/tutorial-enable-vm-insights) - - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-2/solution.md) - -## Challenge 3 - Access Azure resources using Managed Identities from your on-premises servers - -### Goal - -Managing secrets, credentials or certificates to secure communication between different services is a main challenge for developers and administrators. Managed Identities is Azure's answer to all these challenges and eliminates the need to manage and securely store secrets, credentials or certificates on the virtual machine. In challenge 3 you will leverage Managed Identities via Azure Arc to securely access an Azure Key Vault secret from your Azure Arc enabled servers without the need of managing any credential. - -### Actions - -- Create an Azure Key Vault in your Azure resource group -- Create a secret in the Azure Key Vault and assign permissions to your Linux virtual machine -- Access the secret via bash script - -### Success Criteria - -- You successfully output the secret in the terminal on your Linux server without providing any credentials (except for your SSH login 😊). - -### Learning resources - -- [Create a key vault using the Azure portal](https://docs.microsoft.com/azure/key-vault/general/quick-create-portal) -- [Set and retrieve a secret from Azure Key Vault using the Azure portal](https://docs.microsoft.com/azure/key-vault/secrets/quick-create-portal) -- [Use a Linux VM system-assigned managed identity to access Azure Key Vault](https://docs.microsoft.com/azure/active-directory/managed-identities-azure-resources/tutorial-linux-vm-access-nonaad) -- [Authenticate against Azure resources with Azure Arc-enabled servers](https://docs.microsoft.com/azure/azure-arc/servers/managed-identity-authentication) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-3/solution.md) - -## Challenge 4 - Microsoft Defender for Cloud integration with Azure Arc - -### Goal - -- In this challenge, we will integrate your Azure Arc connected machines with Azure Defender for Cloud. After completing the previous challenges, you should now have an Azure subscription with one or more Azure Arc-enabled servers. You should also have an available Log Analytics workspace and have deployed the Azure Monitor Agent to your server(s). - -### Actions - -- Enable Microsoft Defender for Cloud on your Azure Arc-enabled machines. - -### Success criteria - -- Open Microsoft Defender for Cloud and view the Secure Score for your Azure Arc-enabled machine(s). - -### Learning resources - -- [What is Microsoft Defender for Cloud?](https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction) -- [Quickstart: Connect your non-Azure machines to Microsoft Defender for Cloud](https://learn.microsoft.com/azure/defender-for-cloud/quickstart-onboard-machines?pivots=azure-arc) -- [Connect Azure Arc-enabled servers to Microsoft Defender for Cloud](https://learn.microsoft.com/azure/cloud-adoption-framework/manage/hybrid/server/best-practices/arc-security-center) -- [Protect non-Azure resources using Azure Arc and Microsoft Defender for Cloud](https://techcommunity.microsoft.com/t5/microsoft-defender-for-cloud/protect-non-azure-resources-using-azure-arc-and-microsoft/ba-p/2277215) -- [Deploy the Azure Monitor Agent to protect your servers with Microsoft Defender for Cloud](https://learn.microsoft.com/azure/defender-for-cloud/auto-deploy-azure-monitoring-agent) - - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-4/solution.md) - -## Challenge 5 - Best Practices assessment for Windows Server - -### Goal - -In this challenge, you will configure and deploy the Best Practices Assessment for Windows Servers onboarded to Azure Arc. The assessment will evaluate the server’s configuration against Windows best practices, generate actionable remediation steps for identified issues, and help you enhance your server infrastructure's performance, security, and stability. - -### Actions - -- Set Up Best Practices Assessment for one machine -- Run the Best Practices Assessment -- Analyze Results - -### Success criteria - -- Best Practices Assessment is enabled and installed on your Arc-enabled Windows Server -- The Assessment Platform, Windows Server Assessment, and Azure Monitor Agent (AMA) extensions are installed successfully -- The first Best Practices Assessment is run successfully - -Note: this feature is only available for Arc-enabled Windows Server that are covered with Software Assurance. - -### Learning resources - -- [Configure Best Practices Assessment for Arc-enabled Windows servers](https://learn.microsoft.com/windows-server/manage/azure-arc/best-practices-assessment-for-windows-server) - - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-5/solution.md) - -## Challenge 6 - Activate ESU for Windows Server 2012 R2 via Arc - optional - -### Goal - -In this challenge, you will activate Extended Security Updates (ESU) for Windows Server 2012 R2 via Azure Arc. This will ensure that your server continues to receive critical security updates beyond the end of support date and allows you to stop paying for updates once the server gets decommissioned or upgraded. - -### Actions - -- Purchase and activate the ESU license for your Windows Server 2012 R2. -- Apply the ESU license to your server. - -### Success criteria - -- The ESU license is purchased and activated. -- The server has an attached ESU license and its ESU status shows as "Enabled" - -### Learning resources - -- [Extended Security Updates for Windows Server 2012 and 2012 R2](https://learn.microsoft.com/lifecycle/faq/extended-security-updates) -- [Deploy Extended Security Updates using Azure Arc](https://learn.microsoft.com/azure/azure-arc/servers/prepare-extended-security-updates?tabs=azure-cloud) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-6/solution.md) - -## Challenge 7 - Azure Machine Configuration - optional - -### Goal - -This challenge is about interacting with the client operating system. We will have a look at Machine Configurations as the final step of this journey. - -### Actions - -- Create all necessary Azure resources - - Azure Storage account -- Setup a Policy that checks if the user "FrodoBaggins" is part of the local administrators group -- Setup a Custom Machine Configuration, for the Windows Server, that creates a registry key in ``` HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\ ``` - -### Success criteria - -- You can view the compliance state of the Administrator Group Policy -- You can show the registry key being present on the Windows Server -### Learning resources +## Challenges -- [Understand the machine configuration feature](https://learn.microsoft.com/azure/governance/machine-configuration/overview) -- [How to setup a machine configuration authoring environment](https://learn.microsoft.com/azure/governance/machine-configuration/machine-configuration-create-setup) -- [How to create custom machine configuration package artifacts](https://learn.microsoft.com/azure/governance/machine-configuration/machine-configuration-create) -- [How to create custom machine configuration policy definitions](https://learn.microsoft.com/azure/governance/machine-configuration/machine-configuration-create-definition) -- [Create SAS tokens for storage containers](https://learn.microsoft.com/azure/applied-ai-services/form-recognizer/create-sas-tokens) +* [Challenge 1 - Azure Arc prerequisites & onboarding](challenges/challenge-01.md) **<- Start here** +* [Challenge 2 - Azure Monitor integration](challenges/challenge-02.md) +* [Challenge 3 - Access Azure resources using Managed Identities from your on-premises servers](challenges/challenge-03.md) +* [Challenge 4 - Microsoft Defender for Cloud integration with Azure Arc](challenges/challenge-04.md) +* [Challenge 5 - Best Practices assessment for Windows Server](challenges/challenge-05.md) +* [Challenge 6 - Activate ESU for Windows Server 2012 R2 via Arc - optional](challenges/challenge-06.md) +* [Challenge 7 - Azure Automanage Machine Configuration - optional](challenges/challenge-07.md) -### Solution - Spoilerwarning -[Solution Steps](./walkthrough/challenge-7/solution.md) +## Solutions - Spoilerwarning -## Finish +* [Solution 1 - Azure Arc prerequisites & onboarding](./walkthrough/challenge-01/solution-01.md) +* [Solution 2 - Azure Monitor integration](./walkthrough/challenge-02/solution-02.md) +* [Solution 3 - Access Azure resources using Managed Identities from your on-premises servers](./walkthrough/challenge-03/solution-03.md) +* [Solution 4 - Microsoft Defender for Cloud integration with Azure Arc](./walkthrough/challenge-04/solution-04.md) +* [Solution 5 - Best Practices assessment for Windows Server](./walkthrough/challenge-05/solution-05.md) +* [Solution 6 - Activate ESU for Windows Server 2012 R2 via Arc - optional](./walkthrough/challenge-06/solution-06.md) +* [Solution 7 - Azure Automanage Machine Configuration - optional](./walkthrough/challenge-07/solution-07.md) -Congratulations! You finished the MicroHack Azure Arc for Servers. We hope you had the chance to learn about the Hybrid capabilities of Azure. -If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. -Thank you for investing the time and see you next time! ## Contributors diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-01.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-01.md new file mode 100644 index 000000000..109238556 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-01.md @@ -0,0 +1,33 @@ +# Challenge 1 - Azure Arc prerequisites & onboarding + +**[Home](../Readme.md)** - [Next Challenge Solution](challenge-02.md) + +## Goal + +In challenge 1 you will prepare your Azure environemnt for onboarding of existing Windows- and Linux servers and onboard them to Azure Arc. + +## Actions + +- Verify all necessary Azure resources are in place + - Resource Group (Name: mh-arc-servers-rg) + - Service Principal (Name: mh-arc-servers-sp) +- Service Principal (Name: LabUser-xx-arc-servers-sp) +- Enable required Resource Providers (if not already enabled) +- Prep existing servers` operating system on-prem + - Hint: We are using Azure VMs to simulate on-prem servers +- Onboard existing servers to Azure Arc + - win2012-vm may be skipped unless you plan to do the optional Challenge 6 (Extended Security Updates) + +## Success criteria + +- You created an Azure resource group +- You created an service principal with the required role membership +- Successfully prepared existing servers +- Onboarded servers which is visible in the Azure Arc machines blade in the Azure Portal + +## Learning resources + +- [Plan and deploy Azure Arc-enabled servers](https://learn.microsoft.com/azure/azure-arc/servers/plan-at-scale-deployment) +- [Prerequisites for Connect hybrid machines with Azure Arc-enabled servers](https://learn.microsoft.com/azure/azure-arc/servers/learn/quick-enable-hybrid-vm#prerequisites) +- [Connect hybrid machines with Azure Arc-enabled servers](https://learn.microsoft.com/azure/azure-arc/servers/learn/quick-enable-hybrid-vm#generate-installation-script) +- [Create a service principal for onboarding](https://learn.microsoft.com/azure/azure-arc/servers/onboard-service-principal#create-a-service-principal-for-onboarding-at-scale) diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-02.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-02.md new file mode 100644 index 000000000..9a41de251 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-02.md @@ -0,0 +1,38 @@ +# Challenge 2 - Azure Monitor integration + +[Previous Challenge Solution](challenge-01.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-03.md) + +## Goal + +In challenge 2 you will onboard your Windows and Linux virtual machines to Azure Monitor using the Azure Monitoring Agent (AMA) to leverage Azure Update Manager, Change Tracking, Inventory and more. + +## Actions + +- Create all necessary Azure resources + - Log Analytics workspace (Name: mh-arc-servers-kv-law) +- Configure Data Collection Rules to collect Windows event logs and Linux syslog +- Enable Azure Monitor for Azure Arc-enabled Servers with Azure Policy initiative +- Enable and configure Update Manager +- Enable Change Tracking and Inventory +- Enable VM Insights + + +## Success criteria + +- You have a Log Analytics Workspace +- You successfully linked the necessary Azure Policy initiative to the Azure resource group +- You can query the Log Analytics Workspace for events of your virtual machines +- All virtual machines have the latest Windows and Linux updates installed +- You can browse through the software inventory of your virtual machines +- You can use VM Insights to get a detailed view of your virtual machines + +## Learning resources + +- [Create a Log Analytics workspace in the Azure portal](https://docs.microsoft.com/azure/azure-monitor/logs/quick-create-workspace) +- [Deployment options for Azure Monitor agent on Azure Arc-enabled servers](https://learn.microsoft.com/azure/azure-arc/servers/concept-log-analytics-extension-deployment) +- [Data collection rules in Azure Monitor](https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview) +- [Azure Policy built-in definitions for Azure Arc-enabled servers](https://docs.microsoft.com/azure/azure-arc/servers/policy-reference) +- [Azure Update Manager](https://learn.microsoft.com/azure/update-manager/overview) +- [Enable Change Tracking and Inventory using Azure Monitoring Agent](https://learn.microsoft.com/azure/automation/change-tracking/enable-vms-monitoring-agent?tabs=singlevm%2Cmultiplevms&pivots=single-portal) +- [Monitor a hybrid machine with VM insights](https://docs.microsoft.com/azure/azure-arc/servers/learn/tutorial-enable-vm-insights) + diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-03.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-03.md new file mode 100644 index 000000000..751232431 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-03.md @@ -0,0 +1,25 @@ +# Challenge 3 - Access Azure resources using Managed Identities from your on-premises servers + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-04.md) + +## Goal + +Managing secrets, credentials or certificates to secure communication between different services is a main challenge for developers and administrators. Managed Identities is Azure's answer to all these challenges and eliminates the need to manage and securely store secrets, credentials or certificates on the virtual machine. In challenge 3 you will leverage Managed Identities via Azure Arc to securely access an Azure Key Vault secret from your Azure Arc enabled servers without the need of managing any credential. + +## Actions + +- Create an Azure Key Vault in your Azure resource group +- Create a secret in the Azure Key Vault and assign permissions to your Linux virtual machine +- Access the secret via bash script + +## Success Criteria + +- You successfully output the secret in the terminal on your Linux server without providing any credentials (except for your SSH login 😊). + +## Learning resources + +- [Create a key vault using the Azure portal](https://docs.microsoft.com/azure/key-vault/general/quick-create-portal) +- [Set and retrieve a secret from Azure Key Vault using the Azure portal](https://docs.microsoft.com/azure/key-vault/secrets/quick-create-portal) +- [Use a Linux VM system-assigned managed identity to access Azure Key Vault](https://docs.microsoft.com/azure/active-directory/managed-identities-azure-resources/tutorial-linux-vm-access-nonaad) +- [Authenticate against Azure resources with Azure Arc-enabled servers](https://docs.microsoft.com/azure/azure-arc/servers/managed-identity-authentication) + diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-04.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-04.md new file mode 100644 index 000000000..4582f648f --- /dev/null +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-04.md @@ -0,0 +1,24 @@ +# Challenge 4 - Microsoft Defender for Cloud integration with Azure Arc + +[Previous Challenge Solution](challenge-03.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-05.md) + +## Goal + +- In this challenge, we will integrate your Azure Arc connected machines with Azure Defender for Cloud. After completing the previous challenges, you should now have an Azure subscription with one or more Azure Arc-enabled servers. You should also have an available Log Analytics workspace and have deployed the Log Analytics agent to your server(s). + +## Actions + +- Enable Microsoft Defender for Cloud on your Azure Arc-enabled machines. + +## Success criteria + +- Open Microsoft Defender for Cloud and view the Secure Score for your Azure Arc-enabled machine(s). + +## Learning resources + +- [What is Microsoft Defender for Cloud?](https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction) +- [Quickstart: Connect your non-Azure machines to Microsoft Defender for Cloud](https://learn.microsoft.com/azure/defender-for-cloud/quickstart-onboard-machines?pivots=azure-arc) +- [Connect Azure Arc-enabled servers to Microsoft Defender for Cloud](https://learn.microsoft.com/azure/cloud-adoption-framework/manage/hybrid/server/best-practices/arc-security-center) +- [Protect non-Azure resources using Azure Arc and Microsoft Defender for Cloud](https://techcommunity.microsoft.com/t5/microsoft-defender-for-cloud/protect-non-azure-resources-using-azure-arc-and-microsoft/ba-p/2277215) +- [Deploy the Azure Monitor Agent to protect your servers with Microsoft Defender for Cloud](https://learn.microsoft.com/azure/defender-for-cloud/auto-deploy-azure-monitoring-agent) + diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-05.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-05.md new file mode 100644 index 000000000..97701a804 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-05.md @@ -0,0 +1,24 @@ +# Challenge 5 - Best Practices assessment for Windows Server + +[Previous Challenge Solution](challenge-04.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-06.md) + +## Goal + +In this challenge, you will configure and deploy the Best Practices Assessment for Windows Servers onboarded to Azure Arc. The assessment will evaluate the server’s configuration against Windows best practices, generate actionable remediation steps for identified issues, and help you enhance your server infrastructure's performance, security, and stability. + +## Actions + +- Set Up Best Practices Assessment for one machine +- Run the Best Practices Assessment +- Analyze Results + +## Success criteria + +- Best Practices Assessment is enabled and installed on your Arc-enabled Windows Server +- The Assessment Platform, Windows Server Assessment, and Azure Monitor Agent (AMA) extensions are installed successfully +- The first Best Practices Assessment is run successfully + +## Learning resources + +- [Configure Best Practices Assessment for Arc-enabled Windows servers](https://learn.microsoft.com/windows-server/manage/azure-arc/best-practices-assessment-for-windows-server) + diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-06.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-06.md new file mode 100644 index 000000000..ddb3fb4cd --- /dev/null +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-06.md @@ -0,0 +1,23 @@ +# Challenge 6 - Activate ESU for Windows Server 2012 R2 via Arc - optional + +[Previous Challenge Solution](challenge-05.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-07.md) + +## Goal + +In this challenge, you will activate Extended Security Updates (ESU) for Windows Server 2012 R2 via Azure Arc. This will ensure that your server continues to receive critical security updates beyond the end of support date and allows you to stop paying for updates once the server gets decommissioned or upgraded. + +## Actions + +- Purchase and activate the ESU license for your Windows Server 2012 R2. +- Apply the ESU license to your server. + +## Success criteria + +- The ESU license is purchased and activated. +- The server has an attached ESU license and its ESU status shows as "Enabled" + +## Learning resources + +- [Extended Security Updates for Windows Server 2012 and 2012 R2](https://learn.microsoft.com/lifecycle/faq/extended-security-updates) +- [Deploy Extended Security Updates using Azure Arc](https://learn.microsoft.com/azure/azure-arc/servers/prepare-extended-security-updates?tabs=azure-cloud) + diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-07.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-07.md new file mode 100644 index 000000000..1c115fe5b --- /dev/null +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/challenge-07.md @@ -0,0 +1,28 @@ +# Challenge 7 - Azure Automanage Machine Configuration - optional + +[Previous Challenge Solution](challenge-06.md) - **[Home](../Readme.md)** - [Next Challenge Solution](finish.md) + +## Goal + +This challenge is about interacting with the client operating system. We will have a look at Machine Configurations as the final step of this journey. + +## Actions + +- Create all necessary Azure resources + - Azure Storage account +- Setup a Policy that checks if the user "FrodoBaggins" is part of the local administrators group +- Setup a Custom Machine Configuration, for the Windows Server, that creates a registry key in ``` HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\ ``` + +## Success criteria + +- You can view the compliance state of the Administrator Group Policy +- You can show the registry key being present on the Windows Server + +## Learning resources + +- [Understand the machine configuration feature of Azure Automanage](https://learn.microsoft.com/azure/governance/machine-configuration/overview) +- [How to setup a machine configuration authoring environment](https://learn.microsoft.com/azure/governance/machine-configuration/machine-configuration-create-setup) +- [How to create custom machine configuration package artifacts](https://learn.microsoft.com/azure/governance/machine-configuration/machine-configuration-create) +- [How to create custom machine configuration policy definitions](https://learn.microsoft.com/azure/governance/machine-configuration/machine-configuration-create-definition) +- [Create SAS tokens for storage containers](https://learn.microsoft.com/azure/applied-ai-services/form-recognizer/create-sas-tokens) + diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/finish.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/finish.md new file mode 100644 index 000000000..75d6cea1f --- /dev/null +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/challenges/finish.md @@ -0,0 +1,11 @@ +# Finish + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** + +## Congratulations + +You finished the MicroHack *Azure Arc for Servers*. +If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. + +Thank you for investing the time and see you next time! + diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/1.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/1.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/1.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/10.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/10.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/10.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/11.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/11.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/11.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/12.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/12.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/12.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/13.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/13.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/13.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/14.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/14.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/14.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/15.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/15.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/15.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/15.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/16.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/16.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/16.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/16.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/17.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/17.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/17.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/17.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/18.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/18.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/18.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/18.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/19.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/19.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/19.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/19.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/2.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/2.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/2.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/20.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/20.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/20.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/20.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/21.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/21.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/21.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/21.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/22.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/22.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/22.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/22.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/23.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/23.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/23.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/23.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/24.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/24.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/24.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/24.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/25.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/25.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/25.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/25.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/26.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/26.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/26.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/26.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/27.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/27.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/27.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/27.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/28.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/28.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/28.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/28.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/31.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/31.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/31.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/31.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/32.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/32.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/32.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/32.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/33.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/33.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/33.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/33.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/35.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/35.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/35.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/35.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/5.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/5.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/5.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/6.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/6.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/6.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/7.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/7.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/7.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/8.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/8.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/8.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/9.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/img/9.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/img/9.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/solution.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/solution-01.md similarity index 98% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/solution.md rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/solution-01.md index d0ffa37f3..851ae5de7 100644 --- a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-1/solution.md +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-01/solution-01.md @@ -1,8 +1,8 @@ # Walkthrough Challenge 1 - Azure Arc prerequisites & onboarding -Duration: 20 minutes +**[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-02/solution-02.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-2/solution.md) +Duration: 20 minutes ## Prerequisites diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.2_Create_Data_Collection_Rule.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.2_Create_Data_Collection_Rule.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.2_Create_Data_Collection_Rule.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.2_Create_Data_Collection_Rule.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.3_Create_Data_Collection_Rule_Basics.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.3_Create_Data_Collection_Rule_Basics.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.3_Create_Data_Collection_Rule_Basics.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.3_Create_Data_Collection_Rule_Basics.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.4_Create_Data_Collection_Rule_Collect.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.4_Create_Data_Collection_Rule_Collect.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.4_Create_Data_Collection_Rule_Collect.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.4_Create_Data_Collection_Rule_Collect.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.5_Create_Data_Collection_Rule_Destination.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.5_Create_Data_Collection_Rule_Destination.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.5_Create_Data_Collection_Rule_Destination.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.5_Create_Data_Collection_Rule_Destination.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.6_Create_Data_Collection_Rule_Datasource.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.6_Create_Data_Collection_Rule_Datasource.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/2.6_Create_Data_Collection_Rule_Datasource.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/2.6_Create_Data_Collection_Rule_Datasource.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/3.4_Assign_Policy_Monitor_AMA.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/3.4_Assign_Policy_Monitor_AMA.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/3.4_Assign_Policy_Monitor_AMA.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/3.4_Assign_Policy_Monitor_AMA.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/3.5_Assign_Policy_Monitor_AMA_remidiate.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/3.5_Assign_Policy_Monitor_AMA_remidiate.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/3.5_Assign_Policy_Monitor_AMA_remidiate.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/3.5_Assign_Policy_Monitor_AMA_remidiate.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/3.6_Assign_Policy_Monitor_AMA_remidiate.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/3.6_Assign_Policy_Monitor_AMA_remidiate.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/3.6_Assign_Policy_Monitor_AMA_remidiate.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/3.6_Assign_Policy_Monitor_AMA_remidiate.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/3.7_Assign_Policy_Monitor_AMA_remidiate.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/3.7_Assign_Policy_Monitor_AMA_remidiate.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/3.7_Assign_Policy_Monitor_AMA_remidiate.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/3.7_Assign_Policy_Monitor_AMA_remidiate.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/4.10_Update_Management.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/4.10_Update_Management.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/4.10_Update_Management.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/4.10_Update_Management.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/4.11_Update_Management.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/4.11_Update_Management.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/4.11_Update_Management.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/4.11_Update_Management.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/5.1_remediation_tasks.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/5.1_remediation_tasks.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/5.1_remediation_tasks.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/5.1_remediation_tasks.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/5.9_Inventory.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/5.9_Inventory.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/5.9_Inventory.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/5.9_Inventory.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/5_CreateLAW.jpg b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/5_CreateLAW.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/5_CreateLAW.jpg rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/5_CreateLAW.jpg diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/image6.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/image6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/image6.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/image6.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/image7.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/image7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/img/image7.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/img/image7.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/solution.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/solution-02.md similarity index 98% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/solution.md rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/solution-02.md index 34969645b..52bfe0d12 100644 --- a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-2/solution.md +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-02/solution-02.md @@ -1,8 +1,8 @@ # Walkthrough Challenge 2 - Use Azure Monitor, Azure Update Management and Inventory for your Azure Arc enabled Servers -Duration: 30 minutes +[Previous Challenge Solution](../challenge-01/solution-01.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-03/solution-03.md) -[Previous Challenge Solution](../challenge-1/solution.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-3/solution.md) +Duration: 30 minutes ## Prerequisites diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/1_new_KV.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/1_new_KV.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/1_new_KV.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/1_new_KV.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/2_KV_settings.jpg b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/2_KV_settings.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/2_KV_settings.jpg rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/2_KV_settings.jpg diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/3_Assign_KeyVault_permissions.jpg b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/3_Assign_KeyVault_permissions.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/3_Assign_KeyVault_permissions.jpg rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/3_Assign_KeyVault_permissions.jpg diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/4_Create_Secret.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/4_Create_Secret.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/4_Create_Secret.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/4_Create_Secret.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/5_result_secret.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/5_result_secret.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/img/5_result_secret.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/img/5_result_secret.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/solution.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/solution-03.md similarity index 97% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/solution.md rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/solution-03.md index 6f7f0fe35..242bb260d 100644 --- a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-3/solution.md +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-03/solution-03.md @@ -1,8 +1,8 @@ # Walkthrough Challenge 3 - Access Azure resources using Managed Identities from your on-premises servers -Duration: 30 minutes +[Previous Challenge Solution](../challenge-02/solution-02.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-04/solution-04.md) -[Previous Challenge Solution](../challenge-2/solution.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-4/solution.md) +Duration: 30 minutes ## Prerequisites diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/1.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/1.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/1.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/2.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/2.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/2.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/3.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/3.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/3.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/4.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/4.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/4.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/5.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/5.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/5.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/6.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/6.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/6.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/7.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/img/7.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/img/7.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/solution.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/solution-04.md similarity index 90% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/solution.md rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/solution-04.md index 73842bfe1..350dcc240 100644 --- a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-4/solution.md +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-04/solution-04.md @@ -1,8 +1,8 @@ # Walkthrough Challenge 4 - Microsoft Defender for Cloud integration with Azure Arc -Duration: 30 minutes +[Previous Challenge Solution](../challenge-03/solution-03.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-05/solution-05.md) -[Previous Challenge Solution](../challenge-3/solution.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-5/solution.md) +Duration: 30 minutes ## Prerequisites diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image2.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image2.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image2.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image3.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image3.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image3.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image4.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image4.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image4.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image5.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image5.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image5.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image6.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image6.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image6.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image7.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/img/image7.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/img/image7.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/solution.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/solution-05.md similarity index 94% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/solution.md rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/solution-05.md index 340889349..6ad9eb414 100644 --- a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-5/solution.md +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-05/solution-05.md @@ -1,8 +1,8 @@ # Walkthrough Challenge 5 - Best Practices Assessment for Windows Server -Duration: 20 minutes +[Previous Challenge Solution](../challenge-04/solution-04.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-06/solution-06.md) -[Previous Challenge Solution](../challenge-4/solution.md) - **[Home](../../Readme.md)** +Duration: 20 minutes ## Prerequisites diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image1.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image1.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image1.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image2.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image2.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image2.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image3.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image3.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image3.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image4.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image4.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image4.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image5.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image5.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image5.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image6.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/img/image6.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/img/image6.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/solution.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/solution-06.md similarity index 93% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/solution.md rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/solution-06.md index 770d23d64..0bbc87f05 100644 --- a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-6/solution.md +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-06/solution-06.md @@ -1,8 +1,8 @@ # Walkthrough Challenge 6 - Activate ESU for Windows Server 2012 R2 -Duration: 15 minutes +[Previous Challenge Solution](../challenge-05/solution-05.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-07/solution-07.md) -[Previous Challenge Solution](../challenge-5/solution.md) - **[Home](../../Readme.md)** +Duration: 15 minutes ## Task 1: Create a Windows Server ESU license diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignment.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignment.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignment.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignment.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentBasics.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentBasics.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentBasics.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentBasics.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentMessage.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentMessage.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentMessage.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentMessage.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentParameters.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentParameters.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentParameters.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentParameters.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentRemediation.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentRemediation.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentRemediation.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentRemediation.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentReview.png b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentReview.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/img/PolicyAssignmentReview.png rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/img/PolicyAssignmentReview.png diff --git a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/solution.md b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/solution-07.md similarity index 98% rename from 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/solution.md rename to 03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/solution-07.md index fafd834ac..41412fdff 100644 --- a/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-7/solution.md +++ b/03-Azure/01-03-Infrastructure/02_Hybrid_Azure_Arc_Servers/walkthrough/challenge-07/solution-07.md @@ -1,8 +1,8 @@ # Walkthrough Challenge 7 - Azure Automanage Machine Configuration -Duration: 30 minutes +[Previous Challenge Solution](../challenge-06/solution-06.md) - **[Home](../../Readme.md)** -[Previous Challenge Solution](../challenge-4/solution.md) - **[Home](../../Readme.md)** +Duration: 30 minutes ## Action 1: Create an Azure Policy Guest Configuration for your Azure Arc VMs diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/MODULES/STORAGE/storage.bicep b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/MODULES/STORAGE/storage.bicep index 66a7bf800..a6ae71344 100644 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/MODULES/STORAGE/storage.bicep +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/MODULES/STORAGE/storage.bicep @@ -24,7 +24,7 @@ resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = { name: toLower(Name) // Storage account names must be lowercase location: location sku: { - name: 'Standard_LRS' + name: 'Standard_GRS' } kind: 'StorageV2' properties: { diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/deploy.json b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/deploy.json index 3f9ac2163..7ae4f4669 100644 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/deploy.json +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/deploy.json @@ -568,7 +568,7 @@ "name": "[toLower(variables('Name'))]", "location": "[variables('location')]", "sku": { - "name": "Standard_LRS" + "name": "Standard_GRS" }, "kind": "StorageV2", "properties": { diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/main.parameters.json b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/main.parameters.json index 2bf43c2dc..79dd5aaac 100644 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/main.parameters.json +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/main.parameters.json @@ -3,7 +3,7 @@ "contentVersion": "1.0.0.0", "parameters": { "parDeploymentPrefix": { - "value": "mh-" + "value": "mh" }, "sourceLocation": { "value": "germanywestcentral" diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/validate-prerequisites.sh b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/validate-prerequisites.sh new file mode 100644 index 000000000..0887553d4 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1/validate-prerequisites.sh @@ -0,0 +1,272 @@ +#!/bin/bash + +# Azure BCDR Workshop - Prerequisites Validation Script +# This script validates Azure CLI installation, authentication, permissions, and resource provider registration +# required for deploying the BCDR workshop infrastructure. + +# Color codes for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Counters for validation results +ERRORS=0 +WARNINGS=0 +SUCCESS=0 + +# Required resource providers for the BCDR workshop +REQUIRED_PROVIDERS=( + "Microsoft.Compute" + "Microsoft.Network" + "Microsoft.Storage" + "Microsoft.RecoveryServices" + "Microsoft.DataProtection" + "Microsoft.Automation" + "Microsoft.OperationalInsights" + "Microsoft.KeyVault" + "Microsoft.SqlVirtualMachine" + "Microsoft.Resources" +) + +# Required permissions (RBAC roles) +REQUIRED_ROLES=("Owner") + +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Azure BCDR Workshop Prerequisites Check${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +# Function to print success message +print_success() { + echo -e "${GREEN}βœ“${NC} $1" + ((SUCCESS++)) +} + +# Function to print error message +print_error() { + echo -e "${RED}βœ—${NC} $1" + ((ERRORS++)) +} + +# Function to print warning message +print_warning() { + echo -e "${YELLOW}⚠${NC} $1" + ((WARNINGS++)) +} + +# Function to print info message +print_info() { + echo -e "${BLUE}β„Ή${NC} $1" +} + +# Check 1: Azure CLI Installation +echo -e "\n${BLUE}[1/5]${NC} Checking Azure CLI installation..." +if command -v az &> /dev/null; then + AZ_VERSION=$(az version --query '"azure-cli"' -o tsv 2>/dev/null || echo "unknown") + print_success "Azure CLI is installed (version: $AZ_VERSION)" +else + print_error "Azure CLI is not installed" + print_info "Install from: https://docs.microsoft.com/cli/azure/install-azure-cli" + # Skip remaining checks if Azure CLI is not available + echo -e "\n${BLUE}========================================${NC}" + echo -e "${BLUE}Validation Summary${NC}" + echo -e "${BLUE}========================================${NC}" + echo -e "${GREEN}Successful checks: $SUCCESS${NC}" + echo -e "${YELLOW}Warnings: $WARNINGS${NC}" + echo -e "${RED}Errors: $ERRORS${NC}" + echo -e "\n${RED}βœ— Cannot proceed without Azure CLI installed.${NC}" + return 0 2>/dev/null || true +fi + +# Check 2: Azure CLI Login Status +echo -e "\n${BLUE}[2/5]${NC} Checking Azure authentication..." +if az account show &> /dev/null; then + ACCOUNT_NAME=$(az account show --query "user.name" -o tsv 2>/dev/null || echo "unknown") + print_success "Authenticated to Azure" + print_info "User: $ACCOUNT_NAME" + + # Get all subscriptions + echo -e "\n${BLUE}Fetching available subscriptions...${NC}" + SUBSCRIPTIONS=$(az account list --query "[].{Name:name, Id:id, State:state}" -o tsv 2>/dev/null) + + if [ -z "$SUBSCRIPTIONS" ]; then + print_error "No subscriptions found" + echo -e "\n${BLUE}========================================${NC}" + echo -e "${BLUE}Validation Summary${NC}" + echo -e "${BLUE}========================================${NC}" + echo -e "${GREEN}Successful checks: $SUCCESS${NC}" + echo -e "${YELLOW}Warnings: $WARNINGS${NC}" + echo -e "${RED}Errors: $ERRORS${NC}" + echo -e "\n${RED}βœ— Cannot proceed without an active subscription.${NC}" + return 0 2>/dev/null || true + fi + + # Count subscriptions + SUB_COUNT=$(echo "$SUBSCRIPTIONS" | wc -l) + + if [ "$SUB_COUNT" -eq 1 ]; then + # Only one subscription, use it automatically + SUBSCRIPTION_NAME=$(echo "$SUBSCRIPTIONS" | awk '{print $1}') + SUBSCRIPTION_ID=$(echo "$SUBSCRIPTIONS" | awk '{print $2}') + print_info "Using subscription: $SUBSCRIPTION_NAME" + else + # Multiple subscriptions, let user choose + echo -e "\n${YELLOW}Multiple subscriptions found:${NC}" + echo "$SUBSCRIPTIONS" | nl -w2 -s'. ' + echo "" + + # Prompt for selection + while true; do + read -p "Select subscription number (1-$SUB_COUNT): " selection + + if [[ "$selection" =~ ^[0-9]+$ ]] && [ "$selection" -ge 1 ] && [ "$selection" -le "$SUB_COUNT" ]; then + SELECTED_LINE=$(echo "$SUBSCRIPTIONS" | sed -n "${selection}p") + SUBSCRIPTION_NAME=$(echo "$SELECTED_LINE" | awk '{print $1}') + SUBSCRIPTION_ID=$(echo "$SELECTED_LINE" | awk '{print $2}') + + # Set the selected subscription as active + az account set --subscription "$SUBSCRIPTION_ID" &> /dev/null + print_success "Selected subscription: $SUBSCRIPTION_NAME" + break + else + echo -e "${RED}Invalid selection. Please enter a number between 1 and $SUB_COUNT${NC}" + fi + done + fi + + TENANT_ID=$(az account show --query "tenantId" -o tsv 2>/dev/null || echo "unknown") + print_info "Subscription ID: $SUBSCRIPTION_ID" + print_info "Tenant ID: $TENANT_ID" +else + print_error "Not authenticated to Azure" + print_info "Run 'az login' to authenticate" + # Skip remaining checks if not authenticated + echo -e "\n${BLUE}========================================${NC}" + echo -e "${BLUE}Validation Summary${NC}" + echo -e "${BLUE}========================================${NC}" + echo -e "${GREEN}Successful checks: $SUCCESS${NC}" + echo -e "${YELLOW}Warnings: $WARNINGS${NC}" + echo -e "${RED}Errors: $ERRORS${NC}" + echo -e "\n${RED}βœ— Cannot proceed without Azure authentication.${NC}" + return 0 2>/dev/null || true +fi + +# Check 3: RBAC Permissions +echo -e "\n${BLUE}[3/5]${NC} Checking RBAC permissions (including inherited roles)..." +print_info "Retrieving role assignments (this may take a moment)..." + +# Query role assignments without scope filter to include inherited roles from management groups +ROLE_ASSIGNMENTS=$(az role assignment list --all --query "[?scope=='/subscriptions/$SUBSCRIPTION_ID' || contains(scope, '/providers/Microsoft.Management/managementGroups/')].roleDefinitionName" -o tsv 2>/dev/null || true) + +if [ -z "$ROLE_ASSIGNMENTS" ]; then + # Try alternative method: check what user can do on the subscription + CAN_READ=$(az role assignment list --subscription "$SUBSCRIPTION_ID" --query "[0]" -o tsv 2>/dev/null || true) + if [ -n "$CAN_READ" ]; then + # User has some access, likely has inherited permissions + print_warning "Unable to enumerate all role assignments (inherited roles may not be visible)" + print_info "Verifying deployment permissions through capability check..." + + # Try to validate if user can create resource groups (requires Contributor or Owner) + TEST_RG_NAME="test-permissions-check-$$" + if az group create --name "$TEST_RG_NAME" --location "westeurope" --tags "temporary=true" &> /dev/null; then + az group delete --name "$TEST_RG_NAME" --yes --no-wait &> /dev/null || true + print_success "Has sufficient permissions (verified through capability check)" + HAS_REQUIRED_ROLE=true + else + print_error "Insufficient permissions to create resource groups" + print_info "Owner role at subscription level (or inherited from management group) is required" + ((ERRORS++)) + HAS_REQUIRED_ROLE=false + fi + else + print_error "Unable to verify role assignments" + ((ERRORS++)) + HAS_REQUIRED_ROLE=false + fi +else + HAS_REQUIRED_ROLE=false + if [ -n "$ROLE_ASSIGNMENTS" ]; then + while IFS= read -r role; do + for required_role in "${REQUIRED_ROLES[@]}"; do + if [ "$role" = "$required_role" ]; then + print_success "Has required role: $role" + HAS_REQUIRED_ROLE=true + break 2 + fi + done + done <<< "$ROLE_ASSIGNMENTS" + fi + + if [ "$HAS_REQUIRED_ROLE" = false ]; then + print_error "Missing required RBAC role at subscription level" + print_info "Required roles: ${REQUIRED_ROLES[*]}" + print_info "Your roles: $ROLE_ASSIGNMENTS" + print_info "Contact your Azure administrator to assign the appropriate role" + ((ERRORS++)) + fi +fi + +# Check 4: Resource Provider Registration +echo -e "\n${BLUE}[4/5]${NC} Checking resource provider registration..." +UNREGISTERED_PROVIDERS=() + +for provider in "${REQUIRED_PROVIDERS[@]}"; do + PROVIDER_STATE=$(az provider show --namespace "$provider" --query "registrationState" -o tsv 2>/dev/null || echo "Unknown") + + if [ "$PROVIDER_STATE" = "Registered" ]; then + print_success "$provider is registered" + elif [ "$PROVIDER_STATE" = "Registering" ]; then + print_warning "$provider is currently registering (may take a few minutes)" + UNREGISTERED_PROVIDERS+=("$provider") + else + print_error "$provider is not registered (Status: $PROVIDER_STATE)" + UNREGISTERED_PROVIDERS+=("$provider") + fi +done + +# Check 5: Resource Provider Registration Capability +echo -e "\n${BLUE}[5/5]${NC} Checking ability to register resource providers..." +if [ ${#UNREGISTERED_PROVIDERS[@]} -gt 0 ]; then + print_warning "The following providers need to be registered: ${UNREGISTERED_PROVIDERS[*]}" + print_info "Attempting to register providers (requires appropriate permissions)..." + + REGISTRATION_FAILED=false + for provider in "${UNREGISTERED_PROVIDERS[@]}"; do + echo -n "Registering $provider... " + if az provider register --namespace "$provider" &> /dev/null; then + print_success "Successfully registered $provider" + ((ERRORS--)) + else + print_error "Failed to register $provider (insufficient permissions or other error)" + REGISTRATION_FAILED=true + fi + done + + if [ "$REGISTRATION_FAILED" = true ]; then + print_info "Contact your Azure administrator to register the required providers" + print_info "Or run: az provider register --namespace --wait" + fi +else + print_success "All required resource providers are registered" +fi + +# Summary +echo -e "\n${BLUE}========================================${NC}" +echo -e "${BLUE}Validation Summary${NC}" +echo -e "${BLUE}========================================${NC}" +echo -e "${GREEN}Successful checks: $SUCCESS${NC}" +echo -e "${YELLOW}Warnings: $WARNINGS${NC}" +echo -e "${RED}Errors: $ERRORS${NC}" + +if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then + echo -e "\n${GREEN}βœ“ All prerequisites are met! You can proceed with the deployment.${NC}" + echo -e "\n${BLUE}To deploy the infrastructure, run:${NC}" + echo -e " az deployment sub create --location --template-file deploy.json --parameters @main.parameters.json" +elif [ $ERRORS -eq 0 ] && [ $WARNINGS -gt 0 ]; then + echo -e "\n${YELLOW}⚠ Prerequisites check completed with warnings.${NC}" + echo -e "${YELLOW}Review the warnings above. You may proceed with caution.${NC}" +else + echo -e "\n${RED}βœ— Prerequisites check failed. Please resolve the errors above before proceeding.${NC}" +fi diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App2/setup.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App2/setup.md deleted file mode 100644 index 47a91a1d2..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App2/setup.md +++ /dev/null @@ -1,52 +0,0 @@ -# πŸš€ Deploying the Lab environment and an N-tier App - -## Introduction -This guide will walk you through deploying a ready-to-go N-tier application and additional resources you need for this lab using the Awesome Azure Developer CLI and Azure Copilot. -We will use Awesome Azure Developer CLI to deploy a ready-to-go N-tier application. Azure Copilot will help us with what to do and will answer our questions, if we have any. - -## Prerequisites -- πŸ”‘ Azure Subscription -- πŸ› οΈ Azure Developer CLI installed (pre-installed in CloudShell - no further action needed) -- πŸ“š Basic knowledge of Azure services - -## Lab Environment & the N-tier Application - -To experiment with Azure Monitor & BCDR Solutions and learn how to use it, a lab environment is provided. This includes a sample application, several virtual machines and other Azure services to generate telemetry data. - -### N-tier Application - -![System Architecture Overview](../../img/resources0.png) - -## Guide -By following this guide, you have successfully deployed a ready-to-go N-tier application using the Awesome Azure Developer CLI and Azure Copilot. - -## References -- [πŸ“„ Azure Developer CLI Documentation](https://docs.microsoft.com/en-us/azure/developer/cli/) -- [πŸ“„ Azure Copilot Documentation](https://docs.microsoft.com/en-us/azure/copilot/) - -# N-tier Application Deployment - -## 1. Initialize the Templates for the N-tier Application -Use the Awesome Azure Developer CLI to initialize the environment. - -```bash -azd auth login -``` - -```bash -azd init --template Azure-Samples/todo-python-mongo-swa-func -``` - -## 2. Deploy the N-tier Application -Use the Awesome Azure Developer CLI to deploy the N-tier application. - -```bash -azd up -``` - -Use the Awesome Azure Developer CLI to check the status of your deployment. - -## 3. Access the Application -Retrieve the URL of the deployed application and open it in your web browser. - -**| [< Microhack Overview](../Readme.md) | [Challenge 6 >](../../challenges/06_challenge.md) |** \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/app.bicepparam b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/app.bicepparam deleted file mode 100644 index e5a34ee4c..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/app.bicepparam +++ /dev/null @@ -1,36 +0,0 @@ -using 'br/public:avm/res/compute/virtual-machine:0.12.0' - -// Required parameters -param adminUsername = 'vmAdminUser' -param imageReference = { - offer: 'dsvm-win-2022' - publisher: 'microsoft-dsvm' - sku: 'winserver-2022' - version: 'latest' -} -param name = 'app3vm_datascience' - -param nicConfigurations = [ - { - ipConfigurations: [ - { - name: 'ipconfig01' - subnetResourceId: '' - } - ] - nicSuffix: '-nic-01' - } -] -param osDisk = { - caching: 'ReadWrite' - diskSizeGB: 128 - managedDisk: { - storageAccountType: 'Premium_LRS' - } -} -param osType = 'Windows' -param vmSize = 'Standard_D2s_v3' -param zone = 1 -// Non-required parameters -param adminPassword = '' -param location = '' diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/deploy.bicep b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/deploy.bicep deleted file mode 100644 index c83fab8f8..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/deploy.bicep +++ /dev/null @@ -1,66 +0,0 @@ -@secure() -param adminPassword string - -module virtualNetwork 'br/public:avm/res/network/virtual-network:0.5.2' = { - name: 'virtualNetworkDeployment' - params: { - // Required parameters - addressPrefixes: [ - '10.0.0.0/21' - ] - name: 'nvnipv6001' - // Non-required parameters - location: resourceGroup().location - subnets: [ - { - addressPrefixes: [ - '10.0.0.0/24' - ] - name: 'snet-vm' - } - ] - } -} - - -module virtualMachine 'br/public:avm/res/compute/virtual-machine:0.12.0' = { - name: 'virtualMachineDeployment' - params: { - // Required parameters - adminUsername: 'localAdminUser' - imageReference: { - offer: 'dsvm-win-2022' - publisher: 'microsoft-dsvm' - sku: 'winserver-2022' - version: 'latest' - } - name: 'app3vm_datascience' - nicConfigurations: [ - { - ipConfigurations: [ - { - name: 'ipconfig01' - subnetResourceId: virtualNetwork.outputs.subnetResourceIds[0] - } - ] - nicSuffix: '-nic-01' - } - ] - osDisk: { - caching: 'ReadWrite' - diskSizeGB: 128 - managedDisk: { - storageAccountType: 'Premium_LRS' - } - } - osType: 'Windows' - vmSize: 'Standard_D2s_v3' - zone: 0 - // Non-required parameters - adminPassword: adminPassword - location: resourceGroup().location - } - dependsOn: [ - virtualNetwork - ] -} diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/parameters.json b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/parameters.json deleted file mode 100644 index 290546a79..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/parameters.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "location": { - "value": "germanywestcentral" - }, - "networkInterfaceName1": { - "value": "my-vm55_z1" - }, - "networkSecurityGroupName": { - "value": "my-VM-nsg" - }, - "networkSecurityGroupRules": { - "value": [ - { - "name": "RDP", - "properties": { - "priority": 1010, - "protocol": "TCP", - "access": "Allow", - "direction": "Inbound", - "sourceApplicationSecurityGroups": [], - "destinationApplicationSecurityGroups": [], - "sourceAddressPrefix": "*", - "sourcePortRange": "*", - "destinationAddressPrefix": "*", - "destinationPortRange": "3389" - } - }, - { - "name": "SSH", - "properties": { - "priority": 1020, - "protocol": "TCP", - "access": "Allow", - "direction": "Inbound", - "sourceApplicationSecurityGroups": [], - "destinationApplicationSecurityGroups": [], - "sourceAddressPrefix": "*", - "sourcePortRange": "*", - "destinationAddressPrefix": "*", - "destinationPortRange": "22" - } - } - ] - }, - "subnetName": { - "value": "default" - }, - "virtualNetworkName": { - "value": "my-VM-vnet" - }, - "addressPrefixes": { - "value": [ - "10.2.0.0/16" - ] - }, - "subnets": { - "value": [ - { - "name": "default", - "properties": { - "addressPrefix": "10.2.0.0/24" - } - } - ] - }, - "publicIpAddressName1": { - "value": "my-VM-ip" - }, - "publicIpAddressType": { - "value": "Static" - }, - "publicIpAddressSku": { - "value": "Standard" - }, - "pipDeleteOption": { - "value": "Detach" - }, - "virtualMachineName": { - "value": "my-VM" - }, - "virtualMachineName1": { - "value": "my-VM" - }, - "virtualMachineComputerName1": { - "value": "my-VM" - }, - "virtualMachineRG": { - "value": "BCDR-Data-Science" - }, - "osDiskType": { - "value": "Premium_LRS" - }, - "osDiskDeleteOption": { - "value": "Delete" - }, - "virtualMachineSize": { - "value": "Standard_D8s_v3" - }, - "nicDeleteOption": { - "value": "Detach" - }, - "hibernationEnabled": { - "value": false - }, - "adminUsername": { - "value": "Username" - }, - "adminPassword": { - "value": "" - }, - "patchMode": { - "value": "AutomaticByOS" - }, - "enablePeriodicAssessment": { - "value": "ImageDefault" - }, - "enableHotpatching": { - "value": false - }, - "virtualMachine1Zone": { - "value": "1" - } - } -} diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/setup.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/setup.md deleted file mode 100644 index 0c4dfb4fb..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/setup.md +++ /dev/null @@ -1,124 +0,0 @@ -### Actions - -* Task 1: Deploy a Windows Server 2022 VM in Germany West Central Resource Group. Please use the "Data Science Virtual Machine - Windows 2022" image from the market place. -> **Note:** The 'Data Science Virtual Machine (DSVM)' is a 'Windows Server 2022 with Containers' VM that has several popular tools for data exploration, analysis, modeling & development pre installed. -> You will to use Microsoft SQL Server Management Studio to connect to the database and Storage Explorer to the storage Account. -* Task 2: Deploy a Ubuntu Server VM in Sweden Central Resource Group. -* Task 3: Deploy a azure sql database server with a database containing the sample data of AdventureWorksLT. -* Task 4: From the Data Science Windows Server VM, connect to the database and to the storage account. -* Task 5: Create a blob container and upload a sample file to it. -* Task 6: Delete a file in and restore - -
-πŸ’‘ How-to: Deploy a Ubuntu Server VM in Azure Region Sweden Central -
- -
- -### Task 1: Create a new Virtual Machine in Azure Region Germany West Central - -As a first step, we will create a VM (Name: ds-vm-win-serverl) in Azure in the resource group "mh-bcdr-gwc-rg" that we created in the last challenge. This should be a Data Science Virtual Machine - Windows 2022 using a VM Type of Standard DS3v2. - -### Choose OS -![image](./img/001.png) - -### Configure Details - Basics -![image](./img/002.png) - -### Configure Details - Basics (option 2) -![image](./img/003.png) - -Please don't forget to put the VM into the public network and open up Port 3389 to connect to it (or alternatively use Azure Bastion to access it). -### Enable RDP Port -![image](./img/004.png) - -### Review deployed VM -![image](./img/005.png) -![image](./img/005a.png) - -### Task 2: Deploy a Azure SQL Database Server with a database containing the sample data of AdventureWorksLT in Azure Region Germany West Central - -### Choose SQL Database -![image](./img/011.png) - -### Configure Details - Basics -![image](./img/012.png) - -### Configure Details - Basics: Create SQL Database Server -![image](./img/012a.png) - -### Configure Details - Networking -![image](./img/012b.png) - -### Configure Details - Additional settings -Use existing data -> select the sample data of AdventureWorksLT -![image](./img/013.png) - -### Review + Create - -> **Note:** "It's important to ensure that there are no connection blockers preventing access to the SQL Database. If necessary, you may need to set up a firewall rule that allows the IP address of the virtual machine to connect. -![image](./img/FWrule.png) - -### Task 3: From the Data Science Windows Server VM, connect to the database and to the storage account. - -### Connect to deployed "Data Science Windows Server VM" -wait until the pre-configured VM to be installed. -![image](./img/015.png) - -### Open SQL Server Management Studio -![image](./img/016.png) - -### Put your DB Server name and connect to your Database Server via the preferred Authentication method. -![image](./img/017.png) - -### The Database Server is connected! -![image](./img/018.png) - -### Task 5: Create a blob container and upload a sample file to it -### Go to the storage account in mh-bcdr-gwc-rg Resource Group. -Under the tab Containers: - -![image](./img/019.png) - -### Create a Shared access signature (SAS). -![image](./img/020.png) - -### Connect to the "Data Science Windows Server VM" and open "Microsoft Azure Storage Explorer" -Choose Storage account or service - -![image](./img/022.png) - -### Select Shared access signature URL (SAS) as connection method. -![image](./img/023.png) - -### Put the Shared access signature (SAS), which we created in the previous task. -![image](./img/024.png) - -### Review Summary + Connect -![image](./img/025.png) - -### Your storage account is connected! -![image](./img/026.png) - -### Now, search for the container that you created in the previous task -![image](./img/027.png) - -### Upload a sample file -![image](./img/028.png) -![image](./img/029.png) - -### Task 4: Trigger a restore for the blob - -### Delete a file in your blob container - -### Go to the backup vault and select the backup instance -![image](./img/mh-ch2-screenshot-710.png) -![image](./img/mh-ch2-screenshot-711.png) - -### Restore the blob container -![image](./img/mh-ch2-screenshot-712.png) -![image](./img/mh-ch2-screenshot-713.png) -![image](./img/mh-ch2-screenshot-714.png) -![image](./img/mh-ch2-screenshot-715.png) -![image](./img/mh-ch2-screenshot-716.png) -![image](./img/mh-ch2-screenshot-717.png) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/template.json b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/template.json deleted file mode 100644 index 10915b5c5..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App3/template.json +++ /dev/null @@ -1,235 +0,0 @@ -{ - "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "location": { - "type": "string" - }, - "networkInterfaceName1": { - "type": "string" - }, - "networkSecurityGroupName": { - "type": "string" - }, - "networkSecurityGroupRules": { - "type": "array" - }, - "subnetName": { - "type": "string" - }, - "virtualNetworkName": { - "type": "string" - }, - "addressPrefixes": { - "type": "array" - }, - "subnets": { - "type": "array" - }, - "publicIpAddressName1": { - "type": "string" - }, - "publicIpAddressType": { - "type": "string" - }, - "publicIpAddressSku": { - "type": "string" - }, - "pipDeleteOption": { - "type": "string" - }, - "virtualMachineName": { - "type": "string" - }, - "virtualMachineName1": { - "type": "string" - }, - "virtualMachineComputerName1": { - "type": "string" - }, - "virtualMachineRG": { - "type": "string" - }, - "osDiskType": { - "type": "string" - }, - "osDiskDeleteOption": { - "type": "string" - }, - "virtualMachineSize": { - "type": "string" - }, - "nicDeleteOption": { - "type": "string" - }, - "hibernationEnabled": { - "type": "bool" - }, - "adminUsername": { - "type": "string" - }, - "adminPassword": { - "type": "secureString" - }, - "patchMode": { - "type": "string" - }, - "enablePeriodicAssessment": { - "type": "string" - }, - "enableHotpatching": { - "type": "bool" - }, - "virtualMachine1Zone": { - "type": "string" - } - }, - "variables": { - "nsgId": "[resourceId(resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroupName'))]", - "vnetName": "[parameters('virtualNetworkName')]", - "vnetId": "[resourceId(resourceGroup().name,'Microsoft.Network/virtualNetworks', parameters('virtualNetworkName'))]", - "subnetRef": "[concat(variables('vnetId'), '/subnets/', parameters('subnetName'))]" - }, - "resources": [ - { - "name": "[parameters('networkInterfaceName1')]", - "type": "Microsoft.Network/networkInterfaces", - "apiVersion": "2022-11-01", - "location": "[parameters('location')]", - "dependsOn": [ - "[concat('Microsoft.Network/networkSecurityGroups/', parameters('networkSecurityGroupName'))]", - "[concat('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]", - "[concat('Microsoft.Network/publicIpAddresses/', parameters('publicIpAddressName1'))]" - ], - "properties": { - "ipConfigurations": [ - { - "name": "ipconfig1", - "properties": { - "subnet": { - "id": "[variables('subnetRef')]" - }, - "privateIPAllocationMethod": "Dynamic", - "publicIpAddress": { - "id": "[resourceId(resourceGroup().name, 'Microsoft.Network/publicIpAddresses', parameters('publicIpAddressName1'))]", - "properties": { - "deleteOption": "[parameters('pipDeleteOption')]" - } - } - } - } - ], - "networkSecurityGroup": { - "id": "[variables('nsgId')]" - } - } - }, - { - "name": "[parameters('networkSecurityGroupName')]", - "type": "Microsoft.Network/networkSecurityGroups", - "apiVersion": "2020-05-01", - "location": "[parameters('location')]", - "properties": { - "securityRules": "[parameters('networkSecurityGroupRules')]" - } - }, - { - "name": "[parameters('virtualNetworkName')]", - "type": "Microsoft.Network/virtualNetworks", - "apiVersion": "2024-01-01", - "location": "[parameters('location')]", - "properties": { - "addressSpace": { - "addressPrefixes": "[parameters('addressPrefixes')]" - }, - "subnets": "[parameters('subnets')]" - } - }, - { - "name": "[parameters('publicIpAddressName1')]", - "type": "Microsoft.Network/publicIpAddresses", - "apiVersion": "2020-08-01", - "location": "[parameters('location')]", - "properties": { - "publicIpAllocationMethod": "[parameters('publicIpAddressType')]" - }, - "sku": { - "name": "[parameters('publicIpAddressSku')]" - }, - "zones": [ - "[parameters('virtualMachine1Zone')]" - ] - }, - { - "name": "[parameters('virtualMachineName1')]", - "type": "Microsoft.Compute/virtualMachines", - "apiVersion": "2024-03-01", - "location": "[parameters('location')]", - "dependsOn": [ - "[concat('Microsoft.Network/networkInterfaces/', parameters('networkInterfaceName1'))]" - ], - "properties": { - "hardwareProfile": { - "vmSize": "[parameters('virtualMachineSize')]" - }, - "storageProfile": { - "osDisk": { - "createOption": "fromImage", - "managedDisk": { - "storageAccountType": "[parameters('osDiskType')]" - }, - "deleteOption": "[parameters('osDiskDeleteOption')]" - }, - "imageReference": { - "publisher": "microsoft-dsvm", - "offer": "dsvm-win-2022", - "sku": "winserver-2022", - "version": "latest" - } - }, - "networkProfile": { - "networkInterfaces": [ - { - "id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaceName1'))]", - "properties": { - "deleteOption": "[parameters('nicDeleteOption')]" - } - } - ] - }, - "securityProfile": {}, - "additionalCapabilities": { - "hibernationEnabled": false - }, - "osProfile": { - "computerName": "[parameters('virtualMachineComputerName1')]", - "adminUsername": "[parameters('adminUsername')]", - "adminPassword": "[parameters('adminPassword')]", - "windowsConfiguration": { - "enableAutomaticUpdates": true, - "provisionVmAgent": true, - "patchSettings": { - "patchMode": "[parameters('patchMode')]", - "assessmentMode": "[parameters('enablePeriodicAssessment')]", - "enableHotpatching": "[parameters('enableHotpatching')]" - } - } - }, - "diagnosticsProfile": { - "bootDiagnostics": { - "enabled": true - } - } - }, - "zones": [ - "[parameters('virtualMachine1Zone')]" - ] - } - ], - "outputs": { - "adminUsername": { - "type": "string", - "value": "[parameters('adminUsername')]" - } - } -} \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Readme.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Readme.md index 074222411..ce32e74e1 100644 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Readme.md +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Readme.md @@ -7,15 +7,6 @@ - [**MicroHack context**](#microhack-context) - [**MicroHack Challenges**](#microhack-challenges) - [General Prerequisites](#general-prerequisites) - - [Challenge 0 - Understand the Disaster Recovery terms and define a strategy](#contoso-ltd---business-continuity-and-disaster-recovery-bcdr-strategy) - - [Challenge 1 - Setup and landing zone preparation](./challenges/01_challenge.md) - - [Challenge 2 - Regional Protection and Disaster Recovery (DR)](./challenges/02_challenge.md) - - [Challenge 2.1 - Protect in Azure - Backup / Restore](./challenges/02_challenge.md#challenge-21---protect-in-azure---backup--restore) - - [Challenge 2.2 - Protect in Azure with Disaster Recover (DR) within an Azure Region](./challenges/02_challenge.md#challenge-22---protect-in-azure-with-disaster-recover-dr-within-an-azure-region) - - [Challenge 3 - Protect in Azure with Disaster Recovery (Inter-regional)](./challenges/03_challenge.md) - - [Challenge 4 - Protect your Azure PaaS with Disaster Recovery](./challenges/04_challenge.md) - - [Challenge 5 - Failback to the Primary Region (Germany West Central)](./challenges/05_challenge.md) - - [Extra Challenge - Monitor & Protect your Azure PaaS (Azure SQL Database)](./challenges/06_challenge.md) - [**Contributors**](#contributors) ## MicroHack introduction @@ -82,69 +73,36 @@ In this section, you will: - [πŸ“„ Microsoft Copilot in Azure - Documentation](https://docs.microsoft.com/en-us/azure/copilot/) -## Understand the Disaster Recovery (DR) terms and define a DR strategy - -# Contoso Ltd - Business Continuity and Disaster Recovery (BCDR) Strategy - -## Background -Contoso Ltd is a global company that relies on advanced technology to manage its operations efficiently. Their business applications, all hosted in the Azure cloud, are crucial to their daily functions and overall success. These applications power a wide range of essential business processes: -- **App 1:** Fabric Robot Automation -- **App 2:** Customer Help Desk Services -- **App 3:** Archive Service - -Leaders at Contoso Ltd understand that any downtime can result in significant financial losses and operational disruptions. Therefore, the company has mandated a thorough review of its Business Continuity and Disaster Recovery (BCDR) strategies to strike a balance between business continuity, customer satisfaction, and operational costs. The goal is to design and implement recovery plans that can swiftly restore services and minimize downtime in the event of unforeseen disasters. - -## Scenario Overview -A natural disaster struck the region hosting Contoso applications on Azure one Friday evening, causing outages in many services and leading to a cascading failure of all Contoso applications. The sudden disruption impacted essential business functions, leaving the company to grapple with significant financial losses and operational chaos. Customers and stakeholders were left in a state of uncertainty as they awaited updates on service restoration. The IT team faced immense pressure to rapidly deploy recovery strategies to minimize downtime, restore critical operations, and ensure that such an incident would not recur in the future. - -Participants must design and implement recovery strategies to meet business targets while considering costs for high availability. - -## Application Overview -| Application | Business Function | Criticality | SLA | RTO | RPO | Downtime Cost | -|-------------|-------------------|-------------|-----|-----|-----|---------------| -| App1 | Fabric Robot Automation | Critical | 99.995% | 1 hour | 10 minutes | $50,000/hour | -| App2 | Customer Help Desk Services | High | 99.95% | 2 hours | 15 minutes | $25,000/hour | -| App3 | Archive Service | Medium | 99.9% | 6 hours | 4 hours | $10,000/hour | - -## Recovery Costs for High Availability -| Application | Cost of RTO Compliance | Cost of RPO Compliance | Cost of SLA Compliance | Fully Highly Available Cost | -|-------------|------------------------|------------------------|------------------------|-----------------------------| -| App1 | $100,000 | $50,000 | $75,000 | $200,000 | -| App2 | $75,000 | $35,000 | $50,000 | $125,000 | -| App3 | $50,000 | $20,000 | $25,000 | $75,000 | - -## Challenge Objective -### Actions -Participants must: -1. Prioritize recovery of applications based on their criticality and business impact. -1. Decide which parts of the system to make highly available (HA) based on financial constraints. -1. Calculate the trade-offs between downtime costs and HA investments. - -### Success criteria - -* Understood the different terms from BCDR. -* Thought about the last successful disaster recovery of daily used applications. -* Identified the responsibilities and roles within your current company in respect to BCDR. -* Defined four levels of disaster recovery categories, including availability SLA. - -### Learning resources - -* [Business continuity and disaster recovery - Cloud Adoption Framework | Microsoft Learn](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-business-continuity-disaster-recovery) -* [Build high availability into your BCDR strategy - Azure Architecture Center | Microsoft Learn](https://learn.microsoft.com/azure/architecture/solution-ideas/articles/build-high-availability-into-your-bcdr-strategy) -* [Disaster recovery with Azure Site Recovery - Azure Solution Ideas | Microsoft Learn](https://learn.microsoft.com/azure/architecture/solution-ideas/articles/disaster-recovery-smb-azure-site-recovery) - -### High Availability vs. Disaster Recovery vs. Backup - -![HAvsDRvsBackup](./img/HAvsBackupvsDR.png) - ### Challenges -Let's get started with the **[challenges](./challenges/01_challenge.md)** and dive into the world of Azure! 🌐 +Let's get started with the **[challenges](./challenges/challenge-01.md)** and dive into the world of Azure! 🌐 By the end of this MicroHack, you'll be equipped with the knowledge and skills to design and implement effective Business Continuity and Disaster Recovery strategies using Azure services. Happy hacking! πŸš€ +- [Challenge 1 - Understand the Disaster Recovery (DR) terms and define a DR strategy](./challenges/challenge-01.md) +- [Challenge 2 - Prerequisites and Landing Zone Preparation](./challenges/challenge-02.md) +- [Challenge 3 - Regional Protection (Backup)](./challenges/challenge-03.md) +- [Challenge 4 - Regional Disaster Recovery (DR)](./challenges/challenge-04.md) +- [Challenge 5 - Disaster Recovery (DR) across Azure Regions](./challenges/challenge-05.md) +- [Challenge 6 - Restore Web Application and verify Azure Storage DR](./challenges/challenge-06.md) +- [Challenge 7 - Failback to the Primary Region (Germany West Central)](./challenges/challenge-07.md) +- [Optional: Challenge 8 - Monitoring and Alerting for BCDR Operations](./challenges/challenge-08.md) + + +### Solutions - Spoilerwarning + +- [Solution 1 - Understand the Disaster Recovery terms and define a strategy](./walkthrough/challenge-01/solution-01.md) +- [Solution 2 - Setup and landing zone preparation](./walkthrough/challenge-02/solution-02.md) +- [Solution 3 - Regional Protection and Disaster Recovery (DR)](./walkthrough/challenge-03/solution-03.md) + - [Solution 3.1 - Protect in Azure - Backup / Restore](./walkthrough/challenge-03/solution-03.md#challenge-31---protect-in-azure---backup--restore) + - [Solution 3.2 - Protect in Azure with Disaster Recover (DR) within an Azure Region](./walkthrough/challenge-03/solution-03.md#challenge-32---protect-in-azure-with-disaster-recover-dr-within-an-azure-region) +- [Solution 4 - Protect in Azure with Disaster Recovery (Inter-regional)](./walkthrough/challenge-04/solution-04.md) +- [Solution 5 - Protect your Azure PaaS with Disaster Recovery](./walkthrough/challenge-05/solution-05.md) +- [Solution 6 - Failback to the Primary Region (Germany West Central)](./walkthrough/challenge-06/solution-06.md) +- [Extra Solution - Monitor & Protect your Azure PaaS (Azure SQL Database)](./walkthrough/challenge-07/solution-07.md) + ### Azure Business Continuity Guide (ABC Guide) The Azure Business Continuity Guide provides a comprehensive set of recommendations to help customers define what BCDR looks like for their applications. diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/02_challenge.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/02_challenge.md deleted file mode 100644 index b533b0e84..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/02_challenge.md +++ /dev/null @@ -1,56 +0,0 @@ -## Challenge 2 - Regional Protection and Disaster Recovery (DR) - -### Goal 🎯 - -* Protect in Azure - **Backup / Restore** -* Protect in Azure with **Disaster Recover (DR)** within a Region - -In this challenge, you will learn how to back up and restore your Linux Virtual Machine using Azure's Recovery Services Vault. You will also practice simulating a regional failover between two datacenters to handle a regional failure, such as a datacenter outage. - -![Datacenter & Availability Zone](../img/AZs.png) - -## Actions - -### Challenge 2.1 - Protect in Azure - Backup / Restore -1. Enable Azure Backup for the Linux VM in the primary region. -2. Enable Azure Backup for Blobs -3. Restore a VM in Azure. - -> [!IMPORTANT] -> To enable backup for the storage account, you need to grant the Backup Vault appropriate **access permissions**. -> -> πŸ’‘ **Need help?** Refer to the [step-by-step guidance](../walkthrough/challenge-2/solution.md#enable-system-managed-identity-for-the-backup-vault-and-copy-the-mi-object-id) in the solution. - -### Challenge 2.2 - Protect in Azure with Disaster Recover (DR) within an Azure Region -4. Set up disaster recovery for the Linux VM in the primary region. -5. Simulate a failover from one part of the primary region to another part within the same region. - -> [!IMPORTANT] -> To enable disaster recovery (DR), you may need to grant the Recovery Services Vault appropriate **access permissions**. -> -> πŸ’‘ **Need help?** Refer to the [step-by-step guidance](../walkthrough/challenge-2/solution.md#enable-system-managed-identity-for-the-recovery-services-vault) in the solution. - -### Success Criteria βœ… - -- You have successfully set up Azure Backup Policies for both virtual machines. -- You have successfully restored a VM of your choice to Azure. -- You have successfully configured replication between two availability zones and simulated a failover between two datacenters using Azure Site Recovery. - -### πŸ“š Learning Resources - -- [Quickstart: Back up a VM with the Azure portal](https://learn.microsoft.com/en-us/azure/backup/quick-backup-vm-portal) -- [Apply a backup policy](https://learn.microsoft.com/en-us/azure/backup/quick-backup-vm-portal#apply-a-backup-policy) -- [Tutorial: Back up multiple VMs at scale](https://learn.microsoft.com/en-us/azure/backup/tutorial-backup-vm-at-scale) -- [Restore VMs from Azure Backup](https://learn.microsoft.com/en-us/azure/backup/backup-azure-arm-restore-vms) -- [Restore encrypted virtual machines](https://learn.microsoft.com/en-us/azure/backup/restore-azure-encrypted-virtual-machines) -- [Azure Blob Storage: Backup overview](https://learn.microsoft.com/en-us/azure/backup/blob-backup-overview) - -### Solution - Spoiler Warning ⚠️ - -For detailed steps, refer to the [Solution Steps](../walkthrough/challenge-2/solution.md). - ---- - -**[➑️ Next Challenge 3 - Protect in Azure with Disaster Recovery (Inter-regional)](./03_challenge.md)** - -**[⬅️ Previous Challenge 1 - Prerequisites and landing zone preparation](./01_challenge.md)** \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/03_challenge.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/03_challenge.md deleted file mode 100644 index 301a9cbe0..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/03_challenge.md +++ /dev/null @@ -1,42 +0,0 @@ -## Challenge 3 - Protect in Azure with Disaster Recovery (Inter-regional) - -## Prerequisites - -Please ensure that you successfully passed [challenge 2](./02_challenge.md) before continuing with this challenge. - -### Goal 🎯 - -In Challenge 3, you will learn how to protect Azure VMs with Azure Site Recovery, and how to enable replication to a secondary site. Additionally, you will successfully run test & production failovers from Germany West Central to Sweden Central, and fail back again from Sweden to Germany. - -### Actions - -* Task 1: Set up and enable disaster recovery with Azure Site Recovery and monitor the progress. -* Task 2: Perform a disaster recovery drill, create recovery plan and run a test failover. -* Task 3: Run a production failover from Germany West Central to Sweden Central region and failback again from Sweden to Germany. - -> [!IMPORTANT] -> To enable inter-regional disaster recovery (DR), you may need to grant the Recovery Services Vault appropriate **access permissions**. -> -> πŸ’‘ **Need help?** Refer to the [step-by-step guidance](../walkthrough/challenge-3/solution.md#enable-system-managed-identity-for-the-recovery-services-vault) in the solution. - -### Success Criteria βœ… - -* You enabled the replication for all related components of the web application to the Sweden Central region. -* You successfully initiated a test failover from Azure Region Germany West Central to Sweden Central with near-zero downtime. -* You successfully ran the production failover to the Sweden Central region. - -### πŸ“š Learning Resources - -* [Enable Replication](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-how-to-enable-replication) -* [Create Recovery Plans](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-create-recovery-plans) -* [Test Failover to Azure](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-test-failover-to-azure) - -### Solution - Spoiler Warning ⚠️ - -[Solution Steps](../walkthrough/challenge-3/solution.md) - ---- - -**[➑️ Next Challenge 4 - Protect your Azure PaaS with Disaster recovery](./04_challenge.md)** | - -**[⬅️ Previous Challenge 2 - Regional Protection and Disaster Recovery (DR)](./02_challenge.md)** \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/04_challenge.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/04_challenge.md deleted file mode 100644 index 311af78d4..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/04_challenge.md +++ /dev/null @@ -1,105 +0,0 @@ -## Challenge 4 - Protect your Azure PaaS with Disaster Recovery - -## Prerequisites - -Please ensure that you successfully passed [challenge 3](./03_challenge.md) before continuing with this challenge. - -### Goal 🎯 - -In this challenge, you will re-establish the connection to your web application from the failed-over region. You will then focus on implementing disaster recovery strategies for Azure storage accounts using replication. The primary objective is to ensure business continuity by protecting critical data stored in Azure storage accounts against potential disasters. - -### Actions -* Task 1: Re-establish your connection to the Web Application from the secondary region. - * Add your failed-over Virtual Machines in the secondary region to the backend pool of your Load Balancer. - * Test the connection to the Web Application. - * High Availability & SLA Discussion -* Disaster Recovery for Azure Storage Account: - * Task 2: Set up and configure Azure Storage Account replication to another region using Geo-redundant storage (GRS) or Geo-zone-redundant storage (GZRS) to ensure data availability in case of regional outages. - * Task 3: Perform a failover test for the storage account to validate the disaster recovery setup. - -## Challenge 1 - Calculate Composite SLAs with Azure Copilot - -![architecture](../walkthrough/challenge-4/img/asrdemo%20architecture.png) - -Learn how to calculate composite SLAs. - -## References -- [πŸ“„ Azure Copilot Documentation](https://docs.microsoft.com/en-us/azure/copilot/) - -## Use Azure Copilot to calculate the composite SLAs for your application. - -### Example Prompts - -``` -What are the SLAs for my Azure resources? -``` - -``` -Can you show me the SLAs for Azure App Service? -``` - -
-πŸ’‘ Hint: Use the SLAs -
- -Find the latest SLA provided by Microsoft in [Service Level Agreements (SLA) for Online Services](https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1&year=2024). - -
- -### Example Prompts - -``` -How do I calculate the composite SLA for my application? - -Can you provide an example of composite SLA calculation? -``` - -
-πŸ’‘ Hint: Composite SLA Calculation -
- -1. Identify the Azure services (components) that are connected. -2. Determine the chains of components within the application. -3. Use the latest SLA provided by Microsoft in [Service Level Agreements (SLA) for Online Services](https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1&year=2024) to find the SLA for each component in the chain. -4. Multiply the SLA values of each individual component (link) in the chain to get the composite SLA for that chain. -5. Identify the weakest link – the component/composites with the lowest SLA. - -
- -## Challenge 2 & 3 - Disaster Recovery for Azure Storage Account - -* Disaster Recovery for Azure Storage Account: - * Task 2: Set up and configure Azure Storage Account replication to another region using Geo-redundant storage (GRS) or Geo-zone-redundant storage (GZRS) to ensure data availability in case of regional outages. - * Task 3: Perform a failover test for the storage account to validate the disaster recovery setup. - -
-πŸ’‘ Enable GRS on storage account -
- -![grs1](../walkthrough/challenge-1/exploration/5.png) -![grs2](../walkthrough/challenge-1/exploration/6.png) -![grs3](../walkthrough/challenge-1/exploration/7.png) - -
- ---- - -### Success Criteria βœ… -* You have implemented disaster recovery for an Azure Storage Account using GRS or GZRS, protecting against regional outages. -* You have conducted failover tests for the Azure Storage Account, demonstrating the effectiveness of your disaster recovery strategy. -* You were able to connect to the failed-over Storage Account from the failed-over VM. - -### πŸ“š Learning Resources -* [Geo-redundant storage (GRS) for cross-regional durability](https://learn.microsoft.com/en-us/azure/storage/common/storage-redundancy-grs) -* [Disaster recovery and storage account failover](https://learn.microsoft.com/en-us/azure/storage/common/storage-disaster-recovery-guidance) -* [Testing for disaster recovery](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-test-failover-to-azure) - -### Solution - Spoiler Warning ⚠️ - -[Solution Steps](../walkthrough/challenge-4/solution.md) - ---- - -**[➑️ Next Challenge 5 - Failback to the primary region](./05_challenge.md)** | - -**[⬅️ Previous Challenge 3 - Protect in Azure with Disaster Recovery](./03_challenge.md)** \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/05_challenge.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/05_challenge.md deleted file mode 100644 index 5fc071600..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/05_challenge.md +++ /dev/null @@ -1,40 +0,0 @@ -## Challenge 5 - Failback to the Primary Region (Germany West Central) -## Prerequisites - -Please ensure that you successfully passed [challenge 4](./04_challenge.md) before continuing with this challenge. - -### Goal 🎯 - -In challenge 5, you will failback the web application from Sweden Central to Germany West Central. The storage account could be failed back as well to Germany West Central. - -### Actions πŸ› οΈ - -* Failback the Web Application from Sweden Central to Germany West Central region (Source environment) and monitor the progress. -* Failback Storage Account to Germany West Central. -* Restore a VM in Azure. - -### Success Criteria βœ… - -* The failback of all resources to the Germany West Central region has been successfully performed. - -### Learning Resources πŸ“š - -* [Reprotect Azure VMs](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-how-to-reprotect) -* [Failback Azure VMs](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-tutorial-failback) -* [Enable Replication for Azure VMs](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-tutorial-enable-replication) - -### Solution - Spoiler Warning ⚠️ - -[Solution Steps](../walkthrough/challenge-5/solution.md) - -## Finish πŸŽ‰ - -Congratulations! You finished the MicroHack Business Continuity / Disaster Recovery. We hope you had the chance to learn about how to implement a successful DR strategy to protect resources in Azure and to Azure. - -Thank you for investing the time and see you next time! - ---- - -**[➑️ Next Challenge 6 - Protect your Azure PaaS (Azure SQL Database) with Disaster recovery](./06_challenge.md)** | - -**[⬅️ BCDR Micro Hack - Home Page](../Readme.md)** | **[⬅️ Challenge 4 - Protect your Azure PaaS with Disaster Recovery](./04_challenge.md)** \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/06_challenge.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/06_challenge.md deleted file mode 100644 index bb3f8dbf7..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/06_challenge.md +++ /dev/null @@ -1,56 +0,0 @@ -# Extra Challenge - Monitor & Protect your Azure PaaS (Azure SQL Database) - -In this chapter we have extra challanges for the fast participants or the participants who wants to go further more. We will focus on Application 2 - Customer Help Desk Services. - -## Challenge 6.0 - Setup - Application 2 - -You can use [the guide](../Infra/App2/setup.md) to deploy an N-tier application, which will be useful for the challenges. - -## Challenge 6.1 - Monitor the resources - -### Task 1 - Open the Application Insights dashboard - -- Use [`azd monitor`](https://learn.microsoft.com/azure/developer/azure-developer-cli/monitor-your-app) to monitor the application - -Run the following Terminal Command in the directory - - azd monitor - -### Task 2 - Navigate through the metrics - -Navigate to the Application Insights dashboards: -- overview -- live metrics -- logs - -![image](../walkthrough/challenge-6/img/01_App_Insights_dashboards.png) - -## Success Criteria - -- Successfully execute the ``azd monitor`` command. -- Navigate and review the Application Insights dashboards. - - - - -**[⬅️ BCDR Micro Hack - Home Page](../Readme.md)** | -**[⬅️ Challenge 5 - Failback to the Primary Region (Germany West Central)](./05_challenge.md)** diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-01.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-01.md new file mode 100644 index 000000000..fa752cfd6 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-01.md @@ -0,0 +1,62 @@ +# Challenge 1 - Understand the Disaster Recovery (DR) terms and define a DR strategy + +**[Home](../Readme.md)** - [Next Challenge](challenge-02.md) + +# Contoso Ltd - Business Continuity and Disaster Recovery (BCDR) Strategy + +## Background +Contoso Ltd is a global company that relies on advanced technology to manage its operations efficiently. Their business applications, all hosted in the Azure cloud, are crucial to their daily functions and overall success. These applications power a wide range of essential business processes: +- **App 1:** Fabric Robot Automation +- **App 2:** Customer Help Desk Services +- **App 3:** Archive Service + +Leaders at Contoso Ltd understand that any downtime can result in significant financial losses and operational disruptions. Therefore, the company has mandated a thorough review of its Business Continuity and Disaster Recovery (BCDR) strategies to strike a balance between business continuity, customer satisfaction, and operational costs. The goal is to design and implement recovery plans that can swiftly restore services and minimize downtime in the event of unforeseen disasters. + +## Scenario Overview +A natural disaster struck the region hosting Contoso applications on Azure one Friday evening, causing outages in many services and leading to a cascading failure of all Contoso applications. The sudden disruption impacted essential business functions, leaving the company to grapple with significant financial losses and operational chaos. Customers and stakeholders were left in a state of uncertainty as they awaited updates on service restoration. The IT team faced immense pressure to rapidly deploy recovery strategies to minimize downtime, restore critical operations, and ensure that such an incident would not recur in the future. + +Participants must design and implement recovery strategies to meet business targets while considering costs for high availability. + +## Application Overview +| Application | Business Function | Criticality | SLA | RTO | RPO | Downtime Cost | +|-------------|-------------------|-------------|-----|-----|-----|---------------| +| App1 | Fabric Robot Automation | Critical | 99.995% | 1 hour | 10 minutes | $50,000/hour | +| App2 | Customer Help Desk Services | High | 99.95% | 2 hours | 15 minutes | $25,000/hour | +| App3 | Archive Service | Medium | 99.9% | 6 hours | 4 hours | $10,000/hour | + +## Recovery Costs for High Availability +| Application | Cost of RTO Compliance | Cost of RPO Compliance | Cost of SLA Compliance | Fully Highly Available Cost | +|-------------|------------------------|------------------------|------------------------|-----------------------------| +| App1 | $100,000 | $50,000 | $75,000 | $200,000 | +| App2 | $75,000 | $35,000 | $50,000 | $125,000 | +| App3 | $50,000 | $20,000 | $25,000 | $75,000 | + +## Challenge Objective +### Actions +Participants must: +1. **Write down the first 3 steps** you would take if your company was attacked by ransomware, considering different perspectives (employee, CISO, CEO). +2. **Reflect on business continuity testing** - Think about whether you've ever participated in a business continuity test scenario in your organization. +3. **Define application owner responsibilities** - Put yourself in the position of an application owner and define the necessary steps to ensure your application stays available during a disaster. +4. **Identify BCDR stakeholders** - Determine who defines the requirements for Business Continuity and identify the necessary KPIs for achieving good SLA in terms of availability. +5. **Plan geographic distribution** - Design the different geographic regions needed to reach the highest availability SLA (including potential datacenter locations). +6. **Analyze the Contoso scenario** - Apply your understanding to prioritize recovery of the three applications based on their criticality, business impact, and cost considerations. + +### Success criteria + +* **Understood BCDR terminology** - Clearly distinguish between High Availability, Disaster Recovery, and Business Continuity concepts. +* **Identified emergency response steps** - Documented the first three critical steps for ransomware response from different organizational perspectives. +* **Assessed current BCDR maturity** - Reflected on your organization's business continuity testing practices and identified improvement opportunities. +* **Defined application owner responsibilities** - Listed the nine key steps application owners should take to ensure disaster preparedness. +* **Identified BCDR roles and KPIs** - Determined who sets BCDR requirements and what metrics are essential for measuring availability SLA. +* **Planned geographic redundancy** - Designed a multi-region strategy considering RPO/RTO requirements and cost implications. +* **Applied BCDR principles to real scenario** - Successfully analyzed the Contoso case study and made informed decisions about recovery priorities and high availability investments. + +### Learning resources + +* [Business continuity and disaster recovery - Cloud Adoption Framework | Microsoft Learn](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-business-continuity-disaster-recovery) +* [Build high availability into your BCDR strategy - Azure Architecture Center | Microsoft Learn](https://learn.microsoft.com/azure/architecture/solution-ideas/articles/build-high-availability-into-your-bcdr-strategy) +* [Disaster recovery with Azure Site Recovery - Azure Solution Ideas | Microsoft Learn](https://learn.microsoft.com/azure/architecture/solution-ideas/articles/disaster-recovery-smb-azure-site-recovery) + +### High Availability vs. Disaster Recovery vs. Backup + +![HAvsDRvsBackup](../img/HAvsBackupvsDR.png) diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/01_challenge.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-02.md similarity index 53% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/01_challenge.md rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-02.md index 1ebb03593..235dc15f6 100644 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/01_challenge.md +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-02.md @@ -1,16 +1,31 @@ -## Challenge 1 - Prerequisites and Landing Zone Preparation +# Challenge 2 - Prerequisites and Landing Zone Preparation + +[Previous Challenge](challenge-01.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-03.md) ### Goal 🎯 -In Challenge 1, you will set up your environment with the necessary infrastructure to ensure business continuity using Cloud Native / PaaS Services on Azure. +In Challenge 2, you will set up your environment with the necessary infrastructure to ensure business continuity using Cloud Native / PaaS Services on Azure. -Below is an architecture diagram illustrating the setup. Tutorials and documentation providing step-by-step guidance on deploying the environment are included. +Below is an architecture diagram illustrating the setup. --- # Lab Environment with Virtual Machines -![Architecture](../img/asrdemo%20architecture.png) +![Architecture](../img/c2-asrdemo-architecture.png) + +## Subscription validation +Before deploying the lab environment, validate that your Azure subscription meets the necessary prerequisites: + +1. Navigate to the `Infra/App1` folder in the downloaded zip file. +2. Run the **`validate-prerequisites.sh`** script to verify your subscription readiness. + > **Note:** The script can be executed using the Azure CLI locally or directly within the Azure Cloud Shell (accessible via the terminal icon in the top navigation bar of the Azure Portal). +3. The script will check: + - Azure CLI installation and authentication status + - RBAC permissions (Owner role required at subscription level) + - Required resource providers are registered (and automatically registers any missing ones) +4. Address any issues identified by the script before proceeding with deployment. + > **Tip:** If any resource providers were missing and automatically registered, you can re-run the script to confirm they are now successfully registered. ## Deployment @@ -19,25 +34,28 @@ We will use **Infrastructure as Code** to deploy the lab environment. There are 1. **Azure Portal**: Suitable for those unfamiliar with IaaS deployment, allowing deployment by uploading the provided **ARM** scripts. 1. Alternative: **Bicep/ARM scripts via CloudShell**: This method is preferred for automation -### Option 1 - Deploy from the Azure Portal +### Option 1 - Infrastructure as Code Template Deployment via Azure Portal (ARM) 1. Go to the Azure portal and sign in. -2. In the Azure portal search bar, search for "deploy a custom template" and select it from the available options. -3. Upload the templates `deploy.json` and `main.parameters.json`. +2. In the Azure portal search bar, search for "Deploy a custom template" and select it from the available options. +3. Click **Build your own template in the editor**. +4. **Load file** to upload the `deploy.json`. +5. Click **Save**. +6. **Edit Parameters** to upload the parameter file. +7. **Load file** to upload `main.parameters.json`. +8. Click **Save**. +9. Change the **deployment prefix** `` and define a **VM Admin Password**. +10. Proceed with the deployment. -> **Note:** The template `deploy.json` and the parameter file `main.parameters.json` is available in the GitHub repository. You can access it directly via [this link](https://github.com/microsoft/MicroHack/tree/main/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/Infra/App1) or navigate to the path: `.\04_BCDR_Azure_Native\Infra\App1`. Alternatively, you can download it from the repository. +> **Note:** The template `deploy.json` and the parameter file `main.parameters.json` can be found in the downloaded zip file within the folder Infra/App1. -Refer to the [Step-by-Step Deployment Guide](../walkthrough/challenge-1/img/deployment/solution.md) for detailed guidance. -### Option 2 - Infrastructure as Code (ARM/Bicep) Deployment via CloudShell +### Option 2 - Infrastructure as Code Template Deployment via CloudShell (Bicep) To deploy the lab environment using **Bicep**, use the command documented here: [CloudShell Deployment command](../Infra/App1/ReadMe.md) -### πŸ“š Deploy a custom template -* [Quickstart: Create and deploy ARM templates using the Azure portal](https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/quickstart-create-templates-use-the-portal) - ## Exploration of the Lab After a successful deployment, you should see two new resource groups: `mh-source-germanywestcentral-rg` and `mh-target-swedencentral-rg`. @@ -45,30 +63,26 @@ After a successful deployment, you should see two new resource groups: `mh-sourc Verify the following resources and setup. Ensure the storage account has geo-redundancy enabled. * **Region 1: Germany West Central (Source environment)** - * Resource Group: `mh-source-germanywestcentral-rg` + * Resource Group: `mhsource-germanywestcentral-rg` * Recovery Services Vault: `mh-germanywestcentral-asrvault` * Backup Vault: `mh-germanywestcentral-asrvault-backupVault` - * Storage Account with LRS (locally-redundant storage) redundancy: `mhgermanywestcentral` \ + * Storage Account with GRS (geo-redundant storage) redundancy: `mhgermanywestcentral` \ * **Region 2: Sweden Central (Target environment)** - * Resource Group: `mh-target-swedencentral-rg` + * Resource Group: `mhtarget-swedencentral-rg` * Recovery Services Vault: `mh-swedencentral-asrvault` * Backup Vault: `mh-swedencentral-asrvault-backupVault` There is a WebApp running on the machines deployed in the Lab Environment. The Web Application uses two Virtual Machines as backend servers, so it might be running from either VM `mh-web1` or VM `mh-web2`. The lab environment provides a UI to see which host the web application is running from. -![web1](../walkthrough/challenge-1/exploration/1.png) -![web2](../walkthrough/challenge-1/exploration/2.png) -![web3](../walkthrough/challenge-1/exploration/3.png) - -![web4](../walkthrough/challenge-1/exploration/4.png) -![web5](../walkthrough/challenge-1/exploration/004.png) +![Traffic Manager Settings](./exploration/4.png) +![Website via Traffic Manager](./exploration/004.png) ### Success Criteria βœ… * Resource Groups created in both regions (Germany West Central & Sweden Central). * Recovery Services Vaults created in both regions. * Backup Vaults created in both regions. -* A locally-redundant Storage Account created. +* A geo-redundant Storage Account created. * The Web application is successfully deployed using a backend pool of two Virtual Machines. ### πŸ“š Learning Resources @@ -76,13 +90,6 @@ There is a WebApp running on the machines deployed in the Lab Environment. The W * [Manage resource groups - Azure Portal - Azure Resource Manager | Microsoft Learn](https://learn.microsoft.com/azure/azure-resource-manager/management/manage-resource-groups-portal) * [Create a storage account - Azure Storage | Microsoft Learn](https://learn.microsoft.com/azure/storage/common/storage-account-create) * [Create and configure Recovery Services vaults - Azure Backup | Microsoft Learn](https://learn.microsoft.com/azure/backup/backup-create-recovery-services-vault) +* [Quickstart: Create and deploy ARM templates using the Azure portal](https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/quickstart-create-templates-use-the-portal) -### Solution - Spoiler Warning ⚠️ - -[Solution Steps](../walkthrough/challenge-1/img/deployment/solution.md) - ---- - -**[ ➑️ Next Challenge 2 - Regional Protection and Disaster Recovery (DR)](./02_challenge.md)** | -**[ ⬅️ Previous Challenge 0 - Understand the Disaster Recovery (DR) terms and define a DR strategy](../Readme.md#contoso-ltd---business-continuity-and-disaster-recovery-bcdr-strategy)** diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-03.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-03.md new file mode 100644 index 000000000..4f13b593e --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-03.md @@ -0,0 +1,34 @@ +# Challenge 3 - Regional Protection (Backup) + +[Previous Challenge](challenge-02.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-04.md) + +### Goal 🎯 + +* Protect in Azure - **Backup / Restore** + +In this challenge, you will learn how to back up and restore a Linux Virtual Machine and an Azure Blob Storage using Azure Backup and Azure Backup Vaults. + +![Azure VM backup architecture](../img/c3-azure-vm-backup-architecture.png) + +## Actions + +### Protect in Azure - Backup / Restore +1. Enable Azure Backup for the Linux VM in the primary region. +2. Enable Azure Backup for Azure Blob Storage. +3. Restore a VM in Azure. +4. Optional: Restore a file vom Azure Blob. + +### Success Criteria βœ… + +- You have successfully set up Azure Backup for a virtual machine. +- You have successfully restored a VM on Azure. +- Optional: You have successfully restored an Azure Blob Storage container. + +### πŸ“š Learning Resources + +- [Quickstart: Back up a VM with the Azure portal](https://learn.microsoft.com/en-us/azure/backup/quick-backup-vm-portal) +- [Apply a backup policy](https://learn.microsoft.com/en-us/azure/backup/quick-backup-vm-portal#apply-a-backup-policy) +- [Tutorial: Back up multiple VMs at scale](https://learn.microsoft.com/en-us/azure/backup/tutorial-backup-vm-at-scale) +- [Restore VMs from Azure Backup](https://learn.microsoft.com/en-us/azure/backup/backup-azure-arm-restore-vms) +- [Restore encrypted virtual machines](https://learn.microsoft.com/en-us/azure/backup/restore-azure-encrypted-virtual-machines) +- [Azure Blob Storage: Backup & Restore](https://learn.microsoft.com/en-us/azure/backup/blob-backup-overview) diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-04.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-04.md new file mode 100644 index 000000000..21138dd41 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-04.md @@ -0,0 +1,26 @@ +# Challenge 4 - Regional Disaster Recovery (DR) + +[Previous Challenge](challenge-03.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-05.md) + +### Goal 🎯 + +* Enable **Disaster Recovery (DR)** in Azure by protecting workloads within a region across multiple Availability Zones (AZs). + +In this challenge, you will learn how to protect VM's with Azure Site Recovery and Azure Recovery Services Vaults. You will also practice simulating a regional failover between two Availability Zones (AZ) to handle a regional failure, such as a datacenter outage. + +![Azure Site Recovery Architecture - zone-to-zone](../img/c4-azure-site-recovery-cross-az.png) + +## Actions + +### Enable Disaster Recover (DR) in Azure within an Azure Region across Availability Zones. +1. Set up disaster recovery for the Linux VM in the primary region. +2. Simulate a zone-to-zone failover in the primary region. + +### Success Criteria βœ… + +- You have successfully enabled disaster recovery between availability zones of an Azure VM. +- You have successfully simulated a failover of the VM to another Availability Zone within the Region, using Azure Site Recovery. + +### πŸ“š Learning Resources + +- [Setup Azure VM disaster recovery between availability zones](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-how-to-enable-zone-to-zone-disaster-recovery) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-05.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-05.md new file mode 100644 index 000000000..476bcf7f6 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-05.md @@ -0,0 +1,33 @@ +# Challenge 5 - Disaster Recovery (DR) across Azure Regions + +[Previous Challenge](challenge-04.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-06.md) + + +### Goal 🎯 + +In Challenge 5, you will learn how to protect Azure VMs using Azure Site Recovery and enable replication to a secondary Azure Region. Additionally, You will also perform test and production failovers. + +* Source/Primary Region: Germany West Central +* Target/Secondary Region: Sweden Central +* VMs requiring cross-region protection: *-web1 and *-web2. + +![Azure Site Recovery Architecture - cross Regions](../img/c5-azure-site-recovery-cross-region.png) + +### Actions + +* Task 1: Set up and enable disaster recovery with Azure Site Recovery and monitor the progress. +* Task 2: Perform a **disaster recovery drill**, **create recovery plan** and run a **test failover**. +* Task 3: Run a **production failover** from the source to the target Region. + +### Success Criteria βœ… + +* Replication of the web servers to the Sweden Central region was successfully enabled. +* A test failover from Germany West Central to Sweden Central was successfully initiated with zero impact on production. +* The production failover to the Sweden Central region was successfully completed. + +### πŸ“š Learning Resources + +* [Enable Replication](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-how-to-enable-replication) +* [Create Recovery Plans](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-create-recovery-plans) +* [Test Failover to Azure](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-test-failover-to-azure) + diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-06.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-06.md new file mode 100644 index 000000000..3f9d50b87 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-06.md @@ -0,0 +1,35 @@ +# Challenge 6 - Restore Web Application and verify Azure Storage DR + +[Previous Challenge](challenge-05.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-07.md) + +### Goal 🎯 + +In this challenge 6, you will re-establish the connection to your web application from the failed-over region and then test disaster recovery for an Azure Storage account with GRS enabled. The primary objective is to ensure business continuity by protecting critical data stored in Azure storage accounts against potential disasters. + +### Actions +* Task 1: Re-establish your connection to the Web Application from the secondary region. + * Add your failed-over Virtual Machines in the secondary region to the backend pool of your Load Balancer. + * Test the connection to the Web Application. +* Task 2: Disaster Recovery for Azure Storage Account. + * Verify the configuration of the Azure Storage Account redudancy, and confirm GRS is enabled and data is replicated to a secondary region. Which region is used as secondary region? + * Perform a failover test for the storage account to validate the disaster recovery setup. + + +
+πŸ’‘ Storage Account with GRS enabled +
+ +![grs3](./exploration/7.png) + +
+ +--- + +### Success Criteria βœ… +* You have successfully re-established connection to your web application from the secondary region. +* You have verified that the Azure Storage Account has GRS enabled and identified the secondary region used for data replication. +* You have successfully performed a failover test for the Azure Storage Account. + +### πŸ“š Learning Resources +* [Geo-redundant storage (GRS) for cross-regional durability](https://learn.microsoft.com/en-us/azure/storage/common/storage-redundancy-grs) +* [Disaster recovery and storage account failover](https://learn.microsoft.com/en-us/azure/storage/common/storage-disaster-recovery-guidance) diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-07.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-07.md new file mode 100644 index 000000000..3e44eaf1c --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-07.md @@ -0,0 +1,29 @@ +# Challenge 7 - Failback to the Primary Region (Germany West Central) + +[Previous Challenge](challenge-06.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-08.md) + +### Goal 🎯 + +In Challenge 7, you will fail back the web application from Sweden Central to Germany West Central, along with the associated storage account. + +### Actions πŸ› οΈ + +* Failback the Web Application from Sweden Central to Germany West Central region (Source environment) and monitor the progress. +* Ensure web servers are re-protected for disaster recovery to the secondary region (Sweden Central) after the failback operation completes. +* Verify Traffic Manager endpoint status and ensure the Germany West Central endpoint is "Online" and receiving traffic. +* Failback Storage Account to Germany West Central. + +### Success Criteria βœ… + +* The web application has been successfully failed back from Sweden Central to Germany West Central region. +* All web servers in Germany West Central are operational and serving traffic correctly. +* Web servers have been re-protected for disaster recovery with replication configured back to Sweden Central region. +* Traffic Manager shows Germany West Central endpoint as "Online" and is actively routing traffic to the primary region. +* Storage Account has been successfully failed back to Germany West Central region. +* Data integrity has been verified - all data is accessible and consistent after the failback operation. + +### Learning Resources πŸ“š + +* [Reprotect Azure VMs](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-how-to-reprotect) +* [Failback Azure VMs](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-tutorial-failback) +* [Enable Replication for Azure VMs](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-tutorial-enable-replication) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-08.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-08.md new file mode 100644 index 000000000..af110dd75 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/challenge-08.md @@ -0,0 +1,50 @@ +# Optional: Challenge 8 - Monitoring and Alerting for BCDR Operations + +[Previous Challenge](challenge-07.md) - **[Home](../Readme.md)** - [Congratulations](finish.md) + +### Goal 🎯 + +In this challenge 8, you will implement comprehensive monitoring and reporting for your Azure Backup and Azure Site Recovery configurations. Continuous monitoring is essential for ensuring the health and effectiveness of your BCDR strategy, enabling you to detect issues proactively before they impact your ability to recover from disasters. + +You will explore built-in monitoring dashboards, configure diagnostic logging for advanced analytics, and leverage Azure Business Continuity Center for unified reporting across your backup and disaster recovery operations. + +![BCDR Monitoring Architecture](../img/c9-bcdr-monitoring-architecture.png) + +### Actions πŸ› οΈ + +#### Part 1: Configure Azure Backup Monitoring & Reporting +* Configure diagnostic settings to send Azure Backup logs to the existing Log Analytics workspace deployed in your infrastructure. +* Use **Azure Business Continuity Center (Resiliency)** to leverage reports for comprehensive data insights across backup operations. +* Explore the monitoring capabilities within the Recovery Services Vault, including built-in alerts, job monitoring, and the different interfaces available for analyzing backup health and performance. Ensure monitoring is configured. + +> **Note:** After diagnostics configuration, it takes up to 24 hours for the initial data push to complete. Once the data migrates to the Log Analytics workspace, the data in the reports might take some time to appear because the data for the current day isn't available in the reports. + + +#### Part 2: Configure Azure Site Recovery (ASR) Monitoring +* Enable diagnostics settings for the Recovery Services Vault to send ASR logs to Log Analytics. + +> **Hint:** If you selected "all logs" when configuring diagnostic settings in Part 1, Azure Site Recovery logs are already being sent to Log Analytics and this step can be skipped. Additionally, if you have a Recovery Services Vault in your secondary region for replication, ensure you replicate the same diagnostic settings configuration on that vault as well to capture comprehensive ASR monitoring data across both regions. + +* Explore the Azure Site Recovery monitoring capabilities using the built-in dashboard in the Recovery Services Vault, including replication health status, infrastructure view, and job monitoring features. +* Review the built-in Azure Monitor alerts available for Azure Site Recovery and understand the types of events they monitor. + + +### Success Criteria βœ… +* Comprehensive monitoring and reporting is properly configured for all BCDR operations +* Diagnostic settings configured for Recovery Services Vault(s) to send Azure Backup and ASR logs to Log Analytics workspace +* Azure Business Continuity Center (Resiliency) reports accessed and displaying backup insights across all protected resources +* Recovery Services Vault monitoring capabilities explored including built-in alerts, job monitoring, backup health interfaces, replication health status, infrastructure view, and ASR job monitoring +* Built-in Azure Monitor alerts for both Azure Backup and Azure Site Recovery reviewed and understood + +### Learning Resources πŸ“š + +#### Azure Backup Monitoring +* [Configure reporting and data insights with Azure Business Continuity Center](https://learn.microsoft.com/en-us/azure/business-continuity-center/tutorial-reporting-for-data-insights) +* [Alert for Backup job failures](https://learn.microsoft.com/en-us/azure/backup/backup-azure-monitoring-alerts?tabs=recovery-services-vaults#turn-on-azure-monitor-alerts-for-job-failure-scenarios) + +#### Azure Site Recovery Monitoring +* [Monitor Azure Site Recovery in the dashboard](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-monitor-and-troubleshoot#monitor-in-the-dashboard) +* [Monitor Azure Site Recovery](https://learn.microsoft.com/en-us/azure/site-recovery/monitor-site-recovery) +* [Set up diagnostics for a Recovery Services vault](https://learn.microsoft.com/en-us/azure/site-recovery/monitor-log-analytics) +* [Monitor replication health with Azure Monitor Logs](https://learn.microsoft.com/en-us/azure/site-recovery/monitor-log-analytics) +* [Built-in Azure Monitor alerts for Azure Site Recovery](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-monitor-and-troubleshoot#built-in-azure-monitor-alerts-for-azure-site-recovery) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/004.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/004.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/004.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/004.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/1.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/1.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/1.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/2.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/2.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/2.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/3.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/3.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/3.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/4.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/4.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/4.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/5.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/5.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/5.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/6.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/6.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/6.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/7.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/exploration/7.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/exploration/7.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/finish.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/finish.md new file mode 100644 index 000000000..b0d65bca9 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/challenges/finish.md @@ -0,0 +1,12 @@ +# Finish + +[Previous Challenge](challenge-07.md) - **[Home](../Readme.md)** + +## Congratulations + +You finished the MicroHack *Business Continuity on Azure*. +We hope you had the chance to learn about how to implement a successful DR strategy to protect resources in Azure and to Azure. +If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. + +Thank you for investing the time and see you next time! + diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/asrdemo architecture.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/asrdemo architecture.png deleted file mode 100644 index 3f645b491..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/asrdemo architecture.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c2-asrdemo-architecture.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c2-asrdemo-architecture.png new file mode 100644 index 000000000..dd0efad26 Binary files /dev/null and b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c2-asrdemo-architecture.png differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c3-azure-vm-backup-architecture.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c3-azure-vm-backup-architecture.png new file mode 100644 index 000000000..40da56281 Binary files /dev/null and b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c3-azure-vm-backup-architecture.png differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c4-azure-site-recovery-cross-az.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c4-azure-site-recovery-cross-az.png new file mode 100644 index 000000000..107aa3686 Binary files /dev/null and b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c4-azure-site-recovery-cross-az.png differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c5-azure-site-recovery-cross-region.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c5-azure-site-recovery-cross-region.png new file mode 100644 index 000000000..afdb45d67 Binary files /dev/null and b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c5-azure-site-recovery-cross-region.png differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c9-bcdr-monitoring-architecture.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c9-bcdr-monitoring-architecture.png new file mode 100644 index 000000000..d86336062 Binary files /dev/null and b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/img/c9-bcdr-monitoring-architecture.png differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/resources/ARM-Templates/challenge-1-northeurope.json b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/resources/ARM-Templates/challenge-1-northeurope.json deleted file mode 100644 index 5ad416d0d..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/resources/ARM-Templates/challenge-1-northeurope.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "recoveryServicesVaultName": { - "defaultValue": "mh-rsv-neu", - "type": "String" - } - }, - "variables": {}, - "resources": [ - { - "type": "Microsoft.RecoveryServices/vaults", - "apiVersion": "2022-09-10", - "name": "[parameters('recoveryServicesVaultName')]", - "location": "northeurope", - "sku": { - "name": "RS0", - "tier": "Standard" - }, - "properties": {} - } - ] -} \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/resources/ARM-Templates/challenge-1-westeurope.json b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/resources/ARM-Templates/challenge-1-westeurope.json deleted file mode 100644 index be12667fa..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/resources/ARM-Templates/challenge-1-westeurope.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "recoveryServicesVaultName": { - "defaultValue": "mh-rsv-weu", - "type": "String" - }, - "storageAccountName": { - "defaultValue": "mhstweu", - "type": "String" - } - }, - "variables": {}, - "resources": [ - { - "type": "Microsoft.RecoveryServices/vaults", - "apiVersion": "2022-09-10", - "name": "[parameters('recoveryServicesVaultName')]", - "location": "westeurope", - "sku": { - "name": "RS0", - "tier": "Standard" - }, - "properties": {} - }, - { - "type": "Microsoft.Storage/storageAccounts", - "apiVersion": "2022-09-01", - "name": "[parameters('storageAccountName')]", - "location": "westeurope", - "sku": { - "name": "Standard_RAGRS", - "tier": "Standard" - }, - "kind": "StorageV2", - "properties": { - "dnsEndpointType": "Standard", - "defaultToOAuthAuthentication": false, - "publicNetworkAccess": "Enabled", - "allowCrossTenantReplication": true, - "minimumTlsVersion": "TLS1_2", - "allowBlobPublicAccess": false, - "allowSharedKeyAccess": true, - "networkAcls": { - "bypass": "AzureServices", - "virtualNetworkRules": [], - "ipRules": [], - "defaultAction": "Allow" - }, - "supportsHttpsTrafficOnly": true, - "encryption": { - "requireInfrastructureEncryption": false, - "services": { - "file": { - "keyType": "Account", - "enabled": true - }, - "blob": { - "keyType": "Account", - "enabled": true - } - }, - "keySource": "Microsoft.Storage" - }, - "accessTier": "Hot" - } - }, - { - "type": "Microsoft.Storage/storageAccounts/blobServices", - "apiVersion": "2022-09-01", - "name": "[concat(parameters('storageAccountName'), '/default')]", - "dependsOn": [ - "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]" - ], - "sku": { - "name": "Standard_RAGRS", - "tier": "Standard" - }, - "properties": { - "changeFeed": { - "enabled": false - }, - "restorePolicy": { - "enabled": false - }, - "containerDeleteRetentionPolicy": { - "enabled": true, - "days": 7 - }, - "cors": { - "corsRules": [] - }, - "deleteRetentionPolicy": { - "allowPermanentDelete": false, - "enabled": true, - "days": 7 - }, - "isVersioningEnabled": false - } - }, - { - "type": "Microsoft.Storage/storageAccounts/fileServices", - "apiVersion": "2022-09-01", - "name": "[concat(parameters('storageAccountName'), '/default')]", - "dependsOn": [ - "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]" - ], - "sku": { - "name": "Standard_RAGRS", - "tier": "Standard" - }, - "properties": { - "shareDeleteRetentionPolicy": { - "enabled": true, - "days": 7 - } - } - }, - { - "type": "Microsoft.Storage/storageAccounts/queueServices", - "apiVersion": "2022-09-01", - "name": "[concat(parameters('storageAccountName'), '/default')]", - "dependsOn": [ - "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]" - ], - "properties": { - "cors": { - "corsRules": [] - } - } - }, - { - "type": "Microsoft.Storage/storageAccounts/tableServices", - "apiVersion": "2022-09-01", - "name": "[concat(parameters('storageAccountName'), '/default')]", - "dependsOn": [ - "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]" - ], - "properties": { - "cors": { - "corsRules": [] - } - } - } - ] -} \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/img/test.txt b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/img/test.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/img/Customerneeds_RPO_RTO.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-01/img/Customerneeds_RPO_RTO.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/img/Customerneeds_RPO_RTO.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-01/img/Customerneeds_RPO_RTO.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/img/DR_Tier_Levels.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-01/img/DR_Tier_Levels.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/img/DR_Tier_Levels.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-01/img/DR_Tier_Levels.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/img/DifferentTerms.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-01/img/DifferentTerms.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/img/DifferentTerms.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-01/img/DifferentTerms.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/solution.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-01/solution-01.md similarity index 97% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/solution.md rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-01/solution-01.md index c4dc009bc..fcaa2a31d 100644 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-0/solution.md +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-01/solution-01.md @@ -1,4 +1,6 @@ -# Walkthrough Challenge 0 - Understand the Disaster Recovery terms and define a strategy +# Walkthrough Challenge 1 - Understand the Disaster Recovery terms and define a strategy + +**[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-02/solution-02.md) ⏰ Duration: 45 minutes @@ -79,4 +81,3 @@ The Azure Business Continuity Guide provides a comprehensive set of recommendati [Azure Business Continuity Guide](https://github.com/Azure/BusinessContinuityGuide) - **[Home](../../Readme.md)** - [Next Challenge](../../challenges/01_challenge.md) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/1.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/1.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/1.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/10resources.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/10resources.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/10resources.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/10resources.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/11deploymentcomplete.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/11deploymentcomplete.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/11deploymentcomplete.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/11deploymentcomplete.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/12.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/12.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/12.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/2.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/2.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/2.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/3load.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/3load.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/3load.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/3load.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/4save.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/4save.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/4save.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/4save.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/5parameter.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/5parameter.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/5parameter.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/5parameter.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/6parameter.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/6parameter.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/6parameter.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/6parameter.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/7save.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/7save.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/7save.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/7save.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/8deploy.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/8deploy.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/8deploy.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/8deploy.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/9deploy.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/9deploy.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/9deploy.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/img/deployment/9deploy.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/solution-02.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/solution-02.md new file mode 100644 index 000000000..3ce998ad5 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-02/solution-02.md @@ -0,0 +1,91 @@ +# Walkthrough Challenge 2 - Prerequisites and Landing Zone Preparation + +[Previous Challenge Solution](../challenge-01/solution-01.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-03/solution-03.md) + +⏰ Duration: 30 minutes + +## Solution Overview + +This challenge deploys the lab environment using Infrastructure as Code (IaC). The deployment creates resource groups in two Azure regions (Germany West Central and Sweden Central) along with Recovery Services Vaults, Backup Vaults, and a geo-redundant storage account. + +## Prerequisites Validation + +1. Navigate to the `Infra/App1` folder +2. Run the `validate-prerequisites.sh` script (can be executed locally with Azure CLI or uploaded/copy-pasted into Azure Cloud Shell): + ```bash + bash validate-prerequisites.sh + ``` +3. The script will validate: + - Azure CLI installation and authentication + - Subscription access and selection + - RBAC permissions (Owner role) + - Resource provider registration (and auto-register if needed) +4. Resolve any errors before proceeding with deployment + +## Deployment + +Choose one of the deployment methods described in [Challenge 2](../../challenges/challenge-02.md): + +### Option 1: Azure Portal (ARM Template) +Follow the step-by-step instructions in the challenge to deploy using the Azure Portal's custom template deployment feature with `deploy.json` and `main.parameters.json`. + +#### Deployment Steps with Screenshots: + +1. Search for "Deploy a custom template" in the Azure Portal + ![Search for Deploy a custom template](./img/deployment/1.png) + +2. Click "Build your own template in the editor" + ![Build your own template](./img/deployment/2.png) + +3. Load the `deploy.json` file + ![Load file](./img/deployment/3load.png) + +4. Save the template + ![Save template](./img/deployment/4save.png) + +5. Edit parameters + ![Edit parameters](./img/deployment/5parameter.png) + +6. Load the `main.parameters.json` file + ![Upload parameters](./img/deployment/6parameter.png) + +7. Save the parameters + ![Save parameters](./img/deployment/7save.png) + +8. Review the deployment settings + ![Review settings](./img/deployment/8deploy.png) + +9. Click "Review + create" and then "Create" + ![Review and create](./img/deployment/9deploy.png) + +10. Monitor the deployment progress + ![Monitor deployment](./img/deployment/10resources.png) + +11. Wait for deployment completion + ![Deployment success](./img/deployment/11deploymentcomplete.png) + +12. Verify the deployed resources + ![New Virtual Machines](./img/deployment/12.png) + + +### Option 2: CloudShell (Bicep) - Recommended +Use the deployment command documented in [Infra/App1/ReadMe.md](../../Infra/App1/ReadMe.md) for automated deployment via CloudShell. + +## Validation + +After deployment, verify the following resources exist: + +**Germany West Central (Source):** +- Resource Group: `mhsource-germanywestcentral-rg` +- Recovery Services Vault: `mh-germanywestcentral-asrvault` +- Backup Vault: `mh-germanywestcentral-asrvault-backupVault` +- Storage Account (GRS): `mhgermanywestcentral` + +**Sweden Central (Target):** +- Resource Group: `mhtarget-swedencentral-rg` +- Recovery Services Vault: `mh-swedencentral-asrvault` +- Backup Vault: `mh-swedencentral-asrvault-backupVault` + +**Web Application:** +- Access the web application to verify it's running +- Confirm it shows which backend VM (`mh-web1` or `mh-web2`) is serving the request diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/030.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/030.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/030.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/030.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/031.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/031.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/031.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/031.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/032.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/032.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/032.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/032.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/033.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/033.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/033.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/033.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/034.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/034.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/034.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/034.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/035.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/035.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/035.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/035.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/036.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/036.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/036.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/036.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/037.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/037.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/037.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/037.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/038.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/038.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/038.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/038.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/039.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/039.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/039.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/039.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/040.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/040.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/040.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/040.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/041.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/041.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/041.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/041.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/042.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/042.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/042.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/042.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/043.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/043.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/043.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/043.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/044.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/044.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/044.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/044.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/045.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/045.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/045.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/045.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/050.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/050.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/050.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/050.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/051.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/051.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/051.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/051.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/052.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/052.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/052.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/052.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/054.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/054.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/054.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/054.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/055.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/055.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/055.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/055.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/058.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/060.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/058.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/060.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/059.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/060a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/059.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/060a.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/061.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/061.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/061.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/061.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/062.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/062.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/062.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/062.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/063.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/063.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/063.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/063.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/064.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/064.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/064.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/064.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/065.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/065.png new file mode 100644 index 000000000..e6086c93c Binary files /dev/null and b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/065.png differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/070.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/070.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/070.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/070.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-22.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/mh-ch2-screenshot-22.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-22.png rename to 03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/img/mh-ch2-screenshot-22.png diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/solution-03.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/solution-03.md new file mode 100644 index 000000000..96781d9d9 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-03/solution-03.md @@ -0,0 +1,137 @@ +# Walkthrough Challenge 3 - Regional Protection (Backup) + +[Previous Challenge Solution](../challenge-02/solution-02.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-04/solution-04.md) + +⏰ Duration: 1 Hour + +## Solution Overview + +This challenge focuses on implementing Azure Backup for virtual machines and blob storage, and performing restore operations. You will configure backup policies, execute backups, and restore resources to demonstrate business continuity capabilities. + +## Prerequisites + +Ensure the lab environment from Challenge 2 is successfully deployed with: +- Linux VM (`mh-linux`) in Germany West Central +- Recovery Services Vault in Germany West Central +- Backup Vault in Germany West Central +- Storage Account with blob containers + +## Task 1: Enable Azure Backup for Linux VM + +### Configure VM Backup + +Navigate to the Linux VM and enable backup: + +1. Navigate to the Linux VM in the Azure Portal. Go to the **Backup** blade and configure settings and enable backup. + + ![Navigate to Backup](./img/030.png) + +2. Verify backup settings and start the initial backup by clicking **Backup now**. + + ![Enable Backup](./img/040.png) + +3. Monitor the backup job progress, click on **View details** for backup. + + ![Backup Started](./img/031.png) + +4. Monitor the backup job details (includes snapshot and vault transfer) + + ![Backup Progress](./img/032.png) + +5. Wait for the backup to complete + + ![Backup Completed](./img/033.png) + ![Backup Details](./img/034.png) + +### Create a Custom Backup Policy (Optional) + +You can create custom backup policies to meet specific retention and scheduling requirements: + +1. Navigate to the Recovery Services Vault in Germany West Central + ![Recovery Services Vault](./img/041.png) + +2. Add a new Backup Policy + ![Add Policy](./img/042.png) + +3. Select policy type for Azure Virtual Machines + ![Policy for VMs](./img/043.png) + +4. Configure backup schedule (daily or hourly) + ![Daily Backup Schedule](./img/044.png) + + Optional: Configure hourly backup schedule + ![Hourly Backup Schedule](./img/mh-ch2-screenshot-22.png) + +5. Review retention settings and create the policy + ![Policy Created](./img/045.png) + +## Task 2: Enable Azure Backup for Blobs + +### Configure Backup Vault Permissions + +1. Navigate to the Backup Vault in Germany West Central + ![Backup Vault](./img/060.png) + +2. Enable System Managed Identity and note the Object ID + ![Enable Managed Identity](./img/060a.png) + +3. Go to the Storage Account in Germany West Central + ![Storage Account](./img/050.png) + +4. Navigate to **Access Control (IAM)** and add role assignment + ![IAM](./img/061.png) + +5. Select the **Storage Account Backup Contributor** role + ![Select Role](./img/062.png) + +6. Assign to the Backup Vault's Managed Identity + ![Select Scope](./img/063.png) + ![Select Managed Identity](./img/064.png) + +7. Review and assign the role + ![Review Assignment](./img/065.png) + +### Configure Blob Backup + +1. Create a backup policy for blobs + ![Create Policy](./img/051.png) + ![Select Vault](./img/052.png) + ![Configure Policy](./img/054.png) + +2. Verify the backup policy is created + ![Policy Created](./img/055.png) + +## Task 3: Restore a VM in Azure + +> **Important:** Ensure the backup job from Task 1 is completed before proceeding. + +### Perform VM Restore + +1. Navigate to the VM backup and start the restore procedure + ![Start Restore](./img/035.png) + +2. Select a restore point + ![Select Restore Point](./img/036.png) + +3. Configure restore properties and proceed + ![Restore Properties](./img/037.png) + ![Review Restore](./img/038.png) + ![Confirm Restore](./img/039.png) + +4. Verify the restored VM is created + ![Restored VM](./img/070.png) + +## Task 4 (Optional): Restore Azure Blob + +For restoring blob storage, refer to the [Azure Blob Backup documentation](https://learn.microsoft.com/en-us/azure/backup/blob-restore). + +## Success Criteria Validation βœ… + +Confirm you have completed: +- βœ… Enabled Azure Backup for the Linux VM +- βœ… Configured Azure Backup for Blob Storage +- βœ… Successfully restored a VM from backup +- βœ… (Optional) Restored a blob container + +You have successfully completed Challenge 3! πŸš€ + diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-04/solution-04.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-04/solution-04.md new file mode 100644 index 000000000..d7a5d7d7c --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-04/solution-04.md @@ -0,0 +1,88 @@ +# Walkthrough Challenge 4 - Regional Disaster Recovery (DR) + +[Previous Challenge Solution](../challenge-03/solution-03.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-05/solution-05.md) + +⏰ Duration: 1 hour + +## Solution Overview + +This challenge focuses on implementing zone-to-zone disaster recovery within a single Azure region using Azure Site Recovery. You will configure replication between Availability Zones in Germany West Central and simulate a failover to demonstrate DR capabilities within the same region. + +## Prerequisites + +Ensure the lab environment from Challenge 2 is successfully deployed with: +- Linux VM (`mh-linux`) deployed in Germany West Central in a specific Availability Zone +- Recovery Services Vault in Germany West Central + +## Task 1: Set up disaster recovery for the Linux VM across Availability Zones + +### Enable Zone-to-Zone Disaster Recovery + +1. Navigate to the Linux VM in Germany West Central +2. Go to **Disaster recovery** in the left menu +3. Configure zone-to-zone disaster recovery: + - Source: Current Availability Zone + - Target: Different Availability Zone in Germany West Central + - Select the Recovery Services Vault in Germany West Central + +4. Review and start replication + +5. Monitor the replication status until it completes + - Initial replication may take 15-30 minutes + - Verify replication health shows as "Healthy" + +> **Note:** Zone-to-zone DR protects against datacenter-level failures within a region by replicating your VM to a different Availability Zone in the same region. + +## Task 2: Simulate a zone-to-zone failover + +### Perform Test Failover + +1. Navigate to the Linux VM's Disaster Recovery blade +2. Select **Test failover** from the top menu +3. Choose a recovery point (typically "Latest" is selected by default) +4. Select the target virtual network in the same region +5. Start the test failover + +### Monitor Failover Progress + +1. Navigate to **Site Recovery jobs** in the Recovery Services Vault +2. Monitor the test failover job +3. Verify a test VM is created in the target Availability Zone + +### Validate the Test VM + +1. Check the Virtual Machines list +2. Verify the test VM is running in a different Availability Zone +3. Optional: Connect to the test VM to validate functionality + +### Cleanup Test Failover + +1. Return to the Disaster Recovery blade +2. Select **Cleanup test failover** +3. Add notes about the test results +4. Complete the cleanup to remove the test VM + +## Success Criteria Validation βœ… + +Confirm you have completed: +- βœ… Enabled disaster recovery for the Linux VM between Availability Zones +- βœ… Successfully performed a test failover to another Availability Zone +- βœ… Validated the test VM functionality +- βœ… Cleaned up the test failover resources + +You have successfully completed Challenge 4! πŸš€ + +## Additional Notes + +**Zone-to-Zone DR Benefits:** +- Protection against datacenter-level failures +- Lower latency than region-to-region replication +- Same-region data residency compliance +- Faster failover and failback operations + +**Best Practices:** +- Regularly test failover to ensure DR readiness +- Monitor replication health continuously +- Document recovery procedures +- Update recovery plans as infrastructure changes + diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-05/solution-05.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-05/solution-05.md new file mode 100644 index 000000000..92c7be8fa --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-05/solution-05.md @@ -0,0 +1,137 @@ +# Walkthrough Challenge 5 - Disaster Recovery (DR) across Azure Regions + +[Previous Challenge Solution](../challenge-04/solution-04.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-06/solution-06.md) + +⏰ Duration: 1 hour + +## Solution Overview + +This challenge focuses on implementing cross-region disaster recovery using Azure Site Recovery. You will replicate web VMs from Germany West Central (primary) to Sweden Central (secondary) and perform both test and production failovers to demonstrate DR capabilities across Azure regions. + +## Prerequisites + +Ensure the lab environment from Challenge 2 is successfully deployed with: +- Web VMs (`mh-web1` and `mh-web2`) in Germany West Central +- Recovery Services Vault in Sweden Central (`mh-swedencentral-asrvault`) +- Target resource group in Sweden Central + +## Task 1: Set up and enable disaster recovery with Azure Site Recovery + +### Enable Replication for Web VMs + +**Method 1: From Recovery Services Vault** + +1. Navigate to the Recovery Services Vault in Sweden Central (`mh-swedencentral-asrvault`) +2. Under **Protected Items**, select **Replicated Items** +3. Click **+ Replicate** and select **Azure virtual machines** +4. Configure replication settings: + - **Source region**: Germany West Central + - **Source resource group**: Select the resource group containing web VMs + - **Virtual machines**: Select `mh-web1` and `mh-web2` + - **Target location**: Sweden Central + - **Target resource group**: Select the target resource group in Sweden Central +5. Review replication settings and enable replication + +**Method 2: From Virtual Machine (Alternative)** + +1. Navigate to a web VM (e.g., `mh-web1`) +2. Select **Disaster recovery** from the left menu +3. Configure the target region as Sweden Central +4. Review and enable replication + +### Monitor Replication Progress + +1. Navigate to **Site Recovery jobs** in the Recovery Services Vault +2. Monitor the initial replication progress + - This may take 15-30 minutes to complete +3. Once complete, verify replication status shows as "Healthy" for both VMs + +## Task 2: Create a recovery plan and run a test failover + +### Create a Recovery Plan + +1. Navigate to the Recovery Services Vault in Sweden Central +2. Under **Manage**, select **Recovery Plans (Site Recovery)** +3. Click **+ Recovery plan** +4. Configure the recovery plan: + - **Name**: Enter a descriptive name (e.g., `web-app-recovery-plan`) + - **Source**: Germany West Central + - **Target**: Sweden Central + - **Select items**: Choose `mh-web1` and `mh-web2` +5. Click **OK** to create the plan + +### Run a Test Failover + +1. Navigate to the recovery plan created above +2. Click **Test failover** from the top menu +3. Configure test failover settings: + - **Recovery point**: Select the latest available recovery point + - **Azure virtual network**: Select a test virtual network in Sweden Central +4. Click **OK** to start the test failover + +### Monitor Test Failover Progress + +1. Navigate to **Site Recovery jobs** +2. Monitor the test failover job progress +3. Once complete, verify test VMs are created in Sweden Central + +### Cleanup Test Failover + +1. Return to the recovery plan +2. Click **Cleanup test failover** +3. Add notes documenting the test results +4. Click **Complete** to remove test resources + +## Task 3: Run a production failover + +### Initiate Production Failover + +1. Navigate to the recovery plan +2. Click **Failover** from the top menu +3. Configure failover settings: + - **Failover direction**: From Germany West Central to Sweden Central + - **Recovery point**: Select the desired recovery point + - **Shut down machines before beginning failover**: Check this option if possible (recommended) +4. Confirm and start the failover + + +### Verify Failover Completion + +1. Navigate to **Virtual Machines** in the Azure Portal +2. Verify the web VMs are now running in Sweden Central +3. Check the VM status and confirm they are operational + +### Commit the Failover + +After verifying the failover was successful: + +1. Return to the recovery plan +2. Click **Commit** to finalize the failover +3. This removes the ability to fail back to alternative recovery points + +## Success Criteria Validation βœ… + +Confirm you have completed: +- βœ… Enabled replication for `mh-web1` and `mh-web2` to Sweden Central +- βœ… Created a recovery plan for the web application +- βœ… Successfully performed a test failover with zero production impact +- βœ… Cleaned up test failover resources +- βœ… Completed a production failover to Sweden Central +- βœ… Verified VMs are running in the secondary region + +You have successfully completed Challenge 5! πŸš€ + +## Additional Notes + +**Cross-Region DR Best Practices:** +- Test failover regularly to ensure DR readiness +- Document RTO (Recovery Time Objective) and RPO (Recovery Point Objective) +- Keep recovery plans up to date with infrastructure changes +- Consider network connectivity and dependencies during failover +- Plan for failback procedures after regional recovery + +**Important Considerations:** +- Production failover will stop the source VMs (if shutdown option is selected) +- After failover, you may need to reconfigure networking, DNS, and load balancers +- Commit the failover only after thorough validation in the target region +- Plan for reprotection if you want to enable failback capability diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-06/solution-06.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-06/solution-06.md new file mode 100644 index 000000000..2a662c05b --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-06/solution-06.md @@ -0,0 +1,132 @@ +# Walkthrough Challenge 6 - Restore Web Application and verify Azure Storage DR + +[Previous Challenge Solution](../challenge-05/solution-05.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-07/solution-07.md) + +⏰ Duration: 45 minutes + +## Solution Overview + +This challenge focuses on re-establishing web application connectivity after the DR failover to Sweden Central and verifying that Azure Storage Account disaster recovery is properly configured with GRS. You will add the failed-over VMs to the load balancer and test storage account failover. + +## Prerequisites + +Ensure Challenge 5 is completed with: +- Web VMs (`mh-web1` and `mh-web2`) failed over and running in Sweden Central +- Load Balancer configured in the environment +- Storage Account with GRS enabled + +## Task 1: Re-establish connection to the Web Application + +After failing over the VMs to Sweden Central, the web application needs to be reconnected by adding the failed-over VMs to the load balancer's backend pool. + +### Add Failed-Over VMs to Load Balancer Backend Pool + +1. Navigate to the **Load Balancer** in Sweden Central +2. Go to **Backend pools** in the left menu +3. Select the backend pool for the web application +4. Click **+ Add** to add virtual machines +5. Select the failed-over web VMs: + - `mh-web1` (failed-over instance in Sweden Central) + - `mh-web2` (failed-over instance in Sweden Central) +6. Save the configuration + +### Verify Load Balancer Configuration + +1. Confirm both VMs are listed in the backend pool +2. Check the health probe status to ensure VMs are responding +3. Verify the load balancing rules are properly configured + +### Test Web Application Connectivity + +1. Navigate to the Load Balancer's frontend IP address or DNS name +2. Access the web application through the load balancer +3. Verify the application is responding correctly +4. Confirm the application shows it's running from the Sweden Central region +5. Refresh multiple times to verify load balancing across both VMs + +> **Success!** You have successfully re-established the web application in the secondary region after DR failover. + +## Task 2: Disaster Recovery for Azure Storage Account + +### Verify GRS Configuration + +1. Navigate to the **Storage Account** in Germany West Central (primary region) +2. Select **Redundancy** from the left menu +3. Verify that **Geo-redundant storage (GRS)** is enabled +4. Identify the secondary region for data replication + - The secondary region is automatically paired (typically Germany North for Germany West Central) +5. Note the last sync time to verify replication is active + +> **Note:** With GRS, Azure automatically replicates your data to a secondary region that is hundreds of miles away from the primary region. + +### Understanding GRS Replication + +**Key Points:** +- Data is replicated asynchronously to the paired region +- The secondary region is read-only by default (use RA-GRS for read access) +- Replication provides protection against regional disasters +- RPO (Recovery Point Objective) is typically less than 15 minutes + +### Perform Storage Account Failover Test + +> **Important:** Storage account failover should only be performed when the primary region is unavailable. This is a destructive operation that makes the secondary region the new primary. + +1. In the Storage Account, go to **Redundancy** or **Geo-replication** +2. Review the failover warnings and implications: + - Failover typically takes less than an hour + - Data loss may occur if the last sync was not recent + - After failover, the account becomes LRS (locally redundant) in the new primary region +3. If performing a test (in a test environment only): + - Click **Prepare for failover** + - Review the impact and confirm + - Monitor the failover process +4. After failover completes, verify: + - The storage account is now primary in the secondary region + - Data is accessible from the new primary region + - Redundancy type has changed to LRS + +> **Caution:** In a production environment, only perform storage account failover when the primary region is genuinely unavailable. + +### Verify Data Accessibility + +1. Navigate to the storage account containers +2. List the blobs/files to verify data integrity +3. Attempt to read/download a file to confirm accessibility +4. Check that all containers and data are present + +## Success Criteria Validation βœ… + +Confirm you have completed: +- βœ… Added failed-over VMs to the load balancer backend pool in Sweden Central +- βœ… Successfully accessed the web application through the load balancer +- βœ… Verified the web application is operational in the secondary region +- βœ… Confirmed GRS is enabled on the Storage Account +- βœ… Identified the secondary region used for storage replication +- βœ… Understood the storage account failover process +- βœ… (Optional) Performed a storage account failover test + +You have successfully completed Challenge 6! πŸš€ + +## Additional Notes + +**Load Balancer Best Practices:** +- Always configure health probes to monitor backend VM health +- Use session persistence if your application requires it +- Monitor load balancer metrics for traffic distribution +- Plan for scaling by adjusting backend pool capacity + +**Storage Account GRS Considerations:** +- GRS provides at least 99.99999999999999% (16 nines) durability of objects over a given year +- Use RA-GRS if you need read access to secondary region data +- Monitor last sync time to understand potential data loss window +- Storage account failover is a manual operation - plan and test carefully +- After failover, the account becomes LRS in the new primary region +- You must reconfigure to GRS/RA-GRS if you want geo-redundancy restored + +**Disaster Recovery Best Practices:** +- Document the complete recovery procedure +- Test the entire DR process regularly +- Monitor all components after failover +- Have a communication plan for stakeholders +- Plan for failback once the primary region is recovered + diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-07/solution-07.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-07/solution-07.md new file mode 100644 index 000000000..509d21df5 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-07/solution-07.md @@ -0,0 +1,207 @@ +# Walkthrough Challenge 7 - Failback to the Primary Region (Germany West Central) + +[Previous Challenge Solution](../challenge-06/solution-06.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-08/solution-08.md) + +⏰ Duration: 1 hour 30 minutes + +## Solution Overview + +This challenge focuses on failing back the web application and storage account from Sweden Central (secondary) to Germany West Central (primary) after a disaster recovery event. You will reprotect VMs, perform failback, verify Traffic Manager, and restore the storage account to the primary region. + +## Prerequisites + +Ensure Challenges 5 and 6 are completed with: +- Web VMs (`mh-web1` and `mh-web2`) running in Sweden Central after DR failover +- Recovery Services Vault in both regions +- Traffic Manager configured +- Storage Account failed over to secondary region + +## Task 1: Failback Web Application VMs to Germany West Central + +### Step 1: Reprotect the VMs + +Before you can fail back, you must reprotect the VMs to enable reverse replication from Sweden Central back to Germany West Central. + +1. Navigate to the **Recovery Services Vault** in Sweden Central +2. Go to **Protected Items** > **Replicated Items** +3. Select each web VM (`mh-web1`, `mh-web2`) +4. Click **Re-protect** from the top menu +5. Review the automatically configured settings: + - Azure Site Recovery automatically configures the target as the original source location + - Target region will be Germany West Central (the original source) + - Target resource group, VNet, and other settings are auto-selected based on original configuration +6. Click **OK** to start reprotection + +### Monitor Reprotection Progress + +1. Navigate to **Site Recovery jobs** +2. Monitor the reprotection job for each VM +3. Wait until synchronization reaches 100% + - This may take 30-60 minutes depending on data changes +4. Verify replication health shows as "Healthy" + +> **Important:** You cannot fail back until reprotection is complete and synchronization is at 100%. + +### Step 2: Perform Failback + +Once reprotection is complete: + +1. Navigate to the **Recovery Plan** or individual VM's disaster recovery blade +2. Click **Failover** from the top menu +3. Configure failover settings: + - **Failover direction**: From Sweden Central to Germany West Central + - **Recovery point**: Select the latest recovery point + - **Shut down machines**: Check this option to minimize data loss +4. Confirm and start the failover + +### Monitor Failback Progress + +1. Navigate to **Site Recovery jobs** +2. Monitor the failover job progress +3. Wait for completion (typically 15-30 minutes) +4. Verify VMs are running in Germany West Central + +### Step 3: Commit the Failback + +After verifying the VMs are operational in Germany West Central: + +1. Return to the disaster recovery blade or recovery plan +2. Click **Commit** to finalize the failback +3. This completes the failback operation + +### Step 4: Re-enable DR Protection + +After failback and commit, the VMs are in Germany West Central but not yet protected: + +1. Navigate to each VM in Germany West Central +2. Go to **Disaster recovery** +3. Click **Enable disaster recovery** to reconfigure replication to Sweden Central +4. Follow the replication setup process to protect the VMs again +5. Wait for initial replication to complete + +> **Note:** After failback and commit, replication is not automatically re-enabled. You must manually configure DR protection again to ensure business continuity. + +## Task 2: Verify Traffic Manager and Web Application + +### Check Traffic Manager Endpoint Status + +1. Navigate to **Traffic Manager profile** in the Azure Portal +2. Go to **Endpoints** +3. Verify the Germany West Central endpoint status: + - Status should show as "Online" + - Health probe should be passing +4. Check that traffic is being routed to the primary region + +### Test Web Application Connectivity + +1. Access the web application using the Traffic Manager DNS name +2. Verify the application is responding correctly +3. Confirm the application shows it's running from Germany West Central +4. Test multiple times to ensure consistent routing to the primary region + +> **Success!** The web application is now operational in the primary region with Traffic Manager routing traffic correctly. + +## Task 3: Failback Storage Account to Germany West Central + +### Understand Storage Account Failback + +After a storage account failover, the account is converted to LRS in the new primary region (formerly secondary). To fail back: + +> **Important:** Storage account failover is intended for disaster recovery scenarios. After failover, the account becomes LRS and the original primary region becomes the secondary after reconfiguration. + +### Reconfigure Storage Redundancy + +1. Navigate to the **Storage Account** (now primary in the secondary region) +2. Go to **Redundancy** settings +3. Change redundancy from LRS to GRS or GZRS + - This re-establishes geo-replication + - The original primary region (Germany West Central) becomes the new secondary +4. Wait for initial synchronization to complete +5. Monitor the **Last sync time** to verify replication is active + +> **Note:** Once reconfigured to GRS, data begins replicating to Germany West Central (now the secondary region). + +### Initiate Storage Account Failover (Back to Original Primary) + +1. After GRS synchronization is complete and stable: + - Go to **Redundancy** blade +2. Click **Prepare for failover** to fail over to Germany West Central +3. Review the warnings: + - This will make Germany West Central the primary region again + - Data loss is possible if last sync is not recent + - The failover takes approximately 1 hour +4. Confirm the failover + +### Monitor Storage Failback + +1. Monitor the failover progress (typically takes 30-60 minutes) +2. Wait for completion notification +3. Verify the storage account is now primary in Germany West Central + +### Verify Data Integrity + +After failback completes: + +1. Navigate to storage account containers +2. List blobs/files and verify all data is present +3. Test read/write operations to confirm functionality +4. Compare file counts and sizes with pre-disaster records +5. Validate that applications can access storage successfully + +### Reconfigure Storage Redundancy (Post-Failback) + +1. After failover completes, the storage account is LRS in Germany West Central +2. Go to **Redundancy** settings +3. Change from LRS to GRS or GZRS +4. This re-establishes geo-redundant protection +5. The paired region will again serve as the secondary for geo-replication + +> **Important:** Each time you perform a storage account failover, the redundancy reverts to LRS. You must reconfigure geo-redundancy after each failover. + +## Success Criteria Validation βœ… + +Confirm you have completed: +- βœ… Reprotected web VMs for reverse replication to Germany West Central +- βœ… Successfully failed back VMs from Sweden Central to Germany West Central +- βœ… Verified VMs are operational in the primary region +- βœ… Re-enabled disaster recovery protection with Sweden Central as secondary +- βœ… Traffic Manager shows Germany West Central endpoint as "Online" +- βœ… Web application is accessible and routing through Traffic Manager to primary region +- βœ… Storage Account has been failed back to Germany West Central +- βœ… Verified data integrity and accessibility after storage failback +- βœ… Reconfigured GRS for continued geo-redundant protection + +You have successfully completed Challenge 7! πŸš€ + +## Additional Notes + +**Failback Best Practices:** +- Always reprotect VMs before attempting failback +- Wait for 100% synchronization before initiating failback +- Test thoroughly in the primary region before committing +- Plan for a maintenance window as failback requires VM shutdown +- Document the entire failback procedure for future reference + +**Storage Account Failback Considerations:** +- After initial failover, the account becomes LRS in the new primary region +- Reconfigure to GRS to re-establish replication (original primary becomes new secondary) +- Monitor last sync time before initiating the second failover +- Second failover back to original primary takes approximately 1 hour +- After failover completes, the account is always LRS - must reconfigure to GRS again +- Test data integrity thoroughly after failover +- Consider the impact: two failovers means extended period of LRS (no geo-redundancy) + +**Post-Failback Actions:** +- Reconfigure all disaster recovery protections +- Update documentation with lessons learned +- Review and optimize recovery time objectives (RTO) +- Schedule regular DR drills +- Verify all dependent services and applications are functioning +- Update runbooks based on actual failback experience + +**Important Reminders:** +- After failback, you must re-enable replication to maintain DR capability +- Monitor replication health continuously +- Keep recovery plans updated with infrastructure changes +- Ensure Traffic Manager health probes are properly configured +- Document any issues encountered during failback for future improvements \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-08/solution-08.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-08/solution-08.md new file mode 100644 index 000000000..d7b41b5c4 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-08/solution-08.md @@ -0,0 +1,283 @@ +# Optional: Challenge 8 - Monitoring and Alerting for BCDR Operations + +[Previous Challenge Solution](../challenge-07/solution-07.md) - **[Home](../../Readme.md)** - [Congratulations](../../challenges/finish.md) + +⏰ Duration: 45 minutes + +## Solution Overview + +This challenge focuses on implementing comprehensive monitoring and alerting for your Azure Backup and Azure Site Recovery operations. You will configure diagnostic settings, explore monitoring dashboards, and leverage Azure Business Continuity Center for unified BCDR reporting across your environment. + +## Prerequisites + +Ensure previous challenges are completed with: +- Recovery Services Vaults in both Germany West Central and Sweden Central +- Backup Vaults configured +- Log Analytics workspace deployed in your infrastructure +- Protected VMs with Azure Backup and Azure Site Recovery configured + +## Part 1: Configure Azure Backup Monitoring & Reporting + +### Configure Diagnostic Settings for Recovery Services Vault + +1. Navigate to the **Recovery Services Vault** in Germany West Central +2. In the left menu, go to **Diagnostic settings** +3. Click **+ Add diagnostic setting** +4. Configure the diagnostic setting: + - **Name**: Enter a descriptive name (e.g., `backup-diagnostics`) + - **Logs**: Select **All logs** (this includes both Azure Backup and Azure Site Recovery logs) + - Or select specific categories like: + - `AzureBackupReport` + - `CoreAzureBackup` + - `AddonAzureBackupJobs` + - `AddonAzureBackupAlerts` + - `AddonAzureBackupPolicy` + - `AddonAzureBackupStorage` + - `AddonAzureBackupProtectedInstance` + - **Destination details**: Check **Send to Log Analytics workspace** + - Select your Log Analytics workspace +5. Click **Save** + +> **Note:** Repeat this configuration for the Recovery Services Vault in Sweden Central if you want comprehensive monitoring across both regions. + +> **Important:** After configuration, it takes up to 24 hours for initial data to populate in Log Analytics and reports. + +### Explore Recovery Services Vault Monitoring + +1. In the Recovery Services Vault, navigate to **Monitoring** section +2. Explore the **Backup Jobs** blade: + - View all backup jobs (in-progress, completed, failed) + - Filter by date range, job type, and status + - Click on individual jobs to view detailed information +3. Navigate to **Backup Alerts**: + - View active alerts and warnings + - Configure alert notifications + - Review historical alerts +4. Check **Backup Items**: + - View all protected items and their backup status + - Verify last successful backup time + - Check backup health status + +### Configure Azure Monitor Alerts for Backup + +Azure Backup provides built-in Azure Monitor alerts that can be enabled for specific scenarios: + +1. In the Recovery Services Vault, go to **Monitoring** > **Alerts** +2. Review the built-in alert types available: + - Backup job failures + - Restore job failures + - Backup health issues +3. To enable alerts, go to **Monitoring** > **Alerts** > **View + Set up** +4. Configure action groups for notifications: + - Click **+ Create** > **Action group** + - Configure notification channels (email, SMS, webhook, Logic App, etc.) + - Assign the action group to alert rules +5. Enable specific built-in alerts: + - Select the scenarios you want to be alerted on + - Associate with your action group + - Set severity levels as appropriate + +> **Note:** Azure Backup uses built-in alerts that are pre-configured. You enable them and configure where notifications should be sent via action groups. + +### Access Azure Business Continuity Center (Resiliency) + +1. In the Azure Portal, search for **Azure Business Continuity Center** (or **Resiliency**) +2. Navigate to the service +3. Explore the **Overview** dashboard: + - View protected resources across subscriptions + - See backup health summary + - Review recent jobs and alerts +4. Go to **Reports** section: + - **Backup Summary**: Overview of all protected items + - **Backup Jobs**: Detailed job history and trends + - **Backup Items**: List of all backed-up resources + - **Backup Policies**: Policy assignment and compliance + - **Backup Storage**: Storage consumption trends +5. Filter reports by: + - Subscription + - Resource group + - Location + - Time range + +> **Note:** Reports require data to be sent to Log Analytics. Initial data may take 24+ hours to appear. + +### Explore Built-in Backup Dashboards + +Backup reports are accessed through Azure Business Continuity Center (configured with Log Analytics workspace): + +1. Navigate to **Azure Business Continuity Center** or **Backup Center** +2. Go to **Reports** (requires diagnostic settings configured to Log Analytics) +3. View pre-built reports: + - **Backup Summary**: High-level overview of backup operations + - **Jobs**: Detailed job execution history + - **Alerts**: Alert trends and patterns + - **Backup Items**: Protected resource inventory + - **Usage**: Storage consumption analysis + - **Policy**: Policy compliance and coverage + +Alternatively, in the Recovery Services Vault: +1. Navigate to **Monitoring** section to view: + - **Backup Jobs**: Real-time job monitoring + - **Backup Alerts**: Active alerts and notifications + - **Backup Items**: Protected items status + +## Part 2: Configure Azure Site Recovery (ASR) Monitoring + +### Verify ASR Diagnostic Settings + +1. Navigate to the **Recovery Services Vault** in Sweden Central (or Germany West Central) +2. Go to **Diagnostic settings** +3. If you selected **All logs** in Part 1, ASR logs are already configured +4. If not, add or edit diagnostic setting: + - Select ASR-specific log categories: + - `AzureSiteRecoveryJobs` + - `AzureSiteRecoveryEvents` + - `AzureSiteRecoveryReplicatedItems` + - `AzureSiteRecoveryReplicationStats` + - `AzureSiteRecoveryRecoveryPoints` + - `AzureSiteRecoveryReplicationDataUploadRate` + - `AzureSiteRecoveryProtectedDiskDataChurn` + - Send to the same Log Analytics workspace +5. Save the configuration + +> **Tip:** Replicate the same diagnostic settings configuration to both Recovery Services Vaults (primary and secondary regions) for comprehensive monitoring. + +### Explore Azure Site Recovery Dashboard + +1. In the Recovery Services Vault, go to **Site Recovery** section +2. Navigate to **Site Recovery dashboard**: + - View replication health overview + - Check replicated items status + - Monitor test failover readiness +3. Explore **Replicated items**: + - View all replicated VMs + - Check replication health (Healthy, Warning, Critical) + - Verify RPO (Recovery Point Objective) compliance + - Review last recovery point time +4. Check **Site Recovery jobs**: + - View ongoing and historical ASR jobs + - Monitor replication, failover, and test failover jobs + - Investigate failed jobs for troubleshooting + +### Review Infrastructure View + +1. In the Recovery Services Vault, go to **Site Recovery infrastructure** +2. Navigate to **Azure virtual machines**: + - View replication topology + - See source and target regions + - Check Azure Site Recovery components (cache storage accounts, target networks) +3. Review **Recovery Plans**: + - View configured recovery plans + - Check protected VMs in each plan + - Verify recovery plan health + +> **Note:** For Azure VM to Azure VM replication, configuration servers and process servers are not used. These components are only for VMware/physical server to Azure scenarios. + +### Understand Built-in Azure Monitor Alerts for ASR + +Azure Site Recovery has several built-in alerts that automatically monitor your replication health: + +**Key ASR Alert Types:** +1. **Replication health critical**: Triggered when VM replication health is critical +2. **Test failover not performed**: Alert when test failover is overdue +3. **RPO threshold breached**: When RPO exceeds configured threshold +4. **High data change rate**: When source VM data churn is unusually high +5. **Site Recovery job failed**: Triggered on replication, failover, or failback job failures + +### Review Azure Monitor Alerts for ASR + +1. Navigate to **Azure Monitor** in the Azure Portal +2. Go to **Alerts** +3. Filter by: + - **Resource type**: Recovery Services vaults + - **Subscription**: Your subscription +4. Review existing ASR alerts: + - Check alert rules created automatically by ASR + - Review alert severity levels + - Examine action groups configured for notifications +5. Explore alert history: + - View fired alerts + - Check resolution status + - Analyze alert patterns and trends + +### Query ASR Data in Log Analytics (Optional) + +1. Navigate to your **Log Analytics workspace** +2. Go to **Logs** +3. Run sample queries to analyze ASR data: + +```kusto +// View all Site Recovery jobs in the last 7 days +AzureDiagnostics +| where Category == "AzureSiteRecoveryJobs" +| where TimeGenerated > ago(7d) +| project TimeGenerated, OperationName, ResultType, JobId_g, JobStatus_s +| order by TimeGenerated desc +``` + +```kusto +// Check replication health for protected VMs +AzureDiagnostics +| where Category == "AzureSiteRecoveryReplicatedItems" +| where TimeGenerated > ago(1d) +| project TimeGenerated, replicationHealth_s, ProtectedItemName_s, FailoverHealth_s +| order by TimeGenerated desc +``` + +```kusto +// View RPO for replicated items +AzureDiagnostics +| where Category == "AzureSiteRecoveryReplicatedItems" +| where TimeGenerated > ago(1h) +| project TimeGenerated, ProtectedItemName_s, Rpo_s +| order by TimeGenerated desc +``` + +## Success Criteria Validation βœ… + +Confirm you have completed: +- βœ… Configured diagnostic settings for Recovery Services Vault(s) to send logs to Log Analytics +- βœ… Explored backup job monitoring and alert interfaces in the Recovery Services Vault +- βœ… Accessed Azure Business Continuity Center and reviewed backup reports +- βœ… Configured Azure Monitor alerts for backup job failures +- βœ… Verified ASR diagnostic settings are enabled and sending logs to Log Analytics +- βœ… Explored Azure Site Recovery dashboard including replication health and infrastructure view +- βœ… Reviewed built-in Azure Monitor alerts for Azure Site Recovery +- βœ… Understood the types of events monitored by ASR alerts +- βœ… (Optional) Queried ASR data in Log Analytics for custom insights + +You have successfully completed Challenge 8! πŸš€ + +## Additional Notes + +**Monitoring Best Practices:** +- Configure diagnostic settings for all Recovery Services Vaults +- Use a centralized Log Analytics workspace for unified monitoring +- Set up action groups for critical alerts (email, SMS, webhook) +- Review monitoring dashboards regularly +- Leverage Azure Business Continuity Center for cross-subscription visibility +- Create custom Log Analytics queries for specific insights +- Schedule regular reviews of backup and replication health + +**Alert Configuration Tips:** +- Configure multiple notification channels for critical alerts +- Set appropriate severity levels based on business impact +- Use action groups to route alerts to the right teams +- Test alert notifications to ensure they're working +- Document alert response procedures +- Review and tune alert thresholds based on operational experience + +**Reporting Considerations:** +- Initial data population takes 24+ hours after diagnostic configuration +- Reports show data with a slight delay (not real-time) +- Use Azure Business Continuity Center for comprehensive cross-resource reporting +- Custom Log Analytics queries provide the most flexibility +- Consider exporting reports to Power BI for advanced visualizations +- Schedule regular report reviews with stakeholders + +**Log Analytics Retention:** +- Default retention is 30 days (configurable up to 730 days) +- Balance retention needs with storage costs +- Archive older logs if long-term retention is required +- Use log queries efficiently to minimize query costs +- Consider data export for long-term archival needs diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/001.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/001.png deleted file mode 100644 index 02aa98fb0..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/001.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/002.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/002.png deleted file mode 100644 index e20f293c6..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/002.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/003.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/003.png deleted file mode 100644 index 1d190307f..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/003.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/004.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/004.png deleted file mode 100644 index e53e9ba67..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/004.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/005.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/005.png deleted file mode 100644 index 645cc034e..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/005.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/006.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/006.png deleted file mode 100644 index 042bddf2d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/006.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/007.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/007.png deleted file mode 100644 index a7f2089e5..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/007.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/008.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/008.png deleted file mode 100644 index d0186f477..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/008.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/009.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/009.png deleted file mode 100644 index 48cd7c6e1..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/009.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/010.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/010.png deleted file mode 100644 index ce8ec0219..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/010.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/011.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/011.png deleted file mode 100644 index f91b8e293..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/011.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/012.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/012.png deleted file mode 100644 index 64f37bcf7..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/012.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/013.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/013.png deleted file mode 100644 index f502aec38..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/013.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/014.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/014.png deleted file mode 100644 index 472972ea8..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/014.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/015.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/015.png deleted file mode 100644 index a7f883f42..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/015.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/016.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/016.png deleted file mode 100644 index af92e4bf7..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/016.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/017.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/017.png deleted file mode 100644 index e55c602a3..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/017.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/018.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/018.png deleted file mode 100644 index 1d5fc16fb..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/018.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/019.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/019.png deleted file mode 100644 index d3a7c6a82..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/019.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/020.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/020.png deleted file mode 100644 index bcd8017ee..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/020.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/021.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/021.png deleted file mode 100644 index 7372c6af5..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/021.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/022.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/022.png deleted file mode 100644 index 04eb69788..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/022.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/023.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/023.png deleted file mode 100644 index c9f9d2653..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/023.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/024.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/024.png deleted file mode 100644 index 38926e43a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/024.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/025.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/025.png deleted file mode 100644 index a2aadb106..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/025.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/026.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/026.png deleted file mode 100644 index 081415aa9..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/026.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/027.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/027.png deleted file mode 100644 index 2408a1b35..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/027.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/028.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/028.png deleted file mode 100644 index e9bcbb6db..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/028.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/029.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/029.png deleted file mode 100644 index 58bb0d39f..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/029.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/030.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/030.png deleted file mode 100644 index 1b457ea09..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/030.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/031.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/031.png deleted file mode 100644 index b267e152b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/031.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/Source_Target.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/Source_Target.png deleted file mode 100644 index 442b5c7dc..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/Source_Target.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/solution.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/solution.md deleted file mode 100644 index d60d7e629..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/img/deployment/solution.md +++ /dev/null @@ -1,75 +0,0 @@ -# Step-by-Step Deployment Guide - -⏰ Duration: 20 minutes - -πŸ“‹ [Challenge 1 Instructions](../../../../challenges/01_challenge.md) - -This guide will help you deploy the lab environment using the provided ARM templates. - -## Prerequisites - -- Azure subscription -- Access to the ARM templates: `deploy.json` and `main.parameters.json` - -## Steps - -### Step 1: Navigate to Azure Portal - -1. Open your web browser and go to the [Azure Portal](https://portal.azure.com). - -### Step 2: Deploy from a Template - -1. In the Azure Portal, search for "Deploy a custom template" in the search bar and select it. - ![Search for Deploy a custom template](./1.png) - -2. Click on the "Build your own template in the editor" button. - ![Build your own template](./2.png) - -### Step 3: Upload the ARM Template - -1. Click on the "Load file" button. - ![Load file](3load.png) - -2. Select the `deploy.json` file from your local machine and upload it. -> **Note:** The `deploy.json` file is available in the GitHub repository. You can access it directly via [this link](https://github.com/microsoft/MicroHack/tree/main/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native) or navigate to the path: `.\04_BCDR_Azure_Native\Infra\App1`. Alternatively, you can download it from the repository. - -3. Click on the "Save" button to proceed. - ![Save template](./4save.png) - -### Step 4: Configure the Deployment - -1. Fill in the required fields such as Subscription, Resource Group, and Region. - -2. Click on "Edit parameters" to upload the `main.parameters.json` file. -> **Note:** The `main.parameters.json` file is available in the GitHub repository. You can access it directly via [this link](https://github.com/microsoft/MicroHack/tree/main/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native) or navigate to the path: `.\04_BCDR_Azure_Native\Infra\App1`. Alternatively, you can download it from the repository. - ![Edit parameters](./5parameter.png) - -3. Click on the "Load file" button and select the `main.parameters.json` file from your local machine. - ![Upload parameters](./6parameter.png) - -4. Click on the "Save" button to proceed. - ![Save parameters](./7save.png) - -### Step 5: Review and Create - -1. Review the settings and ensure everything is correct. - ![Review settings](./8deploy.png) - -2. Click on the "Review + create" button. - -3. Finally, click on the "Create" button to start the deployment. - ![Review and create](./9deploy.png) - -### Step 6: Monitor the Deployment - -1. You can monitor the deployment process in the "Notifications" section of the Azure Portal. - ![Monitor deployment](./10resources.png) - -2. Once the deployment is complete, you will see a notification indicating the success of the deployment. - ![Deployment success](./11deploymentcomplete.png) - -Congratulations! You have successfully deployed the lab environment using the ARM templates. - -![New Virtual Machines](./12.png) - -[➑️ Next Challenge 2 Instructions](../../../../challenges/02_challenge.md) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/solution.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/solution.md deleted file mode 100644 index a30ba2c3a..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-1/solution.md +++ /dev/null @@ -1,111 +0,0 @@ -# Walkthrough Challenge 1 - Prerequisites and landing zone preparation - -⏰ Duration: 20 minutes - -πŸ“‹ [Challenge 1 Instructions](../../challenges/01_challenge.md) - -**[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-2/solution.md) ➑️ - -## Prerequisites - -Please ensure that you successfully verified the [General prerequisits](../../Readme.md#general-prerequisites) before continuing with this challenge. - -### Task 1: Create Azure Resources in region Germany West Central - -Sign in to the [Azure Portal](https://portal.azure.com/). - -#### Create Resource Group -[Create Resource Group | Microsoft Learn](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#create-resource-groups) -![image](./img/001.png) -![image](./img/002.png) -![image](./img/003.png) - -#### Create Recovery Services Vault -[Create Recovery Services vault | Microsoft Learn](https://learn.microsoft.com/azure/backup/backup-create-recovery-services-vault) - -###### Basics -![image](./img/004.png) - -###### Redundancy -![image](./img/005.png) - -###### Encryption -![image](./img/006.png) - -###### Vault properties -![image](./img/007.png) - -###### Networking -![image](./img/008.png) - -###### Tags -![image](./img/009.png) - -###### Review + Create -![image](./img/010.png) - -#### Create Storage Account -[Create Storage Account | Microsoft Learn](https://learn.microsoft.com/azure/storage/common/storage-account-create) - -###### Basics -Storage Account Names need to be unique in a region, so please add a suffix to the generic name mhstweu - -![image](./img/011.png) - -###### Advanced -Advanced settings don't need to be modified for this Micro Hack - -![image](./img/012.png) -![image](./img/013.png) - -###### Networking -![image](./img/014.png) - -###### Data protection -![image](./img/015.png) - -###### Encryption -![image](./img/016.png) - -###### Tags -![image](./img/017.png) - -###### Review -![image](./img/018.png) -![image](./img/019.png) - -### Task 2: Create Azure Resources in region Sweden Central -#### Create Resource Group -[Create Resource Group | Microsoft Learn](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#create-resource-groups) -![image](./img/020.png) -![image](./img/021.png) -![image](./img/022.png) - -#### Create Recovery Services Vault - -###### Basics -![image](./img/023.png) - -###### Redundancy -![image](./img/024.png) - -###### Encryption -![image](./img/025.png) - -###### Vault properties -![image](./img/026.png) - -###### Networking -![image](./img/027.png) - -###### Tags -![image](./img/028.png) - -###### Review + Create -![image](./img/029.png) - -## You successfully completed challenge 1! πŸš€πŸš€πŸš€ -###### Resources in region 1 -![image](./img/030.png) -###### Resources in region 2 -![image](./img/031.png) diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/006.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/006.png deleted file mode 100644 index 349be2321..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/006.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/007.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/007.png deleted file mode 100644 index 9f333c2ee..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/007.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/007a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/007a.png deleted file mode 100644 index da3dad186..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/007a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/008.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/008.png deleted file mode 100644 index cc524bb86..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/008.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/008a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/008a.png deleted file mode 100644 index 0556ed5ab..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/008a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/009.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/009.png deleted file mode 100644 index 9e2389c73..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/009.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/010.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/010.png deleted file mode 100644 index e1ad267dd..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/010.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019.png deleted file mode 100644 index 143bdfe96..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019a.png deleted file mode 100644 index 13072f057..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019b.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019b.png deleted file mode 100644 index beba97493..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019b.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019c.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019c.png deleted file mode 100644 index 63793e292..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/019c.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/020.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/020.png deleted file mode 100644 index 987f62145..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/020.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/022.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/022.png deleted file mode 100644 index fcdded947..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/022.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/023.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/023.png deleted file mode 100644 index 8535405f5..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/023.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/024.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/024.png deleted file mode 100644 index 6eac0ee22..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/024.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/025.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/025.png deleted file mode 100644 index d96bf1131..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/025.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/026.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/026.png deleted file mode 100644 index a7572f5b8..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/026.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/027.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/027.png deleted file mode 100644 index 0af94e5e6..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/027.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/028.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/028.png deleted file mode 100644 index ea4a3b3bd..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/028.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/029.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/029.png deleted file mode 100644 index cd54501fa..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/029.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/043d.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/043d.png deleted file mode 100644 index 7b4242dfd..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/043d.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/056.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/056.png deleted file mode 100644 index 4d2b129d8..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/056.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/057.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/057.png deleted file mode 100644 index 26234cf4e..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/057.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/060.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/060.png deleted file mode 100644 index e55afd528..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/060.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/061a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/061a.png deleted file mode 100644 index 0b9abc5ae..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/061a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/061b.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/061b.png deleted file mode 100644 index 917f86de9..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/061b.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/062.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/062.png deleted file mode 100644 index 9ec962447..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/062.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/063.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/063.png deleted file mode 100644 index 3e023db1e..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/063.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/063a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/063a.png deleted file mode 100644 index 11db8680e..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/063a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/064.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/064.png deleted file mode 100644 index c3b69fc88..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/064.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/065.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/065.png deleted file mode 100644 index f5035bd5b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/065.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/066.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/066.png deleted file mode 100644 index 4147f1030..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/066.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/067.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/067.png deleted file mode 100644 index 04d9b677b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/067.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068.png deleted file mode 100644 index 4038de846..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068a.png deleted file mode 100644 index 7e5b3e61b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068b.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068b.png deleted file mode 100644 index 58cd5f141..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068b.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068c.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068c.png deleted file mode 100644 index 2361d59e6..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/068c.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/069.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/069.png deleted file mode 100644 index 508bca0e3..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/069.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/071.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/071.png deleted file mode 100644 index 2d8e310fb..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/071.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072.png deleted file mode 100644 index b47cc3b2b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072a.png deleted file mode 100644 index cef8fc24d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072b.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072b.png deleted file mode 100644 index 4913d8594..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072b.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072c.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072c.png deleted file mode 100644 index 938a751f7..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/072c.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/073.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/073.png deleted file mode 100644 index e94b73608..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/073.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/074.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/074.png deleted file mode 100644 index 35d019468..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/074.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/075.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/075.png deleted file mode 100644 index 9973a5058..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/075.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/076.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/076.png deleted file mode 100644 index 7b3ece132..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/076.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/077.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/077.png deleted file mode 100644 index baa9627ba..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/077.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/078.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/078.png deleted file mode 100644 index 22ca05e18..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/078.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/079.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/079.png deleted file mode 100644 index c7d0b1365..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/079.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/080.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/080.png deleted file mode 100644 index 8fa49385b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/080.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/081.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/081.png deleted file mode 100644 index e9d0383de..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/081.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/082.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/082.png deleted file mode 100644 index d143b7b75..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/082.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/083.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/083.png deleted file mode 100644 index b2c45f642..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/083.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/31.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/31.png deleted file mode 100644 index df5b6d14a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/31.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/35.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/35.png deleted file mode 100644 index 9bceedb7a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/35.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/36.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/36.png deleted file mode 100644 index 7a6cd6887..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/36.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-22 190922.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-22 190922.png deleted file mode 100644 index 6fe622f8d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-22 190922.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-23 000330.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-23 000330.png deleted file mode 100644 index 84c1eb26a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-23 000330.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-23 022557.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-23 022557.png deleted file mode 100644 index e7213e66c..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-23 022557.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-24 214312.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-24 214312.png deleted file mode 100644 index 5cbfd3e3b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-02-24 214312.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-11-08 174855.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-11-08 174855.png deleted file mode 100644 index d66071b01..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-11-08 174855.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-11-09 173236.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-11-09 173236.png deleted file mode 100644 index 5ef8d1ed5..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/Screenshot 2025-11-09 173236.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-01.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-01.png deleted file mode 100644 index 5cee27ffd..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-01.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-02.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-02.png deleted file mode 100644 index 5b8433ddd..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-02.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-03.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-03.png deleted file mode 100644 index 18798cb49..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-03.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-09.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-09.png deleted file mode 100644 index 72fc730f1..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-09.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-10.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-10.png deleted file mode 100644 index 1ed75762c..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-10.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-11.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-11.png deleted file mode 100644 index 5456f8143..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-11.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-12.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-12.png deleted file mode 100644 index 9ed414c83..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-12.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-25.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-25.png deleted file mode 100644 index 4813eef99..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-25.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-29.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-29.png deleted file mode 100644 index cdbbab706..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-29.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-30.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-30.png deleted file mode 100644 index dbe8ce709..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-30.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-31.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-31.png deleted file mode 100644 index 4edd0743b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-31.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-71.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-71.png deleted file mode 100644 index 5398298ec..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-71.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-710.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-710.png deleted file mode 100644 index 7c67269d5..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-710.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-711.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-711.png deleted file mode 100644 index bb509f94e..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-711.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-712.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-712.png deleted file mode 100644 index 6e32dfff0..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-712.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-713.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-713.png deleted file mode 100644 index 2623e31f5..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-713.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-714.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-714.png deleted file mode 100644 index 5f4112bdc..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-714.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-715.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-715.png deleted file mode 100644 index 1e84c957d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-715.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-716.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-716.png deleted file mode 100644 index 8b83c6179..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-716.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-717.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-717.png deleted file mode 100644 index 480190ce3..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-717.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-72.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-72.png deleted file mode 100644 index b1369dc0f..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-72.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-73.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-73.png deleted file mode 100644 index 6c489260b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-73.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-74.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-74.png deleted file mode 100644 index f6ebf23da..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-74.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-75.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-75.png deleted file mode 100644 index 63f3ab15a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-75.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-76.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-76.png deleted file mode 100644 index e7dbe5d8a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-76.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-77.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-77.png deleted file mode 100644 index 586315862..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-77.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-78.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-78.png deleted file mode 100644 index 7a417d176..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-78.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-79.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-79.png deleted file mode 100644 index bfd768052..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/mh-ch2-screenshot-79.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/001.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/001.png deleted file mode 100644 index 306937425..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/001.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/002.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/002.png deleted file mode 100644 index e47033b5b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/002.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/003.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/003.png deleted file mode 100644 index 8c6a0d93a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/003.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/004.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/004.png deleted file mode 100644 index 0e4ac3339..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/004.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/005.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/005.png deleted file mode 100644 index 072646b38..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/005.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/005a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/005a.png deleted file mode 100644 index dcd4de957..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/005a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/011.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/011.png deleted file mode 100644 index fb67a1601..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/011.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/012.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/012.png deleted file mode 100644 index 6cbf223e3..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/012.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/012a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/012a.png deleted file mode 100644 index 8ce915853..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/012a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/012b.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/012b.png deleted file mode 100644 index b387bcde6..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/012b.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/013.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/013.png deleted file mode 100644 index b99a72c59..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/013.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/015.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/015.png deleted file mode 100644 index 7bba190e4..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/015.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/016.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/016.png deleted file mode 100644 index 861e0b293..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/016.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/017.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/017.png deleted file mode 100644 index df9a7923a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/017.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/018.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/018.png deleted file mode 100644 index 15c940cd0..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/018.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/074.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/074.png deleted file mode 100644 index 22ed6ab4d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/074.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/FWrule.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/FWrule.png deleted file mode 100644 index e28e7fa20..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/img/old/FWrule.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/solution.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/solution.md deleted file mode 100644 index c66116f09..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-2/solution.md +++ /dev/null @@ -1,376 +0,0 @@ -# Walkthrough Challenge 2 - Regional Protection and Disaster Recovery (DR) - -⏰ Duration: 1 Hour - -πŸ“‹ [Challenge 2 Instructions](../../challenges/02_challenge.md) - -## Prerequisites - -Ensure you have successfully completed [challenge 1](../../challenges/01_challenge.md) before proceeding. - -## Solution Walkthrough - -- [**Challenge 2.1 - Protect in Azure - Backup / Restore**](#challenge-21---protect-in-azure---backup--restore) - - [Task 1: Enable Azure Backup for Linux VM](#task-1-enable-azure-backup-for-linux-vm) - - [Task 2: Enable Azure Backup for Blobs](#task-2-enable-azure-backup-for-blobs) - - [Assign access permissions to perform backup](#enable-system-managed-identity-for-the-backup-vault-and-copy-the-mi-object-id) - - [Task 3: Restore a VM in Azure](#task-3-restore-a-vm-in-azure) -- [**Challenge 2.2 - Protect in Azure with Disaster Recovery (DR) within an Azure Region**](#challenge-22---protect-in-azure-with-disaster-recover-dr-within-an-azure-region) - - [Task 4: Set up disaster recovery for the Linux VM in the primary region](#task-4-set-up-disaster-recovery-for-the-linux-vm-in-the-primary-region) - - [Assign access permissions to perform disaster recovery](#enable-system-managed-identity-for-the-recovery-services-vault) - - [Task 5: Simulate a failover from one part of the primary region to another part within the same region](#task-5-simulate-a-failover-from-one-part-of-the-primary-region-to-another-part-within-the-same-region) - - -### Challenge 2.1 - Protect in Azure - Backup / Restore -In this challenge, you will onboard your Linux Virtual Machine to a centralized Recovery Services Vault and use Azure Backup Center to protect it with Azure Backup. - -* Task 1: Enable Azure Backup for Linux VM. -* Task 2: Enable Azure Backup for Blobs. -* Task 3: Restore a VM in Azure. - -If you have not created the Linux Machine successfully, follow this guide to create it on the portal: - -
-πŸ’‘ How-to: Deploy a Ubuntu Server VM in Azure Region Sweden Central -
- -### Choose OS -![image](./img/006.png) -> **Note:** Choose the source resource group. - -### Configure Details - Basics -![image](./img/007.png) -> **Note:** Choose the source resource group. - -### Configure Details - Basics (Option 2) -![image](./img/007a.png) - -Ensure the VM is in the public network and open Port 3389 to connect to it (or use Azure Bastion to access it). - -### Enable RDP Port -![image](./img/008.png) - -### Configure Details - Networking (Option 2) -![image](./img/008a.png) - -### Review Deployed VM -![image](./img/009.png) -![image](./img/010.png) - -
- -### Task 1: Enable Azure Backup for Linux VM - -#### Enable Azure Backup -![image](./img/030.png) - -Navigate to the **Backup** tab and proceed with **Backup now**. - -![image](./img/040.png) - -Backup job is started. - -![image](./img/031.png) - -The backup job includes **Take Snapshot** and **Transfer data to vault**. - -![progress](./img/032.png) - -#### Wait for Initial Backup of the VM - -This might take a while. - -![completed](./img/033.png) -![backup](./img/034.png) - -### Create a New Custom Policy - -Go to the Azure Site Recovery **ASR Vault** in the Primary Region (Germany West Central). - -![image](./img/041.png) - -Add a new Backup Policy. - -![Add Policy](./img/042.png) - -Add a new Backup Policy for Azure Virtual Machines. - -![Policy for Disks](./img/043.png) - -### Schedule Daily Backups - -Configure **daily** backup frequency. - -![image](./img/044.png) - -### Review Additional Deployment Options -- **Hourly** Backup Schedule (Optional) - -![image](./img/mh-ch2-screenshot-22.png) - -Review the configuration: -* Backup Schedule -* Backup Retention settings - -Proceed with **Create**. - -Backup Policy is successfully created! - -![image](./img/045.png) - - - -## Task 2: Enable Azure Backup for Blobs - -Go to the Storage Account in the Primary Region. - -![Storage Account](./img/050.png) - -
-πŸ’‘ Task 2: Enable Azure Backup for Blobs -
- -
-πŸ’‘ How-to: Create a Backup Vault (if not created during lab setup) -
- -### Create a Backup Vault (not a Recovery Service Vault) -![image](./img/mh-ch2-screenshot-71.png) - -
- -
-πŸ’‘ How-to: Create a Container -
- -![image](./img/019.png) -![image](./img/019a.png) -![image](./img/019b.png) -![image](./img/020.png) - -
-
- -> **Note:** To enable backup for the storage account, you need to grant the Backup Vault appropriate **access permissions**. Please follow the guidance below. - -### Enable System Managed Identity for the Backup Vault and Copy the MI Object ID - -Go to the Backup Vault in the Primary Region (Germany West Central) and navigate to the **Identity** tab. - -Status: **On** -![Identity Tab](./img/056.png) - -Enable system assigned managed identity: **yes** -![Enable MI](./img/057.png) - -Successfully enabled system assigned managed identity! -![Identity Tab](./img/058.png) - -Successfully enabled system assigned managed identity! -Now you can proceed with one of the two options below. -![Enable System Managed Identity](./img/059.png) - -### Solution Example 1 - **Azure role assignments** through MI Identity - -Click **Azure role assignments** to proceed with role assignment. -![Enable MI](./img/060.png) - -Select **scope**: you can select the specific Storage account Scope or larger scopes like the resource group or your subscription. - -Select Role ["Storage Account Backup Contributor"](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/storage#storage-account-backup-contributor). - -![Scope Selection](./img/061a.png) - -Role assignment successfully configured -![image](./img/061b.png) - -### Solution Example 2 - Assign the "Storage Account Backup Contributor" Role to the Backup Vault Managed Identity - -Go back to the Storage Account in the Primary Region (Germany West Central). Navigate to the **Access Control (IAM)** tab and add a role assignment. - -![image](./img/061.png) - -Select Role ["Storage Account Backup Contributor"](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/storage#storage-account-backup-contributor). - -![Storage Account Backup Contributor](./img/062.png) - -Under **Assign access to**, select **Managed Identity**. - -![MI](./img/063.png) - -Click **Select members** and choose the appropriate scope. - -![MI](./img/063a.png) - -Select the Managed Identity of the Backup Vault. - -![Backup Vault MI](./img/064.png) - -Review + Assign. - -![Review + Assign](./img/065.png) - -The Backup Vault now has the required permissions to perform backup operations on the storage account. -
- -## Enable Azure Backup for Blobs - -This will require creating a new backup policy: - -![Create New Policy](./img/051.png) -![Select Vault](./img/052.png) -![Create](./img/054.png) - -Backup Policy for storage successfully created! - -![Create](./img/055.png) - -
- -### Task 3: Restore a VM in Azure -- Backup job from Task 1 should be finished before proceeding here! - -#### Start Restore Procedure -![image](./img/035.png) - -#### Select Restore Point -![image](./img/036.png) - -#### Set Restore Properties - -Proceed with **Restore**. - -![image](./img/037.png) -![image](./img/038.png) -![image](./img/039.png) - -A new Virtual Machine `mh-linux-restore` has been created in the resource group, restored from the backup. - -![image](./img/070.png) - -You have successfully completed Challenge 2.1! πŸš€ - -## Challenge 2.2 - Protect in Azure with Disaster Recovery (DR) within an Azure Region -* **Task 4:** Set up disaster recovery for the Linux VM in the primary region. -* **Task 5:** Simulate a failover from one part of the primary region to another part within the same region. - -### Task 4: Set up disaster recovery for the Linux VM in the primary region. - -Enable Disaster Recovery (DR) between **Availability Zones** - -> **Note:** To enable disaster recovery (DR) between the regions, you might need to grant the Site Recovery Vault appropriate **access permissions**. If needed follow the instructions below. - -
-πŸ’‘ How-to: Access permissions for Disaster Recovery (DR) -
- -### Enable System Managed Identity for the Recovery Services Vault - -Navigate to the **Recovery Services Vault** in the Primary Region (Germany West Central) and select the **Identity** tab. - -**Status:** On -![image](./img/066.png) - -βœ… System-assigned managed identity successfully enabled! - -#### Assign Required Azure Roles - -Click **Azure role assignments** to begin configuring permissions. - -![image](./img/067.png) - -Click **Add role assignment** to add the first required role. - -![image](./img/068.png) - -#### Role Assignment 1: Storage Blob Data Contributor - -**Select scope:** -- Choose the specific Resource Group or a larger scope (e.g. your subscription) where disaster recovery will operate. - -**Select Role:** ["Storage Blob Data Contributor"](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/storage#storage-blob-data-contributor) - -![image](./img/068a.png) - -#### Role Assignment 2: Contributor - -Click **Add role assignment** again to add the second required role. - -![image](./img/068b.png) - -**Select scope:** -- Use the same scope as the previous role assignment. - -**Select Role:** ["Contributor"](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/privileged#contributor) - -![image](./img/068c.png) - -βœ… Successfully assigned all required permissions for disaster recovery (DR)! - -![image](./img/069.png) - -
-
- -Navigate to **mh-linux | Disaster recovery** - -Choose a different Availability Zone than the current one as **Target** - -![image](./img/071.png) - -Review and Start Replication - -![image](./img/074.png) - -Wait until the replication is finished - -![image](./img/075.png) - -The Linux Virtual Machine is protected with Azure Site Recovery between Availability Zones. - -![image](./img/076.png) - -### Task 5: Simulate a failover from one part of the primary region to another part within the same region. - -Conduct an unplanned failover - -![image](./img/077.png) - -![image](./img/078.png) - -![image](./img/079.png) - -![image](./img/080.png) - -![image](./img/081.png) - -![image](./img/082.png) - -![image](./img/083.png) - -You have successfully completed Challenge 2! πŸš€πŸš€ - -[➑️ Next Challenge 3 Instructions](../../challenges/03_challenge.md) - ---- - -## Troubleshooting & FAQ - -### Error: Installing Mobility Service and Preparing Target - -**Error ID:** `151192` - -**Error Message:** -``` -Site recovery configuration failed. -``` - -**Possible Causes:** -Connection cannot be established to Office 365 authentication and identity IPv4 endpoints. - -**Resolution:** -Allow outbound access to required Azure Site Recovery endpoints in your **Network Security Group (NSG)**, **firewall**, or **proxy** settings. -- Use service tags like `AzureActiveDirectory` and `Office365` for NSG rules. - -**Related Resources:** -- [Azure Site Recovery - Firewall and Proxy Guidance](https://aka.ms/a2a-firewall-proxy-guidance) diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/001.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/001.png deleted file mode 100644 index 0fc8908ea..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/001.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/002.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/002.png deleted file mode 100644 index be45eb5d9..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/002.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/003.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/003.png deleted file mode 100644 index 379daef61..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/003.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/004.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/004.png deleted file mode 100644 index 9cd49d084..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/004.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/005.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/005.png deleted file mode 100644 index 906f9f31c..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/005.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/006.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/006.png deleted file mode 100644 index 885269ee2..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/006.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/007.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/007.png deleted file mode 100644 index 663657c12..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/007.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/008.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/008.png deleted file mode 100644 index 04b968914..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/008.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/009.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/009.png deleted file mode 100644 index 85db05607..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/009.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/01.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/01.png deleted file mode 100644 index 44e21850a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/01.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/010.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/010.png deleted file mode 100644 index b3d815eca..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/010.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/011.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/011.png deleted file mode 100644 index e1678f6d5..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/011.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/01a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/01a.png deleted file mode 100644 index 9eed02f59..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/01a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/02.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/02.png deleted file mode 100644 index 4e5d61742..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/02.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/03.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/03.png deleted file mode 100644 index 946b0d76f..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/03.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/04.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/04.png deleted file mode 100644 index 82eb21820..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/04.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/040.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/040.png deleted file mode 100644 index 0152b6148..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/040.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/041.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/041.png deleted file mode 100644 index 9ee26134e..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/041.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/042.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/042.png deleted file mode 100644 index 7ff989450..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/042.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/043.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/043.png deleted file mode 100644 index 006965024..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/043.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/044.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/044.png deleted file mode 100644 index 254200d2f..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/044.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/045.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/045.png deleted file mode 100644 index e03b75611..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/045.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/05.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/05.png deleted file mode 100644 index acddeb791..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/05.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/06.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/06.png deleted file mode 100644 index a45be48f0..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/06.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/07.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/07.png deleted file mode 100644 index 7475a9d76..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/07.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/08.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/08.png deleted file mode 100644 index a8439cb06..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/08.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/09.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/09.png deleted file mode 100644 index 20166f4c6..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/09.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/10.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/10.png deleted file mode 100644 index e7a22b2bc..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/10.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/100.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/100.png deleted file mode 100644 index ff3ea0ab8..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/100.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/11.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/11.png deleted file mode 100644 index 60cf74779..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/11.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/12.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/12.png deleted file mode 100644 index 664285af3..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/12.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/13.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/13.png deleted file mode 100644 index 2bcd25c32..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/13.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/14.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/14.png deleted file mode 100644 index d35c9d0b9..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/14.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/15.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/15.png deleted file mode 100644 index 3c1902c64..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/15.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/16.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/16.png deleted file mode 100644 index 8e6137a40..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/16.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/17.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/17.png deleted file mode 100644 index b4e2c962d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/17.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/18.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/18.png deleted file mode 100644 index dbcb25c9c..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/18.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/19.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/19.png deleted file mode 100644 index 2ed3e6ce1..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/19.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/20.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/20.png deleted file mode 100644 index 7a130a535..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/20.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/21.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/21.png deleted file mode 100644 index aa43e97d3..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/21.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/22.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/22.png deleted file mode 100644 index 7cd1a1297..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/22.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/23.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/23.png deleted file mode 100644 index 5d0239122..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/23.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/24.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/24.png deleted file mode 100644 index 00776bd7b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/24.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/25.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/25.png deleted file mode 100644 index 631fa4e53..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/25.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/26.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/26.png deleted file mode 100644 index deeaaa187..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/26.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/27.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/27.png deleted file mode 100644 index 18a78018f..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/27.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/28.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/28.png deleted file mode 100644 index 5cfee58b0..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/28.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/29.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/29.png deleted file mode 100644 index 80dfae6f0..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/29.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/30.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/30.png deleted file mode 100644 index 6c427d3cd..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/30.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/31.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/31.png deleted file mode 100644 index a6ab41b81..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/31.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/32.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/32.png deleted file mode 100644 index 82b78e837..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/32.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/33.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/33.png deleted file mode 100644 index 1b11703c5..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/33.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/3a.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/3a.png deleted file mode 100644 index 0e58448f1..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/3a.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-01.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-01.png deleted file mode 100644 index aa495cce8..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-01.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-02.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-02.png deleted file mode 100644 index 4fc03c242..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-02.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-03.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-03.png deleted file mode 100644 index ec47cd759..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-03.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-04.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-04.png deleted file mode 100644 index 9c25d3f48..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-04.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-05.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-05.png deleted file mode 100644 index 277a0bfbc..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-05.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-06.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-06.png deleted file mode 100644 index 47a6cf29d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-06.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-07.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-07.png deleted file mode 100644 index dfa79b46a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-07.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-08.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-08.png deleted file mode 100644 index ad5096b3c..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-08.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-09.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-09.png deleted file mode 100644 index c996d857f..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-09.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-10.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-10.png deleted file mode 100644 index ce215ed33..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-10.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-11.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-11.png deleted file mode 100644 index 70847148f..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-11.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-12.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-12.png deleted file mode 100644 index 5b798158a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-12.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-13.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-13.png deleted file mode 100644 index 2145ea9b2..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-13.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-14.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-14.png deleted file mode 100644 index d88deba7d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-14.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-15.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-15.png deleted file mode 100644 index 1613e0824..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-15.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-16.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-16.png deleted file mode 100644 index b4471b69e..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-16.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-17.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-17.png deleted file mode 100644 index b981bd3e2..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-17.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-18.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-18.png deleted file mode 100644 index 21ed6fe6e..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-18.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-19.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-19.png deleted file mode 100644 index 74d59208d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-19.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-20.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-20.png deleted file mode 100644 index 388e02f18..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-20.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-21.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-21.png deleted file mode 100644 index 484489227..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-21.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-22.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-22.png deleted file mode 100644 index d5e5726a2..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-22.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-23.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-23.png deleted file mode 100644 index fb1f4e4af..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-23.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-24.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-24.png deleted file mode 100644 index a79f2d52b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-24.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-25.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-25.png deleted file mode 100644 index 9fee04dcb..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-25.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-26.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-26.png deleted file mode 100644 index 93fe01bfc..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-26.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-27.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-27.png deleted file mode 100644 index 65537ec5d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-27.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-28.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-28.png deleted file mode 100644 index 777fa6596..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-28.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-29.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-29.png deleted file mode 100644 index 457ec498b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/img/mh-ch-screenshot-29.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/sol/1.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/sol/1.png deleted file mode 100644 index e85df5758..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/sol/1.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/solution.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/solution.md deleted file mode 100644 index 07b2c75ab..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-3/solution.md +++ /dev/null @@ -1,207 +0,0 @@ -# Walkthrough Challenge 3 - Protect in Azure with Disaster Recovery (Inter-regional) - -⏰ Duration: 1 hour 15 minutes - -πŸ“‹ [Challenge 3 Instructions](../../challenges/03_challenge.md) - -## Prerequisites - -Please ensure that you successfully passed [challenge 2](../../challenges/02_challenge.md) before continuing with this challenge. - -In this challenge, you will learn how to protect Azure VM with Azure Site Recovery, and enable replication to the secondary site. Moreover, you will successfully run the test & production failover and failback between two regions. - -## Solution Walkthrough - -| Challenge | Tasks | -|-----------|-------| -| **Challenge 3 - Protect in Azure with Disaster Recovery (Inter-regional)** | 1. Enable replication with Azure Site Recovery for the Virtual Machine in the Germany West Central Region to the Sweden Central Region
2. Create a recovery plan and run a disaster recovery drill
3. Run a production failover from Germany West Central to Sweden Central and failback again from Sweden to Germany region | - -- [Task 1: Enable replication with Azure Site Recovery](#task-1-enable-replication-with-azure-site-recovery-for-the-virtual-machine-in-the-germany-west-central-region-to-the-sweden-central-region) - - [Access permissions for multi-region Disaster Recovery (DR)](#enable-system-managed-identity-for-the-recovery-services-vault) - - [Enable replication with Azure Site Recovery](#task-1-enable-replication-with-azure-site-recovery-for-the-virtual-machine-in-the-germany-west-central-region-to-the-sweden-central-region) -- [Task 2: Create a recovery plan and Run a disaster recovery drill](#task-2-create-a-recovery-plan-and-run-a-disaster-recovery-drill) - - [Create a recovery plan](#create-a-recovery-plan) - - [Run the test failover](#run-the-test-failover-from-germany-west-central-to-the-sweden-central-region) - - [Monitor the progress](#monitor-the-progress) - - [Cleanup test failover](#cleanup-test-failover) -- [Task 3: Run a production failover and failback](#task-3-run-a-production-failover-from-germany-west-central-to-sweden-central-and-failback-again-from-sweden-to-germany-region-source-environment-and-monitor-the-progress) - - [Run the production failover](#run-the-production-failover-for-the-web-application-from-germany-west-central-to-sweden-central) - - [Reprotect the virtual machine](#reprotect-the-virtual-machine) - -### Actions - -* Task 1: Set up and enable disaster recovery with Azure Site Recovery and monitor the progress. -* Task 2: Perform a disaster recovery drill, create recovery plan and run a test failover. -* Task 3: Run a production failover from Germany West Central to Sweden Central region and failback again from Sweden to Germany. - -## Task 1: Enable replication with Azure Site recovery for the Virtual Machine in the Germany West Central Region to the Sweden Central Region - -> **Note:** To enable disaster recovery (DR) between the regions, you might need to grant the Site Recovery Vault appropriate **access permissions**. If needed follow the instructions below. - -
-πŸ’‘ How-to: Access permissions for inter-regional Disaster Recovery (DR) -
- -### Enable System Managed Identity for the Recovery Services Vault - -Navigate to the **Recovery Services Vault** in the **Secondary Region** (Sweden Central) and select the **Identity** tab. - -**Status:** On -![image](./img/040.png) - -βœ… System-assigned managed identity successfully enabled! - -#### Assign Required Azure Roles - -- Click **Azure role assignments** to begin configuring permissions. - -Click **Add role assignment** to add the first required role. -![image](./img/041.png) - -#### Role Assignment 1: Storage Blob Data Contributor - -**Select scope:** -- Choose the specific Resource Groups (primary + secondary regions) or a larger scope (e.g. your subscription) where disaster recovery will operate. - -**Select Role:** ["Storage Blob Data Contributor"](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/storage#storage-blob-data-contributor) - -![image](./img/042.png) - -#### Role Assignment 2: Contributor - -Click **Add role assignment** again to add the second required role. - -![image](./img/043.png) - -**Select scope:** -- Use the same scope as the previous role assignment. - -**Select Role:** ["Contributor"](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/privileged#contributor) - -![image](./img/044.png) - -βœ… Successfully assigned all required permissions for multi-region disaster recovery (DR)! - -![image](./img/045.png) - -
-
- -
-πŸ’‘ Enable replication with Azure Site recovery for the Virtual Machine in the Germany West Central Region to the Sweden Central Region -
- -Navigate to **Recovery Services Vault** in the Sweden Central (mh-swedencentral-asrvault) which we created in the first Challenge. In the **Protected Items**, select **Replicated Items**. Then select **Replicate** and from the dropdown list select **Azure virtual machines**. The following pane will apprear: - -![image](./img/001.png) - -![image](./img/002.png) - -![image](./img/003.png) - -![image](./img/004.png) - -![image](./img/005.png) - -![image](./img/006.png) - -In the deployment notification you could navigate to the Site Recovery Jobs which lists all Site Recovery Actions you have created in this task. - -![image](./img/007.png) - -You can select in progress jobs to check the status and progress. - -![image](./img/008.png) - -This Task can take up to 10 minutes to finish. - -![image](./img/009.png) - -![image](./img/011.png) - -![image](./img/010.png) - -### Alternative: Disaster recovery can be set also under Virtual Machine | Disaster Recovery - -![image](./img/100.png) - -
- -## Task 2: Create a recovery plan and Run a disaster recovery drill - -### Create a recovery plan -Navigate to **Recovery Services Vault** in the Sweden Central (mh-swedencentral-asrvault). Under **Manage**, select **Recovery Plans (Site Recovery)** and create a recovery plan. - -![image](./img/09.png) - -Select `mh-web1` and `mh-web2` as the protected source machine and create the recovery plan. - -![image](./img/10.png) - -### Run the test failover from Germany West Central to the Sweden Central Region -Navigate to the recovery plan created in the previous task. - -![image](./img/11.png) - -From the top menu select **Test failover**. - -![image](./img/12.png) - - -![image](./img/13.png) - -### Monitor the progress -Navigate to **Site Recovery Jobs** and select Test failover job which is in progress. - -![image](./img/14.png) - - -![image](./img/15.png) - -![image](./img/16.png) - -After all jobs are finished successully, Navigate to the Virtual Machines list. New Virtual Machine has been created in the Sweden Central Region. - -![image](./img/17.png) - -### Cleanup test failover -![image](./img/18.png) - -![image](./img/19.png) - -![image](./img/20.png) - -![image](./img/21.png) - -![image](./img/22.png) - -## Task 3: Run a production failover from Germany West Central to Sweden Central and failback again from Sweden to Germany region (Source environment) and monitor the progress -### Run the production failover for the web application from Germany West Central to Sweden Central -![image](./img/23.png) - -![image](./img/24.png) - -![image](./img/25.png) - -![image](./img/26.png) - -Check the virtual machine list. There is a new virtual machine running in Sweden Central region. - -![image](./img/27.png) - -### Reprotect the virtual machine -![image](./img/28.png) - -![image](./img/29.png) - -![image](./img/30.png) - -![image](./img/31.png) - -![image](./img/32.png) - -![image](./img/33.png) - -**You successfully completed challenge 3!** πŸš€πŸš€πŸš€ - -[➑️ Next Challenge 4 Instructions](../../challenges/04_challenge.md) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/01.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/01.png deleted file mode 100644 index 10c8dad01..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/01.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/02.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/02.png deleted file mode 100644 index 86f5cf46a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/02.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/027.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/027.png deleted file mode 100644 index 963bee9df..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/027.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/028.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/028.png deleted file mode 100644 index b13ffc459..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/028.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/029.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/029.png deleted file mode 100644 index 47a6a9781..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/029.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/030.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/030.png deleted file mode 100644 index a69cf3339..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/030.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/031.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/031.png deleted file mode 100644 index 6e05a9a14..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/031.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/10.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/10.png deleted file mode 100644 index e28e7fa20..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/10.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/11.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/11.png deleted file mode 100644 index 0a4a65f1d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/11.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/12.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/12.png deleted file mode 100644 index e97b454c2..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/12.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/13.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/13.png deleted file mode 100644 index 51c34e0ab..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/13.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/16.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/16.png deleted file mode 100644 index 55bacddb7..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/16.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/asrdemo architecture.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/asrdemo architecture.png deleted file mode 100644 index d544113a6..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/img/asrdemo architecture.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/solution.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/solution.md deleted file mode 100644 index e288d95c9..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-4/solution.md +++ /dev/null @@ -1,71 +0,0 @@ -# Walkthrough Challenge 4 - Protect your Azure PaaS (Azure SQL Database and Storage Account) with Disaster recovery - -⏰ Duration: 50 minutes - -πŸ“‹ [Challenge 4 Instructions](../../challenges/04_challenge.md) - -## Prerequisites - -Please ensure that you successfully passed [challenge 3](../../challenges/03_challenge.md) before continuing with this challenge. - -In challenge 4, you will focus on implementing disaster recovery strategies for Azure storage accounts using replication. The primary objective is to ensure business continuity by protecting critical data stored in Azure storage accounts against potential disasters. - -### Actions -* Task 1: Re-establish your connection to the Web Application from the secondary region. - * Add your failed-over Virtual Machines in the secondary region to the backend pool of your Load Balancer. - * Test the connection to the Web Application. - * High Availability & SLA Discussion -* Disaster Recovery for Azure Storage Account: - * Task 2: Set up and configure Azure Storage Account replication to another region using Geo-redundant storage (GRS) or Geo-zone-redundant storage (GZRS) to ensure data availability in case of regional outages. - * Task 3: Perform a failover test for the storage account to validate the disaster recovery setup. - - -# Solution - -## Task 1: Re-establish your connection to the Web Application from the secondary region - -![image](./img/027.png) - -Add your failed-over Virtual Machines in the secondary region to the backend pool of your Load Balancer. - -![image](./img/028.png) - -![image](./img/029.png) - -![image](./img/030.png) - -Test the connection to the Web Application. - -![image](./img/031.png) - -You have successfully failed-over the Web Application! - -## Disaster Recovery for Azure Storage Account - -## Task 2: Set up and configure Azure Storage Account replication to another region using Geo-redundant storage (GRS) or Geo-zone-redundant storage (GZRS) to ensure data availability in case of regional outages. - -Navigate to the **Azure Storage Account** in the Germany West Central Region. Open the tab **Redundancy**: -![image](./img/01.png) - -### Choose Geo-redundant storage (GRS) as redundancy option. This will enable cross-replication of your storage account with the paired region Germany North. -![image](./img/02.png) - -### You can see now Germany North as the Secondary Region of the Storage Account: -![image](./img/11.png) - -### Learning resources -* [Geo-redundant storage (GRS) for cross-regional durability](https://learn.microsoft.com/en-us/azure/storage/common/storage-redundancy-grs) -* [Disaster recovery and storage account failover](https://learn.microsoft.com/en-us/azure/storage/common/storage-disaster-recovery-guidance) -* [Microsoft Learn - Azure Cross-region replication](https://learn.microsoft.com/en-us/azure/reliability/cross-region-replication-azure#cross-region-replication) - -## Task 3: Perform a failover test for the storage account to validate the disaster recovery setup. - -### Run the test failover from Germany West Central to the Sweden Central Region -![image](./img/12.png) - -### Failover Completed -![image](./img/13.png) - -**You successfully completed challenge 4!** πŸš€πŸš€πŸš€ - -[➑️ Next Challenge 5 Instructions](../../challenges/05_challenge.md) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/001.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/001.png deleted file mode 100644 index 88737e226..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/001.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/002.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/002.png deleted file mode 100644 index 34da807b9..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/002.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/01.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/01.png deleted file mode 100644 index da7b25dbd..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/01.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/08.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/08.png deleted file mode 100644 index 5869ffba1..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/08.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/09.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/09.png deleted file mode 100644 index 2b8d658d9..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/09.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/13.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/13.png deleted file mode 100644 index 51c34e0ab..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/13.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/14.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/14.png deleted file mode 100644 index 8e493d8b6..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/14.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/15.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/15.png deleted file mode 100644 index 19d0d912d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/15.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/16.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/16.png deleted file mode 100644 index 55bacddb7..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/16.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/17.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/17.png deleted file mode 100644 index 9878ed680..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/17.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/18.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/18.png deleted file mode 100644 index 912e11b07..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/18.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/19.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/19.png deleted file mode 100644 index a43f72267..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/19.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/20.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/20.png deleted file mode 100644 index 3c0e461a0..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/20.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/21.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/21.png deleted file mode 100644 index d3ceccd57..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/21.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/22.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/22.png deleted file mode 100644 index 5cadeddd1..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/22.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/23.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/23.png deleted file mode 100644 index 4d547e96a..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/23.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/mh-ch-screenshot-27.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/mh-ch-screenshot-27.png deleted file mode 100644 index 65537ec5d..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/mh-ch-screenshot-27.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/mh-ch-screenshot-28.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/mh-ch-screenshot-28.png deleted file mode 100644 index 777fa6596..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/mh-ch-screenshot-28.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/mh-ch-screenshot-29.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/mh-ch-screenshot-29.png deleted file mode 100644 index 457ec498b..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/img/mh-ch-screenshot-29.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/solution.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/solution.md deleted file mode 100644 index a75afadc4..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-5/solution.md +++ /dev/null @@ -1,74 +0,0 @@ -# Walkthrough Challenge 5 - Failback to the primary region (Germany West Central) - -⏰ Duration: 50 minutes - -πŸ“‹ [Challenge 5 Instructions](../../challenges/05_challenge.md) - -## Prerequisites - -Please ensure that you successfully passed [challenge 4](../../Readme.md#challenge-4) before continuing with this challenge. - -In this challenge, you will have failback again the VM, SQL DB from Sweden central to Germany West Central. The storage account should be failed back to Germany West Central as well. - -### Actions -* Task 1: Failback the Web Application from Sweden Central to Germany West Central region (Source environment) and monitor the progress. -* Task 2: Failback Storage Account to Germany West Central. -* Restore a VM in Azure. - -# Solution - -## Disaster Recovery for Azure Virtual Machines - -## Task 1: Failback the VM from Sweden to Germany region (Source environment) and monitor the progress - -### Ensure the VM has been Re-protected (this is done in challenge 3) -![image](./img/01.png) - -* [Azure Site Recovery - How to reprotect](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-how-to-reprotect) - -### Run the failback for the VM from Sweden Central Region to Germany West Central -You can't fail back the VM until the replication has completed, and synchronization is 100% completed. The synchronization process can take several minutes to complete. -After the Synchronization completes, select **Failover**. - -![image](./img/mh-ch-screenshot-27.png) - -![image](./img/mh-ch-screenshot-28.png) - -Check the Virtual machine list. Server01 is running again in the Germany West Central region. - -![image](./img/mh-ch-screenshot-29.png) - -## Disaster Recovery for Azure Storage Account - -## Task 3: Failback Storage Account to Germany West Central - -### Navigate to the **Azure Storage Account** -![image](./img/17.png) - -### Open the tab **Redundancy**: -![image](./img/18.png) - -### If not configured, choose Geo-redundant storage (GRS) as redundancy option. This will enable cross-replication of your storage account with the paired region Germany West Central. -![image](./img/13.png) -![image](./img/14.png) - -### You can see now Germany West Central as the Secondary Region of the Storage Account: -![image](./img/15.png) - -## Perform a failover test for the storage account to validate the disaster recovery setup. - -### Run the test failover from Germany North to the Germany West Central Region -![image](./img/19.png) - -### Failover Completed -![image](./img/23.png) - -**You successfully completed challenge 5!** πŸš€πŸš€πŸš€ - -### Learning resources -* [Azure Site Recovery - How to reprotect](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-how-to-reprotect) -* [Azure Site Recovery - Failback](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-tutorial-failback) -* [Azure Site Recovery - Enable Replication](https://learn.microsoft.com/en-us/azure/site-recovery/azure-to-azure-tutorial-enable-replication) -* [Testing for disaster recovery](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-test-failover-to-azure) - -[➑️ Next Challenge 6 Instructions](../../challenges/06_challenge.md) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/01_App_Insights_dashboards.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/01_App_Insights_dashboards.png deleted file mode 100644 index cef625465..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/01_App_Insights_dashboards.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/03.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/03.png deleted file mode 100644 index 3bce0caae..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/03.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/04.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/04.png deleted file mode 100644 index c0669f555..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/04.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/05.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/05.png deleted file mode 100644 index cee4fa17e..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/05.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/06.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/06.png deleted file mode 100644 index 82e8861a6..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/06.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/07.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/07.png deleted file mode 100644 index 91e11f278..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/07.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/08.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/08.png deleted file mode 100644 index 5869ffba1..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/08.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/09.png b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/09.png deleted file mode 100644 index 2b8d658d9..000000000 Binary files a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/img/09.png and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/solution.md b/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/solution.md deleted file mode 100644 index 08b318784..000000000 --- a/03-Azure/01-03-Infrastructure/04_BCDR_Azure_Native/walkthrough/challenge-6/solution.md +++ /dev/null @@ -1,68 +0,0 @@ -# Walkthrough Extra Challenge 6 - Protect to Azure with Azure Backup & Restore - -## Implement Failover Groups for Azure SQL Database - -## Task 1: Create a Failover Group between two Azure SQL databases located in different Azure regions (Germany West central and Sweden Central) - -Navigate to the **SQL Server** in the Germany West Central Region. Open the tab **Failover groups**: -![image](./img/03.png) - -### Create a Failover Group and select your **SQL Server** in the Sweden Central Region -![image](./img/04.png) - -## Task 2: Configure automatic failover policies and test the failover mechanism to ensure seamless transition in case of a disaster. -Open the created **Failover group** -![image](./img/05.png) - -### Test failover -![image](./img/06.png) - -### When the failover is complete, you should see **SQL Server** in Sweden Central as the Primary server. -![image](./img/07.png) - -### Open the Data Science Virtual Machine, and test the connection to the Server using the new **fail over group listener endpoint**: -![image](./img/08.png) - -### Connection established! -![image](./img/09.png) - ---- - -## Connect to the Virtual Machine in order to test connection to SQL Database and storage container in the upcoming tasks. - -Reader can refer to the [Previous Challenge Solution](../challenge-3/solution.md) to remember how to failover. - -## Disaster Recovery for Azure SQL Database - -## Task 2: Failback to Germany West Central Region - -### Navigate to the **SQL Server**. Open the created **Failover group**: -![image](./img/20.png) - -### Failback to Germany West Central Region -![image](./img/21.png) - -### **SQL Server** in Germany West Central is now the Primary server. -![image](./img/22.png) - -### Open the Data Science Virtual Machine, and test the connection to the Server using the **fail over group listener endpoint**: -![image](./img/08.png) - -### Connection secured! -![image](./img/09.png) - ---- - -## Check connection and restore your sample file. - -### From the Data Science Virtual Machine, use **Microsoft Azure Storage Explorer** to restore your file: -![image](./img/16.png) - ---- - -## Check connection and restore your sample file. - -### From the Data Science Virtual Machine, use **Microsoft Azure Storage Explorer** to restore your file: -![image](./img/16.png) - ---- \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/Readme.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/Readme.md index 909c5b97a..abfc066cf 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/Readme.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/Readme.md @@ -67,286 +67,31 @@ In order to use the MicroHack time most effectively, the following prerequisites With these pre-requisites in place, we can focus on building the differentiated knowledge in Azure Migrate that is required when working with the product. -## Challenge 1 - Prerequisites and landing zone preparation -> [!IMPORTANT] -> **Many of the resource deployments in this Microhack are adapted from the [Jumpstart ArcBox for IT Pros](https://jumpstart.azure.com/azure_jumpstart_arcbox/ITPro). Special thanks to the [Jumpstart Team](https://aka.ms/arcjumpstart) for their excellent work.** -### Goal +## Challenges -- Deploy a *source* resource group with one VM acting as the Hyper-V host and their dependencies that act as our physical on-premise server which hosts the workloads that will be migrated to Azure. -- Deploy a *destination* resource group to which the servers will be migrated. +* [Challenge 1 - Prerequisites and landing zone preparation](challenges/challenge-01.md) **<- Start here** +* [Challenge 2 - titDiscover physical servers for the migrationle](challenges/challenge-02.md) +* [Challenge 3 - Create a Business Case](challenges/challenge-03.md) +* [Challenge 4 - Assess VMs for the migration](challenges/challenge-04.md) +* [Challenge 5 - Migrate machines to Azure](challenges/challenge-05.md) +* [Optional Challenge 6 - Secure on Azure](challenges/challenge-06.md) +* [Optional Challenge 7 - Modernize with Azure](challenges/challenge-07.md) +* [Optional Challenge 8 - Deploy AI chat in App Service](challenges/challenge-08.md) -### Actions +## Solutions - Spoilerwarning -- Deploy the [Bicep configuration](./resources) of the Micro Hack. +* [Solution 1 - Prerequisites and landing zone preparation](./walkthrough/challenge-01/solution-01.md) +* [Solution 2 - Discover physical servers for the migration](./walkthrough/challenge-02/solution-02.md) +* [Solution 3 - Create a Business Case](./walkthrough/challenge-03/solution-03.md) +* [Solution 4 - Assess VMs for the migration](./walkthrough/challenge-04/solution-04.md) +* [Solution 5 - Migrate machines to Azure](./walkthrough/challenge-05/solution-05.md) +* [Optional Solution 6 - Secure on Azure](./walkthrough/challenge-06/solution-06.md) +* [Optional Solution 7 - Modernize with Azure](./walkthrough/challenge-07/solution-07.md) +* [Optional Solution 8 - Deploy AI chat in App Service](./walkthrough/challenge-08/solution-08.md) -### Success criteria -- You have understood the concept and architecture for the MicroHack. -- The Bicep deployment command exits successfully. -- The *source* and *destination* resource group is visible in the Azure Portal. - -### Learning resources - -- [What is Bicep?](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-1/solution.md) - -## Challenge 2 - Discover physical servers for the migration - -### Goal - -The goal of this exercise is to... - -* Setup Azure Migrate Project in Azure -* Installing / Deploying the necessary setup for discovery -* Create a discovery - -### Actions - -* Create a Azure Migrate Project -> [!IMPORTANT] -> To be able to create a Business Case, make sure to select Europe as the Geography for the Azure Migrate Project -* Deploy a Azure Migrate Appliance -* Create a continuous discovery of your source environment - -### Success criteria - -* You have created a Azure Migrate Project -* You have successfully deployed the Azure Migrate Appliance -* You successfully registered the Azure Migrate Appliance with the Azure Migrate Project -* You have successfully setup a continuous discovery for the Hyper-V host. -* You have successfully verified the discovered servers in the portal - -### Learning resources -* [Create and managed Azure Migrate projects](https://learn.microsoft.com/en-us/azure/migrate/create-manage-projects) -* [Setup and appliance on VMWare](https://learn.microsoft.com/en-us/azure/migrate/how-to-set-up-appliance-vmware) -* [Setup and appliance on Hyper-V](https://learn.microsoft.com/en-us/azure/migrate/how-to-set-up-appliance-hyper-v) -* [Steup an appliance for physical servers](https://learn.microsoft.com/en-us/azure/migrate/how-to-set-up-appliance-physical) -* [Before you start / general prerequisites](https://learn.microsoft.com/en-us/azure/migrate/how-to-discover-applications#before-you-start) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-2/solution.md) - -## Challenge 3 - Create a Business Case - -The Business case capability helps you build a business proposal to understand how Azure can bring the most value to your business. - -It highlights: - -- On-premises vs Azure total cost of ownership. -- Year on year cashflow analysis. -- Resource utilization based insights to identify servers and workloads that are ideal for cloud. -- Quick wins for migration and modernization including end of support Windows OS and SQL versions. -- Long term cost savings by moving from a capital expenditure model to an Operating expenditure model, by paying for only what you use. - -Other key features: - -- Helps remove guess work in your cost planning process and adds data insights driven calculations. -- It can be generated in just a few clicks after you have performed discovery using the Azure Migrate appliance. -- The feature is automatically enabled for existing Azure Migrate projects. - -### Goal - -The goal of this exercise is to create a business case. The Business case capability helps you build a business proposal to understand how Azure can bring the most value to your business. It highlights: - -- On-premises vs Azure total cost of ownership. -- Year on year cashflow analysis. -- Resource utilization based insights to identify servers and workloads that are ideal for cloud. -- Quick wins for migration and modernization including end of support Windows OS and SQL versions. -- Long term cost savings by moving from a capital expenditure model to an Operating expenditure model, by paying for only what you use. - -> [!WARNING] -> The Business case capability is currently in public preview - -### Actions - -* Build a business case -* Review a business case -* Adjust business case assumptions - -### Success criteria - -* You successfully build a business case -* You have successfully reviewed the business case -* You understand how to adjust the business case assumptions - -### Learning resources -* [Business case overview](https://learn.microsoft.com/en-us/azure/migrate/concepts-business-case-calculation) -* [Build a business case](https://learn.microsoft.com/en-us/azure/migrate/how-to-build-a-business-case) -* [Review a business case](https://learn.microsoft.com/en-us/azure/migrate/how-to-view-a-business-case) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-3/solution.md) - - -## Challenge 4 - Assess VMΒ΄s for the migration - -In most cases, you don't want to migrate all machines at once, but want to prioritize workload by workload and even understand what the dependencies between workloads are. You then look at each phase or wave of migration and break down the risks and workloads. - -### Goal - -The goal of this exercise is to ... - -* measure the readiness and estimates the effect of migrating on-premises servers to Azure -* review the assessment output to understand the readiness and sizing recommendations -* review the dependencies between the discovered servers - -### Actions - -* Group machines for the assessment -* Create an Azure VM assessment -* Review assessment output and recommendations -* Enable and review dependency analysis - -### Success criteria - -* You created a machine group -* You successfully created an Azure VM assessment -* You reviewed the assessment output and recommendations -* You enabled and reviewed the dependencies of the discovered server - -### Learning resources -* [Assessment overview - To Azure VMs](https://learn.microsoft.com/en-us/azure/migrate/concepts-assessment-calculation) -* [Select assessment tools](https://learn.microsoft.com/en-us/azure/migrate/how-to-assess) -* [Create a group for assessment](https://learn.microsoft.com/en-us/azure/migrate/how-to-create-a-group) -* [Create an Azure VM assessment](https://learn.microsoft.com/en-us/azure/migrate/how-to-create-assessment) -* [Customize an assessment](https://learn.microsoft.com/en-us/azure/migrate/how-to-modify-assessment) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-4/solution.md) - -## Challenge 5 - Migrate machines to Azure - -### Goal - -The goal of this exercise is to ... - -* understand the different migration options and prerequisites provided by Azure Migrate -* perform a test migration of the desired workload -* keep downtime as short as possible -* perform the final migration towards Azure - -### Actions - -* Setup the Azure Site Recovery provider and Recovery Services agent on the Hyper-V host -* Replicate the machines to Azure -* Perform a Test Migration -* Prepare the final Migration -* Migrate the workload to Azure - -### Success criteria - -* All the source machines are successfully migrated to and running in Azure -* The Web Servers are accessible using a dedicated Public Load Balancer. - -### Learning resources -* [Support matrix for migration of physical servers, AWS VMs, and GCP VMs](https://learn.microsoft.com/en-us/azure/migrate/migrate-support-matrix-physical-migration) -* [Migrate Hyper-V VMΒ΄s to Azure](https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-hyper-v) -* [Migrate options for VMWare to Azure](https://learn.microsoft.com/en-us/azure/migrate/server-migrate-overview) -* [Migrate Physical Servers](https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-physical-virtual-machines) -* [Migrate AWS Instances to Azure](https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-aws-virtual-machines) -* [Migrate GCP Instances to Azure](https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-gcp-virtual-machines) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-5/solution.md) - -## Optional Bonus Challenge 6 - Secure on Azure - -### Goal - -The goal of this exercise is to ... - -* secure the migrated Virtual Machines by enabling Defender for Cloud for Server - -### Actions - -* Enable Defender for Cloud - -### Success criteria - -* The migrated Servers are protected by Defender for Cloud for Servers - -### Learning resources -* [Deploy Defender for Servers](https://learn.microsoft.com/en-us/azure/defender-for-cloud/tutorial-enable-servers-plan) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-6/solution.md) - -## Optional Bonus Challenge 7 - Modernize with Azure - -### Goal - -The goal of this exercise is to ... - -* modernize the Web App running on the frontend Servers to be hosted on PaaS instead of IaaS (Lift & Shift) -* understand the options that are available for App Services assessment & migration - -### Actions - -* Create a web app assessment using Azure Migrate -* Preform a web app migration using Azure Migrate towards Azure App Services - -### Success criteria - -* An assessment has been performed using the already deployed infrastructure. -* An migration has been performed towards PaaS instead of IaaS. -* The App Services are accessible using the source Load Balancer. - -> [!IMPORTANT] -> Currently [July 2024], At-Scale Discovery, Assessment and Migration is supported for ASP.NET web apps deployed to on-premises IIS servers hosted on VMware Environment. - -### Learning resources -* [App Service assessment overview](https://learn.microsoft.com/en-us/azure/migrate/concepts-azure-webapps-assessment-calculation) -* [Web App migration support](https://learn.microsoft.com/en-us/azure/migrate/concepts-migration-webapps) -* [App Service Migration Assistant](https://github.com/Azure/App-Service-Migration-Assistant/wiki) -* [App Service migration tools and resources](https://learn.microsoft.com/en-us/azure/app-service/app-service-asp-net-migration#app-service-migration-tools-and-resources) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-7/solution.md) - -## Optional Bonus Challenge 8 - Deploy AI chat in App Service - -### Goal - -The goal of this exercise is to ... - -* deploy an AI chat application in Azure App Service - -### Actions - -* Create a new Azure OpenAI Service -* Deploy a model and test it in AI Foundry -* Deploy the AI chat application code to the App Service - -### Success criteria - -* The AI chat application is running in Azure App Service -* The application is accessible via a public URL - -### Learning resources -* [Quickstart: Deploy model in AI Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/create-resource?pivots=web-portal) -* [Deploy an Azure App Service from AI Foundy](https://learn.microsoft.com/en-us/azure/ai-foundry/tutorials/deploy-chat-web-app) - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-8/solution.md) - -## Finish - -Congratulations! You finished the Migrate and Secure to be AI Ready Microhack. We hope you had the chance to learn about the how to implement a successful migration strategy using Azure Migrate. -If you want to give feedback please don’t hesitate to open an Issue on the repository or get in touch with one of us directly. - -Thank you for investing the time and see you next time! ## Contributors * Nils Bankert [GitHub](https://github.com/nilsbankert); [LinkedIn](https://www.linkedin.com/in/nilsbankert/) diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-01.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-01.md new file mode 100644 index 000000000..0966f8aa8 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-01.md @@ -0,0 +1,26 @@ +# Challenge 1 - Prerequisites and landing zone preparation + +**[Home](../Readme.md)** - [Next Challenge Solution](challenge-02.md) + +> [!IMPORTANT] +> **Many of the resource deployments in this Microhack are adapted from the [Jumpstart ArcBox for IT Pros](https://jumpstart.azure.com/azure_jumpstart_arcbox/ITPro). Special thanks to the [Jumpstart Team](https://aka.ms/arcjumpstart) for their excellent work.** + +## Goal + +- Deploy a *source* resource group with two VMs and their dependencies that act as our physical on-premise servers that will be migrated to Azure. +- Deploy a *destination* resource group to which the servers will be migrated. + +## Actions + +- Deploy the [Bicep configuration](../resources) of the Micro Hack. + +## Success criteria + +- You have understood the concept and architecture for the MicroHack. +- The Bicep deployment command exits successfully. +- The *source* and *destination* resource group is visible in the Azure Portal. + +## Learning resources + +- [What is Bicep?](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep) + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-02.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-02.md new file mode 100644 index 000000000..5061f17f7 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-02.md @@ -0,0 +1,35 @@ +# Challenge 2 - Discover physical servers for the migration + +[Previous Challenge Solution](challenge-01.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-03.md) + +## Goal + +The goal of this exercise is to... + +* Setup Azure Migrate Project in Azure +* Installing / Deploying the necessary setup for discovery +* Create a discovery + +## Actions + +* Create a Azure Migrate Project +> [!IMPORTANT] +> To be able to create a Business Case, make sure to select Europe as the Geography for the Azure Migrate Project +* Deploy a Azure Migrate Appliance +* Create a continuous discovery of your source environment + +## Success criteria + +* You have created a Azure Migrate Project +* You have successfully deployed the Azure Migrate Appliance +* You successfully registered the Azure Migrate Appliance with the Azure Migrate Project +* You have successfully setup a continuous discovery for the Hyper-V host. +* You have successfully verified the discovered servers in the portal + +## Learning resources +* [Create and managed Azure Migrate projects](https://learn.microsoft.com/en-us/azure/migrate/create-manage-projects) +* [Setup and appliance on VMWare](https://learn.microsoft.com/en-us/azure/migrate/how-to-set-up-appliance-vmware) +* [Setup and appliance on Hyper-V](https://learn.microsoft.com/en-us/azure/migrate/how-to-set-up-appliance-hyper-v) +* [Steup an appliance for physical servers](https://learn.microsoft.com/en-us/azure/migrate/how-to-set-up-appliance-physical) +* [Before you start / general prerequisites](https://learn.microsoft.com/en-us/azure/migrate/how-to-discover-applications#before-you-start) + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-03.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-03.md new file mode 100644 index 000000000..fd8fee603 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-03.md @@ -0,0 +1,51 @@ +# Challenge 3 - Create a Business Case + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-04.md) + + +The Business case capability helps you build a business proposal to understand how Azure can bring the most value to your business. + +It highlights: + +- On-premises vs Azure total cost of ownership. +- Year on year cashflow analysis. +- Resource utilization based insights to identify servers and workloads that are ideal for cloud. +- Quick wins for migration and modernization including end of support Windows OS and SQL versions. +- Long term cost savings by moving from a capital expenditure model to an Operating expenditure model, by paying for only what you use. + +Other key features: + +- Helps remove guess work in your cost planning process and adds data insights driven calculations. +- It can be generated in just a few clicks after you have performed discovery using the Azure Migrate appliance. +- The feature is automatically enabled for existing Azure Migrate projects. + +## Goal + +The goal of this exercise is to create a business case. The Business case capability helps you build a business proposal to understand how Azure can bring the most value to your business. It highlights: + +- On-premises vs Azure total cost of ownership. +- Year on year cashflow analysis. +- Resource utilization based insights to identify servers and workloads that are ideal for cloud. +- Quick wins for migration and modernization including end of support Windows OS and SQL versions. +- Long term cost savings by moving from a capital expenditure model to an Operating expenditure model, by paying for only what you use. + +> [!WARNING] +> The Business case capability is currently in public preview + +## Actions + +* Build a business case +* Review a business case +* Adjust business case assumptions + +## Success criteria + +* You successfully build a business case +* You have successfully reviewed the business case +* You understand how to adjust the business case assumptions + +## Learning resources +* [Business case overview](https://learn.microsoft.com/en-us/azure/migrate/concepts-business-case-calculation) +* [Build a business case](https://learn.microsoft.com/en-us/azure/migrate/how-to-build-a-business-case) +* [Review a business case](https://learn.microsoft.com/en-us/azure/migrate/how-to-view-a-business-case) + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-04.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-04.md new file mode 100644 index 000000000..2332784dd --- /dev/null +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-04.md @@ -0,0 +1,36 @@ +# Challenge 4 - Assess VMs for the migration + +[Previous Challenge Solution](challenge-03.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-05.md) + + +In most cases, you don't want to migrate all machines at once, but want to prioritize workload by workload and even understand what the dependencies between workloads are. You then look at each phase or wave of migration and break down the risks and workloads. + +## Goal + +The goal of this exercise is to ... + +* measure the readiness and estimates the effect of migrating on-premises servers to Azure +* review the assessment output to understand the readiness and sizing recommendations +* review the dependencies between the discovered servers + +## Actions + +* Group machines for the assessment +* Create an Azure VM assessment +* Review assessment output and recommendations +* Enable and review dependency analysis + +## Success criteria + +* You created a machine group +* You successfully created an Azure VM assessment +* You reviewed the assessment output and recommendations +* You enabled and reviewed the dependencies of the discovered server + +## Learning resources +* [Assessment overview - To Azure VMs](https://learn.microsoft.com/en-us/azure/migrate/concepts-assessment-calculation) +* [Select assessment tools](https://learn.microsoft.com/en-us/azure/migrate/how-to-assess) +* [Create a group for assessment](https://learn.microsoft.com/en-us/azure/migrate/how-to-create-a-group) +* [Create an Azure VM assessment](https://learn.microsoft.com/en-us/azure/migrate/how-to-create-assessment) +* [Customize an assessment](https://learn.microsoft.com/en-us/azure/migrate/how-to-modify-assessment) + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-05.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-05.md new file mode 100644 index 000000000..07e99430b --- /dev/null +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-05.md @@ -0,0 +1,35 @@ +# Challenge 5 - Migrate machines to Azure + +[Previous Challenge Solution](challenge-04.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-06.md) + +## Goal + +The goal of this exercise is to ... + +* understand the different migration options and prerequisites provided by Azure Migrate +* perform a test migration of the desired workload +* keep downtime as short as possible +* perform the final migration towards Azure + +## Actions + +* Setup the Azure Replication Appliance +* Deploy the Mobility Service Agent +* Replicate the machines to Azure +* Perform a Test Migration +* Prepare the final Migration +* Migrate the workload to Azure + +## Success criteria + +* All the source machines are successfully migrated to and running in Azure +* The Web Servers are accessible using a dedicated Public Load Balancer. + +## Learning resources +* [Support matrix for migration of physical servers, AWS VMs, and GCP VMs](https://learn.microsoft.com/en-us/azure/migrate/migrate-support-matrix-physical-migration) +* [Migrate Hyper-V VMΒ΄s to Azure](https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-hyper-v) +* [Migrate options for VMWare to Azure](https://learn.microsoft.com/en-us/azure/migrate/server-migrate-overview) +* [Migrate Physical Servers](https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-physical-virtual-machines) +* [Migrate AWS Instances to Azure](https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-aws-virtual-machines) +* [Migrate GCP Instances to Azure](https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-gcp-virtual-machines) + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-06.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-06.md new file mode 100644 index 000000000..30019da0f --- /dev/null +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-06.md @@ -0,0 +1,21 @@ +# Optional Challenge 6 - Secure on Azure + +[Previous Challenge Solution](challenge-05.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-07.md) + +## Goal + +The goal of this exercise is to ... + +* secure the migrated Virtual Machines by enabling Defender for Cloud for Server + +## Actions + +* Enable Defender for Cloud + +## Success criteria + +* The migrated Servers are protected by Defender for Cloud for Servers + +## Learning resources +* [Deploy Defender for Servers](https://learn.microsoft.com/en-us/azure/defender-for-cloud/tutorial-enable-servers-plan) + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-07.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-07.md new file mode 100644 index 000000000..020134f3f --- /dev/null +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-07.md @@ -0,0 +1,31 @@ +# Optional Challenge 7 - Modernize with Azure + +[Previous Challenge Solution](challenge-06.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-08.md) + +## Goal + +The goal of this exercise is to ... + +* modernize the Web App running on the frontend Servers to be hosted on PaaS instead of IaaS (Lift & Shift) +* understand the options that are available for App Services assessment & migration + +## Actions + +* Create a web app assessment using Azure Migrate +* Preform a web app migration using Azure Migrate towards Azure App Services + +## Success criteria + +* An assessment has been performed using the already deployed infrastructure. +* An migration has been performed towards PaaS instead of IaaS. +* The App Services are accessible using the source Load Balancer. + +> [!IMPORTANT] +> Currently [July 2024], At-Scale Discovery, Assessment and Migration is supported for ASP.NET web apps deployed to on-premises IIS servers hosted on VMware Environment. + +## Learning resources +* [App Service assessment overview](https://learn.microsoft.com/en-us/azure/migrate/concepts-azure-webapps-assessment-calculation) +* [Web App migration support](https://learn.microsoft.com/en-us/azure/migrate/concepts-migration-webapps) +* [App Service Migration Assistant](https://github.com/Azure/App-Service-Migration-Assistant/wiki) +* [App Service migration tools and resources](https://learn.microsoft.com/en-us/azure/app-service/app-service-asp-net-migration#app-service-migration-tools-and-resources) + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-08.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-08.md new file mode 100644 index 000000000..6504c55c1 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/challenge-08.md @@ -0,0 +1,25 @@ +# Optional Challenge 8 - Deploy AI chat in App Service + +[Previous Challenge Solution](challenge-07.md) - **[Home](../Readme.md)** - [Next Challenge Solution](finish.md) + +## Goal + +The goal of this exercise is to ... + +* deploy an AI chat application in Azure App Service + +## Actions + +* Create a new Azure OpenAI Service +* Deploy a model and test it in AI Foundry +* Deploy the AI chat application code to the App Service + +## Success criteria + +* The AI chat application is running in Azure App Service +* The application is accessible via a public URL + +## Learning resources +* [Quickstart: Deploy model in AI Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/create-resource?pivots=web-portal) +* [Deploy an Azure App Service from AI Foundy](https://learn.microsoft.com/en-us/azure/ai-foundry/tutorials/deploy-chat-web-app) + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/finish.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/finish.md new file mode 100644 index 000000000..602f58618 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/challenges/finish.md @@ -0,0 +1,11 @@ +# Finish + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** + +## Congratulations + +You finished the MicroHack *Migrate and Secure to be AI Ready*. +If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. + +Thank you for investing the time and see you next time! + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/README.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/README.md index 13942ee53..043cb0ca3 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/README.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/README.md @@ -1,6 +1,6 @@ # Deploy the Landing Zone for the Micro Hack -Clone the GitHub repository using Azure Cloud Shell and deploy .\bicep\main.bicep file. [Solution 1](../walkthrough/challenge-1/solution.md) +Download \*.bicep files to your local PC and follow [Solution 1](../walkthrough/challenge-01/solution-01.md) ## Quota Information if multiple Users Deploy to the same subscription diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS1-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS1-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS1-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS1-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/CS9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/Challenge-1.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/Challenge-1.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/Challenge-1.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/img/Challenge-1.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/solution-01.md similarity index 98% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/solution-01.md index d513bdbb5..462b63b2a 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/solution.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-01/solution-01.md @@ -1,5 +1,7 @@ # Walkthrough Challenge 1 - Prerequisites and Landing Zone +**[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-02/solution-02.md) + Duration: 30 minutes ## Prerequisites @@ -129,4 +131,3 @@ The deployed architecture looks like following diagram: You successfully completed challenge 1! πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-2/solution.md) diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMig5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMigApp1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMigApp1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMigApp2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMigApp2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMigApp3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/AzMigApp3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Challenge-2.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Challenge-2.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Challenge-2.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Challenge-2.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover1-2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover1-2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover1-2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover1-2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover15-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover15-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover15-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover15-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover15-2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover15-2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover15-2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover15-2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover15.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover15.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover15.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover15.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover16.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover16.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover16.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover16.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover18.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover18.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover18.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover18.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover3-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover3-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover3-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover3-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover8-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover8-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover8-2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover8-2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover8-3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover8-3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9-0.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover9-0.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9-0.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover9-0.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover9-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover9-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/img/Discover9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/solution-02.md similarity index 96% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/solution-02.md index 50b10402c..96d3f1fb9 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/solution.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-02/solution-02.md @@ -1,10 +1,8 @@ # Walkthrough Challenge 2 - Discover the virtualized servers for the migration -Duration: 60 minutes - -## Prerequisites +[Previous Challenge Solution](../challenge-01/solution-01.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-03/solution-03.md) -Please make sure thet you successfully completed [Challenge 1](../challenge-1/solution.md) before continuing with this challenge. +Duration: 60 minutes ### **Task 1: Create a Azure Migrate Project** @@ -184,4 +182,3 @@ The deployed architecture now looks like the following diagram. ![image](./img/Challenge-2.jpg) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-3/solution.md) diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc2-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc2-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc2-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc2-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/img/bc9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/solution-03.md similarity index 85% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/solution-03.md index d09aeac9f..934134b52 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/solution.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-03/solution-03.md @@ -1,11 +1,8 @@ # Walkthrough Challenge 3 - Create a Business Case -Duration: 40 minutes - -## Prerequisites +[Previous Challenge Solution](../challenge-02/solution-02.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-04/solution-04.md) -Please make sure thet you successfully completed [Challenge 2](../challenge-2/solution.md) before continuing with this challenge. -Please also make sure to review the [prerequisites](https://learn.microsoft.com/en-us/azure/migrate/how-to-build-a-business-case#prerequisites) for the business case. +Duration: 40 minutes ### **Task 1: Build a business case** @@ -65,4 +62,4 @@ You can adjust those parameters what would recalculate the business case or you You successfully completed challenge 3! πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-4/solution.md) + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess12-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess12-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess12-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess12-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess15.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess15.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess15.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess15.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess16.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess16.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess16.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess16.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess17.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess17.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess17.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess17.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess6-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess6-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess6-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess6-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Assess9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/Depend6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/WebApp1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/WebApp1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/WebApp1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/WebApp1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/WebApp2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/WebApp2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/WebApp2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/img/WebApp2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/solution-04.md similarity index 94% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/solution-04.md index c0e5c906f..a475ad528 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/solution.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-04/solution-04.md @@ -1,10 +1,8 @@ # Walkthrough Challenge 4 - Assess VMΒ΄s for the migration -Duration: 40 minutes - -## Prerequisites +[Previous Challenge Solution](../challenge-03/solution-03.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-05/solution-05.md) -Please make sure thet you successfully completed [Challenge 3](../challenge-3/solution.md) before continuing with this challenge. +Duration: 40 minutes ### **Task 1: Create an Azure VM assessment** @@ -94,4 +92,3 @@ In the project, you can review dependencies for each server either through the A You successfully completed challenge 4! πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-5/solution.md) diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Challenge-5.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Challenge-5.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Challenge-5.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Challenge-5.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Clean1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Clean1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Clean1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Clean1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Clean2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Clean2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Clean2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Clean2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/HVConnect.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/HVConnect.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/HVConnect.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/HVConnect.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/LB7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/LB7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Mig1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Mig1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Mig1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Mig1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Mig2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Mig2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Mig2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Mig2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Mig3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Mig3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Mig3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Mig3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Mig4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Mig4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Mig4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Mig4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep15.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep15.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep15.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep15.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/PrepRep9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/PrepRep9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Rep8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/Rep8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/TestMig8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/TestMig8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/img/mig9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/solution-05.md similarity index 94% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/solution-05.md index b6c423799..e2bfdba44 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/solution.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-05/solution-05.md @@ -1,11 +1,17 @@ # Walkthrough Challenge 5 - Migrate machines to Azure +[Previous Challenge Solution](../challenge-04/solution-04.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-06/solution-06.md) + Duration: 90 minutes ## Prerequisites Please make sure thet you successfully completed [Challenge 4](../challenge-4/solution.md) before continuing with this challenge. +### **Task 1: Create and prepare Windows Server 2019 for the Azure Replication Appliance** + +To start physical server migration you must install the Azure Replication Appliance on your on-premises. The Azure Replication Appliance can be downloaded as a OVA template or you can download the appliance installer to install it on a already existing server. For the purpose of this MicroHack we will install the Azure Replication Appliance via the installer on a new Windows Server 2019 system. + > [!IMPORTANT] > In Azure Migrate there exists a classic and simplified experience for physical server migration. The classic experience **retires on 30 September 2026**. The Microhack will focus on using the simplified experience which provides several key advantages e.g, a broader OS support and a more modern replication appliance. More details can be found [here](https://learn.microsoft.com/en-us/azure/migrate/simplified-experience-for-azure-migrate?view=migrate). @@ -272,4 +278,3 @@ The deployed architecture now looks like the following diagram. πŸš€πŸš€πŸš€ **If you still want to continue we have 2 additional bonus challenges to modernize OR secure the migrated environment.**πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** - Continue with either [Bonus Challenge 6 solution](../challenge-6/solution.md) OR [Bonus Challenge 7 solution](../challenge-7/solution.md) diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Challenge-6.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Challenge-6.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Challenge-6.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Challenge-6.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-CSPM-monitoring.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Def-CSPM-monitoring.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-CSPM-monitoring.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Def-CSPM-monitoring.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-DefenderServerSettings.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Def-DefenderServerSettings.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-DefenderServerSettings.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Def-DefenderServerSettings.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-defenderplans.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Def-defenderplans.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-defenderplans.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Def-defenderplans.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-environment-settings.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Def-environment-settings.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-environment-settings.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/Def-environment-settings.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/DefSecAlert.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/DefSecAlert.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/DefSecAlert.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/DefSecAlert.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/VM-runps.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/VM-runps.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/VM-runps.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/VM-runps.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/addmigtool.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/addmigtool.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/addmigtool.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/addmigtool.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/appservice7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize13-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize13-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize13-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize13-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/modernize9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost01.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/secpost01.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost01.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/secpost01.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost02.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/secpost02.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost02.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/secpost02.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost03.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/secpost03.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost03.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/secpost03.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost04.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/secpost04.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost04.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/secpost04.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/tfupdate1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/tfupdate1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/tfupdate2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/tfupdate2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/tfupdate3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/tfupdate3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/tfupdate4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/tfupdate4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vm-eicarstring.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vm-eicarstring.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vm-eicarstring.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vm-eicarstring.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmatpstatus.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmatpstatus.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmatpstatus.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmatpstatus.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmconnect.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmconnect.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmconnect.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmconnect.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmfile.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmfile.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmfile.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmfile.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmlinuxatpstatus.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmlinuxatpstatus.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmlinuxatpstatus.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmlinuxatpstatus.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmnewfile.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmnewfile.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmnewfile.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmnewfile.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmthreat.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmthreat.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmthreat.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vmthreat.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vnnewfile.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vnnewfile.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vnnewfile.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/img/vnnewfile.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/solution-06.md similarity index 90% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/solution-06.md index db7cc70fb..89a47d946 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/solution.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-06/solution-06.md @@ -1,112 +1,109 @@ -# Walkthrough Optional Challenge 6 - Secure on Azure - -Duration: 40 minutes - -## Prerequisites - -Please make sure that you successfully completed [Challenge 5](../challenge-5/solution.md) before continuing with this challenge. - -## **Task 1: Enable Defender for Cloud for Server** - -In [Challenge 5](../challenge-5/solution.md) we migrated two servers to Azure. The servers are already protected by the basic services of Defender for Cloud. In this challenge, we'll improve significantly the protection level by activating advanced services such as "Cloud Security Posture Management (CSPM)" and "Cloud Workload Protection (CWP)" (Defender for Server). - -To enable the advanced Defender for Cloud components, open the portal and select *Defender for Cloud*. Under *Management*, select the *Environment Settings* to define the Defender for Cloud setting for the subscription. - -![image](./img/Def-environment-settings.jpg) - -In the settings, enable *Defender CSPM* and *Defender for Server* plans to better protect the migrated servers from threats. After enabling the plans, use the "Settings" link for both plans and verify that all features are enabled. Finally *Save* the new configuration. - -![image](./img/Def-environment-settings.jpg) - -Verify the *Defender CSPM* Settings & monitoring details - -![image](./img/Def-CSPM-monitoring.png) - -Verify the *Defender for Server* Settings & monitoring details - -![image](./img/Def-DefenderServerSettings.png) - -> [!NOTE] -> It takes a few minutes for the new settings to be applied and for more agents to be installed on the servers. - -## **Task 2: Check if Defender for Endpoint is active on the virtual machines** - -To check if *Defender for Server* was successfully activated on the virtual machines, open the portal and select *Virtual Machines* and select a Windows Server. Under *Operations'* select to run a command and chose to run a PowerShell script/command. - -![image](./img/VM-runps.png) - -Run the *Get-MpComputerStatus* cmdlet to get the status of antimalware software installed on the virtual machine. - -![image](./img/vmatpstatus.png) - -On a Linux machine you run a shell script instead of PowerShell - the commandline *mdatp health* will return the health of the *Defender for Endpoint* on a Linux box. - -![image](./img/vmlinuxatpstatus.png) - - -## **Task 3: Check if a virus attack is reported in Azure** - -In the next step, we check whether the infection with malware is reported to Azure, so that appropriate reactions can be triggered based on an alert - e.g. inform administrators, open an incident or follow up on the problem and initiate appropriate measures or react to such incidents with automatic rules. - -Open the portal and select *Virtual Machines* and select a Windows Server. Select *Connect* and establish a connection with the virtual machines using *Bastion*. - -![image](./img/vmconnect.png) - -The European Institute for Computer Antivirus Research (EICAR) and Computer Antivirus Research Organization (CARO), provide a harmless test file to test the response of computer antivirus programs. Instead of using real malware, which could cause real damage, this test file allows people to test anti-virus software without having to use a real computer virus. Open the following UIRL in a browser in the virtual machine: https://www.eicar.org/download-anti-malware-testfile/ - -Scroll down a bit until you can see the 68 character long EICAR string. - -![image](./img/vm-eicarstring.png) - -We will not try to download a test-file from the website, because this will be blocked by the browser already. Instead, we will create a new file on the virtual machine and paste the EICAR string into and try to safe the file. - -Select the EICAR String and copy it into the clipboard. Create a new file on the desktop and paste the EICAR string into the file. - -![image](./img/vmnewfile.png) - -![image](./img/vmfile.png) - -Try to safe the file. Defender for Endpoint will trigger - it'll quarantine the file and and display a warning on the local server. - -![image](./img/vmthreat.png) - -Next, we will double-check if this alert was forwarded to Azure. Open the portal and select *Defender for Cloud* and select *Security Alerts*. EICAR malware detections are reported with severity "Informational" - to include these alerts in the view you need to change the filter: Add severity "informational" in the filter settings - and the security alerts will be displayed. - -![image](./img/DefSecAlert.png) - -## **Task 4: Explore *Defender for Cloud* proactive security advice** - -The challenges in this Microhack were designed to be simple and implemented straight forward as virtual machines in a single subscription. The implementation of a secure and scalable landing zone according to the best practices from the *Cloud Adaption Framework* ([What is an Azure landing zone? - Cloud Adoption Framework | Microsoft Learn](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/)) was waived for the sake of simplicity. - -On the other hand, this now causes *Defender for Cloud* making a number of recommendations on how to proactively improve the security of the environment. -To view general security recommendations for the managed virtual machines, please open the portal and select Defender for Cloud. Under Security Posture, you can view the recommendations in detail. - -![image](./img/secpost01.png) - -Click on Security Posture to view a list of recommendations for the various resource being used. - -![image](./img/secpost02.png) - -The list of recommendations for your environment will look slightly different than in this screenshot, because the resource that you've installed might experience different vulnerabilities. Review the recommendations and click them to view the details. In the details for each recommendation, you'll find a description, you can assign the recommendation to a user for implementation or you can create an exempt. - -Go back to *Defender for Cloud* and click on *Attack path analysis* - this will provide you an overview about specific vulnerabilities in your environment and how they can be utilized by attackers to compromise your environment. - -![image](./img/secpost03.png) - -In this Microhack, we deployed virtual machines that use public IP addresses and are directly exposed to the internet - this is straight forward, but for sure not a best practice. Click on one of the *Attack paths* to learn more about the details of this attack vector. - -![image](./img/secpost04.png) - - -## **Task 4: Enable and configure Copilot for Security** - -Sign in to Copilot for Security (https://securitycopilot.microsoft.com). - - - - -You successfully completed challenge 6! πŸš€πŸš€πŸš€ - -πŸš€πŸš€πŸš€ **!!!Congratulations!!! - You successfully completed the MicroHack. You can now safley remove the *source-rg* and *destination-rg* Resource Groups.** πŸš€πŸš€πŸš€ - - **[Home](../../Readme.md)** \ No newline at end of file +# Walkthrough Optional Challenge 6 - Secure on Azure + +[Previous Challenge Solution](../challenge-05/solution-05.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-07/solution-07.md) + +Duration: 40 minutes + +## **Task 1: Enable Defender for Cloud for Server** + +In [Challenge 5](../challenge-05/solution-05.md) we migrated two servers to Azure. The servers are already protected by the basic services of Defender for Cloud. In this challenge, we'll improve significantly the protection level by activating advanced services such as "Cloud Security Posture Management (CSPM)" and "Cloud Workload Protection (CWP)" (Defender for Server). + +To enable the advanced Defender for Cloud components, open the portal and select *Defender for Cloud*. Under *Management*, select the *Environment Settings* to define the Defender for Cloud setting for the subscription. + +![image](./img/Def-environment-settings.jpg) + +In the settings, enable *Defender CSPM* and *Defender for Server* plans to better protect the migrated servers from threats. After enabling the plans, use the "Settings" link for both plans and verify that all features are enabled. Finally *Save* the new configuration. + +![image](./img/Def-environment-settings.jpg) + +Verify the *Defender CSPM* Settings & monitoring details + +![image](./img/Def-CSPM-monitoring.png) + +Verify the *Defender for Server* Settings & monitoring details + +![image](./img/Def-DefenderServerSettings.png) + +> [!NOTE] +> It takes a few minutes for the new settings to be applied and for more agents to be installed on the servers. + +## **Task 2: Check if Defender for Endpoint is active on the virtual machines** + +To check if *Defender for Server* was successfully activated on the virtual machines, open the portal and select *Virtual Machines* and select a Windows Server. Under *Operations'* select to run a command and chose to run a PowerShell script/command. + +![image](./img/VM-runps.png) + +Run the *Get-MpComputerStatus* cmdlet to get the status of antimalware software installed on the virtual machine. + +![image](./img/vmatpstatus.png) + +On a Linux machine you run a shell script instead of PowerShell - the commandline *mdatp health* will return the health of the *Defender for Endpoint* on a Linux box. + +![image](./img/vmlinuxatpstatus.png) + + +## **Task 3: Check if a virus attack is reported in Azure** + +In the next step, we check whether the infection with malware is reported to Azure, so that appropriate reactions can be triggered based on an alert - e.g. inform administrators, open an incident or follow up on the problem and initiate appropriate measures or react to such incidents with automatic rules. + +Open the portal and select *Virtual Machines* and select a Windows Server. Select *Connect* and establish a connection with the virtual machines using *Bastion*. + +![image](./img/vmconnect.png) + +The European Institute for Computer Antivirus Research (EICAR) and Computer Antivirus Research Organization (CARO), provide a harmless test file to test the response of computer antivirus programs. Instead of using real malware, which could cause real damage, this test file allows people to test anti-virus software without having to use a real computer virus. Open the following UIRL in a browser in the virtual machine: https://www.eicar.org/download-anti-malware-testfile/ + +Scroll down a bit until you can see the 68 character long EICAR string. + +![image](./img/vm-eicarstring.png) + +We will not try to download a test-file from the website, because this will be blocked by the browser already. Instead, we will create a new file on the virtual machine and paste the EICAR string into and try to safe the file. + +Select the EICAR String and copy it into the clipboard. Create a new file on the desktop and paste the EICAR string into the file. + +![image](./img/vmnewfile.png) + +![image](./img/vmfile.png) + +Try to safe the file. Defender for Endpoint will trigger - it'll quarantine the file and and display a warning on the local server. + +![image](./img/vmthreat.png) + +Next, we will double-check if this alert was forwarded to Azure. Open the portal and select *Defender for Cloud* and select *Security Alerts*. EICAR malware detections are reported with severity "Informational" - to include these alerts in the view you need to change the filter: Add severity "informational" in the filter settings - and the security alerts will be displayed. + +![image](./img/DefSecAlert.png) + +## **Task 4: Explore *Defender for Cloud* proactive security advice** + +The challenges in this Microhack were designed to be simple and implemented straight forward as virtual machines in a single subscription. The implementation of a secure and scalable landing zone according to the best practices from the *Cloud Adaption Framework* ([What is an Azure landing zone? - Cloud Adoption Framework | Microsoft Learn](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/)) was waived for the sake of simplicity. + +On the other hand, this now causes *Defender for Cloud* making a number of recommendations on how to proactively improve the security of the environment. +To view general security recommendations for the managed virtual machines, please open the portal and select Defender for Cloud. Under Security Posture, you can view the recommendations in detail. + +![image](./img/secpost01.png) + +Click on Security Posture to view a list of recommendations for the various resource being used. + +![image](./img/secpost02.png) + +The list of recommendations for your environment will look slightly different than in this screenshot, because the resource that you've installed might experience different vulnerabilities. Review the recommendations and click them to view the details. In the details for each recommendation, you'll find a description, you can assign the recommendation to a user for implementation or you can create an exempt. + +Go back to *Defender for Cloud* and click on *Attack path analysis* - this will provide you an overview about specific vulnerabilities in your environment and how they can be utilized by attackers to compromise your environment. + +![image](./img/secpost03.png) + +In this Microhack, we deployed virtual machines that use public IP addresses and are directly exposed to the internet - this is straight forward, but for sure not a best practice. Click on one of the *Attack paths* to learn more about the details of this attack vector. + +![image](./img/secpost04.png) + + +## **Task 4: Enable and configure Copilot for Security** + +Sign in to Copilot for Security (https://securitycopilot.microsoft.com). + + + + +You successfully completed challenge 6! πŸš€πŸš€πŸš€ + +πŸš€πŸš€πŸš€ **!!!Congratulations!!! - You successfully completed the MicroHack. You can now safley remove the *source-rg* and *destination-rg* Resource Groups.** πŸš€πŸš€πŸš€ + diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/Challenge-7.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/Challenge-7.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/Challenge-7.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/Challenge-7.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/addmigtool.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/addmigtool.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/addmigtool.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/addmigtool.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice2-0.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice2-0.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice2-0.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice2-0.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice2-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice2-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice2-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice2-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/appservice7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize13-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize13-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize13-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize13-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/img/modernize9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/solution-07.md similarity index 94% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/solution-07.md index 9de7712b7..7ec4c3656 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/solution.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-07/solution-07.md @@ -1,124 +1,123 @@ -# Walkthrough Challenge 7 - Modernize with Azure - -Duration: 40 minutes - -## Prerequisites - -Please make sure thet you successfully completed [Challenge 5](../challenge-5/solution.md) before continuing with this challenge. - -### **Task 1: Create an App Service Assessment** - -The Azure Migrate tool offers additional capabilities that make it easier for you to move applications from on-premises environments to Azure App Service and Azure Kubernetes Service. - -Azure App Service bulk migration capabilities are now available as an Azure Migrate feature: - -* Discover and assess ASP.NET web apps in addition to categorizing which apps are ready for migration. -* Suggest a destination for migration and provide a guided content and configuration experience for ASP.NET web apps to Azure App Service. -* Discover and migrate with Java Tomcat applications to App Service Linux and to Azure Kubernetes Service. -* Containerize your ASP.NET web apps and move them to either Windows Containers on App Service or to Azure Kubernetes Service. - -> [!WARNING] -> **Currently this feature has a few [limitations](https://learn.microsoft.com/en-us/azure/migrate/concepts-migration-webapps#limitations) and therefore it can't be used to migrate web apps directly from physical servers. However, we can use it at least to perform the assessment of our web apps and use the [App Service migration assistant tool](https://learn.microsoft.com/en-us/azure/app-service/app-service-asp-net-migration) for the migration. Please note that this will only work for the migrated Windows VM** - -> [!WARNING] -> **Please note that this challenge will only work for the migrated Windows VM. Currently we do not support direct migrations from Linux VMs** - -Open the [Azure Portal](https://portal.azure.com) and navigate to the previousley created Azure Migrate project. Select *Assessments* and click on *Create assessment*. - -![image](./img/appservice1.png) - -Click *Add workload* and select the Default Web Site of the Windows Server 2022 VMs. - -![image](./img/appservice2-0.png) - -![image](./img/appservice2-1.png) - -Adjust the *General* settings as required. - -![image](./img/appservice3.png) - -Under *Advanced* review te options to adjust the assessment. - -![image](./img/appservice4.png) - -Proceed to *Review + Create assessment* and start the assessment creation. - -![image](./img/appservice5.png) - -Wait until the Assessment ready and click on it to open it. - -![image](./img/appservice6.png) - -Review the output of the assessment to see if the web app currently running on Windows Server IIS is suitable and ready for Azure App Services. - -![image](./img/appservice7.png) - -### **Task 2: Modernize web app to Azure App Service Code** - -> [!WARNING] -> **As mentioned above, the current [limitations](https://learn.microsoft.com/en-us/azure/migrate/concepts-migration-webapps#limitations) will not allow the direct migration of web apps running on physical machines. Therefore, we will use the [App Service migration assistant tool](https://learn.microsoft.com/en-us/azure/app-service/app-service-asp-net-migration) for the migration.** - - -Login to the Windows Virtual Machine hosting the IIS Web Site in the *destination-rg* Resource Group via Azure Bastion. - -![image](./img/modernize1.png) - -Open the Edge Browser and download the [App Service migration assistant tool](https://appmigration.microsoft.com/api/download/windowspreview/AppServiceMigrationAssistant.msi). - -![image](./img/modernize2.png) - -Change to your download location e.g. \\\Downloads and double-click the AppServiceMigrationAssistant.msi file. - -![image](./img/modernize4.png) - -The installation should finish without any input requirements. After the installation you will find a shortcut on the Desktop to start the App Service Migration Assistant. Double-click on the shortcut to start the App Service Migration Assistant. - -![image](./img/modernize5.png) - -Under *Choose a Site* select *Default Web Site* and click next. - -![image](./img/modernize6.png) - -Wait until the assessment report is finished and click next under *Assessment Report* - -![image](./img/modernize7.png) - -Under *Login to Azure*, click on *Copy Code & Open Browser* and login to Azure using your credentials. - -![image](./img/modernize8.png) - -Select *Continue* when prompted to allow to sign in to the *Azure App Service Migration Assistant* application. You can then close the browser. - -![image](./img/modernize9.png) - -Select the correct Azure Migrate project and click next. - -![image](./img/modernize10.png) - -Under *Azure Options*, select the correct Azure Subscription and Resource Group. Next specify a unique name for your web app. Select to create a new App Service Plan and choose the region of your choise. Click *Migrate* to start the migration. - -![image](./img/modernize11.png) - -The migration should complete successfully. You can now click on *Go to your website* to open the migrated web app now running on Azure App Services. - -![image](./img/modernize12.png) - -Change back to the Azure Portal and open the Resource Group *destination-rg*. You should now see a App Service and a App Service Plan resource. Click on the App Service and select *Browse* to open your web app again. - -![image](./img/modernize13.png) - -![image](./img/modernize13-1.png) - -You should now see the web site content that was previously running on Windows Server IIS. - -![image](./img/modernize14.png) - -You successfully completed challenge 6! πŸš€πŸš€πŸš€ - -The deployed architecture now looks like the following diagram. - -![image](./img/Challenge-7.jpg) - -πŸš€πŸš€πŸš€ **!!!Congratulations!!! - You successfully completed the MicroHack. You can now safley remove the *source-rg* and *destination-rg* Resource Groups.** πŸš€πŸš€πŸš€ - - **[Home](../../Readme.md)** - \ No newline at end of file +# Walkthrough Optional Challenge 7 - Modernize with Azure + +[Previous Challenge Solution](../challenge-06/solution-06.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-08/solution-08.md) + +Duration: 40 minutes + + +### **Task 1: Create an App Service Assessment** + +The Azure Migrate tool offers additional capabilities that make it easier for you to move applications from on-premises environments to Azure App Service and Azure Kubernetes Service. + +Azure App Service bulk migration capabilities are now available as an Azure Migrate feature: + +* Discover and assess ASP.NET web apps in addition to categorizing which apps are ready for migration. +* Suggest a destination for migration and provide a guided content and configuration experience for ASP.NET web apps to Azure App Service. +* Discover and migrate with Java Tomcat applications to App Service Linux and to Azure Kubernetes Service. +* Containerize your ASP.NET web apps and move them to either Windows Containers on App Service or to Azure Kubernetes Service. + +> [!WARNING] +> **Currently this feature has a few [limitations](https://learn.microsoft.com/en-us/azure/migrate/concepts-migration-webapps#limitations) and therefore it can't be used to migrate web apps directly from physical servers. However, we can use it at least to perform the assessment of our web apps and use the [App Service migration assistant tool](https://learn.microsoft.com/en-us/azure/app-service/app-service-asp-net-migration) for the migration. Please note that this will only work for the migrated Windows VM** + +> [!WARNING] +> **Please note that this challenge will only work for the migrated Windows VM. Currently we do not support direct migrations from Linux VMs** + +Open the [Azure Portal](https://portal.azure.com) and navigate to the previousley created Azure Migrate project. Select *Assessments* and click on *Create assessment*. + +![image](./img/appservice1.png) + +Click *Add workload* and select the Default Web Site of the Windows Server 2022 VMs. + +![image](./img/appservice2-0.png) + +![image](./img/appservice2-1.png) + +Adjust the *General* settings as required. + +![image](./img/appservice3.png) + +Under *Advanced* review te options to adjust the assessment. + +![image](./img/appservice4.png) + +Proceed to *Review + Create assessment* and start the assessment creation. + +![image](./img/appservice5.png) + +Wait until the Assessment ready and click on it to open it. + +![image](./img/appservice6.png) + +Review the output of the assessment to see if the web app currently running on Windows Server IIS is suitable and ready for Azure App Services. + +![image](./img/appservice7.png) + +### **Task 2: Modernize web app to Azure App Service Code** + +> [!WARNING] +> **As mentioned above, the current [limitations](https://learn.microsoft.com/en-us/azure/migrate/concepts-migration-webapps#limitations) will not allow the direct migration of web apps running on physical machines. Therefore, we will use the [App Service migration assistant tool](https://learn.microsoft.com/en-us/azure/app-service/app-service-asp-net-migration) for the migration.** + + +Login to the Windows Virtual Machine hosting the IIS Web Site in the *destination-rg* Resource Group via Azure Bastion. + +![image](./img/modernize1.png) + +Open the Edge Browser and download the [App Service migration assistant tool](https://appmigration.microsoft.com/api/download/windowspreview/AppServiceMigrationAssistant.msi). + +![image](./img/modernize2.png) + +Change to your download location e.g. \\\Downloads and double-click the AppServiceMigrationAssistant.msi file. + +![image](./img/modernize4.png) + +The installation should finish without any input requirements. After the installation you will find a shortcut on the Desktop to start the App Service Migration Assistant. Double-click on the shortcut to start the App Service Migration Assistant. + +![image](./img/modernize5.png) + +Under *Choose a Site* select *Default Web Site* and click next. + +![image](./img/modernize6.png) + +Wait until the assessment report is finished and click next under *Assessment Report* + +![image](./img/modernize7.png) + +Under *Login to Azure*, click on *Copy Code & Open Browser* and login to Azure using your credentials. + +![image](./img/modernize8.png) + +Select *Continue* when prompted to allow to sign in to the *Azure App Service Migration Assistant* application. You can then close the browser. + +![image](./img/modernize9.png) + +Select the correct Azure Migrate project and click next. + +![image](./img/modernize10.png) + +Under *Azure Options*, select the correct Azure Subscription and Resource Group. Next specify a unique name for your web app. Select to create a new App Service Plan and choose the region of your choise. Click *Migrate* to start the migration. + +![image](./img/modernize11.png) + +The migration should complete successfully. You can now click on *Go to your website* to open the migrated web app now running on Azure App Services. + +![image](./img/modernize12.png) + +Change back to the Azure Portal and open the Resource Group *destination-rg*. You should now see a App Service and a App Service Plan resource. Click on the App Service and select *Browse* to open your web app again. + +![image](./img/modernize13.png) + +![image](./img/modernize13-1.png) + +You should now see the web site content that was previously running on Windows Server IIS. + +![image](./img/modernize14.png) + +You successfully completed challenge 6! πŸš€πŸš€πŸš€ + +The deployed architecture now looks like the following diagram. + +![image](./img/Challenge-7.jpg) + +πŸš€πŸš€πŸš€ **!!!Congratulations!!! - You successfully completed the MicroHack. You can now safley remove the *source-rg* and *destination-rg* Resource Groups.** πŸš€πŸš€πŸš€ + +--- \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-8/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-08/solution-08.md similarity index 93% rename from 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-8/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-08/solution-08.md index ca1d42cf8..870a49d48 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-8/solution.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-08/solution-08.md @@ -1,10 +1,8 @@ -# Walkthrough Challenge 8 - Deploy AI +# Walkthrough Optional Challenge 8 - Deploy AI -Duration: 40 minutes - -## Prerequisites +[Previous Challenge Solution](../challenge-07/solution-07.md) - **[Home](../../Readme.md)** -Please make sure thet you successfully completed [Challenge 7](../challenge-7/solution.md) before continuing with this challenge. +Duration: 40 minutes ### **Task 1: Create an Azure OpenAI Service** In this task, we will create an Azure OpenAI Service resource in the Azure portal. diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/README.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/README.md index 039af6df9..f4a11908a 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/README.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/README.md @@ -88,35 +88,22 @@ To deploy the lab environment using **terraform**, click the link below. ## **MicroHack Challenges** -- Challenge 0: **[Explore the lab environment, create an Azure Log Analytics Workspace and an empty Dashboard](challenges/00_challenge.md)** -- Challenge 1: **[Configure Virtual Machine Logs](challenges/01_challenge.md)** -- Challenge 2: **[Enable Virtual Machine Insights](challenges/02_challenge.md)** -- Challenge 3: **[Create alerts](challenges/03_challenge.md)** -- Challenge 4: **[Workbooks](challenges/04_challenge.md)** -- Challenge 5: **[Collect custom text logs with Azure Monitor Agent](challenges/05_challenge.md)** +- Challenge 1: **[Explore the lab environment, create an Azure Log Analytics Workspace and an empty Dashboard](challenges/challenge-01.md)** +- Challenge 2: **[Configure Virtual Machine Logs](challenges/challenge-02.md)** +- Challenge 3: **[Enable Virtual Machine Insights](challenges/challenge-03.md)** +- Challenge 4: **[Create alerts](challenges/challenge-04.md)** +- Challenge 5: **[Workbooks](challenges/challenge-05.md)** +- Challenge 6: **[Collect custom text logs with Azure Monitor Agent](challenges/challenge-06.md)** ## **Solution Guide** -- Walkthrough Challenge 0: **[Explore the lab environment, create an Azure Log Analytics Workspace and an empty Dashboard](walkthrough/challenge-0/solution.md)** -- Walkthrough Challenge 1: **[Configure Virtual Machine Logs](walkthrough/challenge-1/solution.md)** -- Walkthrough Challenge 2: **[Enable Virtual Machine Insights](walkthrough/challenge-2/solution.md)** -- Walkthrough Challenge 3: **[Create alerts](walkthrough/challenge-3/solution.md)** -- Walkthrough Challenge 4: **[Workbooks](walkthrough/challenge-4/solution.md)** -- Walkthrough Challenge 5: **[Collect custom text logs with Azure Monitor Agent](walkthrough/challenge-5/solution.md)** +- Walkthrough Challenge 1: **[Explore the lab environment, create an Azure Log Analytics Workspace and an empty Dashboard](walkthrough/challenge-01/solution-01.md)** +- Walkthrough Challenge 2: **[Configure Virtual Machine Logs](walkthrough/challenge-02/solution-02.md)** +- Walkthrough Challenge 3: **[Enable Virtual Machine Insights](walkthrough/challenge-03/solution-03.md)** +- Walkthrough Challenge 4: **[Create alerts](walkthrough/challenge-04/solution-04.md)** +- Walkthrough Challenge 5: **[Workbooks](walkthrough/challenge-05/solution-05.md)** +- Walkthrough Challenge 6: **[Collect custom text logs with Azure Monitor Agent](walkthrough/challenge-06/solution-06.md)** -## **Finished?** - -Congratulations! :partying_face: You finished the MicroHack for monitoring virutal machines in Azure Monitor. - -We hope you've had the opportunity to experience Azure's Monitoring features. - -If you would like to give us feedback, please don't hesitate to open an issue in the repository or contact one of us directly. - -Thank you for taking the time and see you next time! - -### Delete your lab - -If you have used your own subscription to provision the lab, you can delete the lab environment by simply deleting the resource group you created. If you have used the provisioned subscription, no action is required. ## **Contributor** diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/00_challenge.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-01.md similarity index 95% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/00_challenge.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-01.md index 8d1625c5c..f5f844b0d 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/00_challenge.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-01.md @@ -1,4 +1,6 @@ -# Challenge 0 - Explore the lab environment, create an Azure Log Analytics Workspace and an empty Dashboard +# Challenge 1 - Explore the lab environment, create an Azure Log Analytics Workspace and an empty Dashboard + +**[Home](../Readme.md)** - [Next Challenge Solution](challenge-02.md) ## **Goal** @@ -54,4 +56,3 @@ Azure Dashboards are customizable workspaces for monitoring your Azure resources ### Congrats :partying_face: - Move on to [Challenge 1 : Configure Virtual Machine Logs](01_challenge.md). diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/01_challenge.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-02.md similarity index 97% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/01_challenge.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-02.md index 76cf32816..3e4a8abe3 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/01_challenge.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-02.md @@ -1,4 +1,6 @@ -# Challenge 1 - Configure Virtual Machine Logs +# Challenge 2 - Configure Virtual Machine Logs + +[Previous Challenge Solution](challenge-01.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-03.md) First of all and before we start, it's important to understand that monitoring IaaS (e.g. Virtual Machines) and PaaS (e.g. Application Gateway) works differently because of the way you can control the unterlaying infrastrucuture and the shared responsibilty model. In this challenge, we will focus on IaaS monitoring. @@ -95,4 +97,3 @@ Check if the `AMA` was installed on the virtal machine blade under "Extensions ### Congrats :partying_face: - Move on to [Challenge 2 : Enable Virtual Machine Insights](02_challenge.md). diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/02_challenge.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-03.md similarity index 94% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/02_challenge.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-03.md index e5313e1ab..2fdeda15d 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/02_challenge.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-03.md @@ -1,4 +1,6 @@ -# Challenge 2 : Enable Virtual Machine Insights +# Challenge 3 - Enable Virtual Machine Insights + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-04.md) Azure VM Insights is a service that provides performance and health monitoring for virtual machines (VMs) in Azure. It helps you identify and troubleshoot issues with your VMs by providing metrics, logs, and diagnostics data. @@ -55,5 +57,4 @@ VM Insights can be set up in different ways. After the tutorial, you can activat ### Congrats :partying_face: -Move on to [Challenge 3: Create alerts](03_challenge.md). \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/03_challenge.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-04.md similarity index 95% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/03_challenge.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-04.md index 6c03b1a11..3cf6f2c43 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/03_challenge.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-04.md @@ -1,4 +1,6 @@ -# Challenge 3 : Create alerts +# Challenge 4 - Create alerts + +[Previous Challenge Solution](challenge-03.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-05.md) Alerts help you identify and fix problems before users notice them by proactively notifying you when Azure Monitor data indicates a problem with your infrastructure or application. @@ -66,5 +68,3 @@ Create an Activity log alert to track the reboot activity of the linux vm. ### Congrats :partying_face: -Move on to [Challenge 4 : Create Workbooks](04_challenge.md). - \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/04_challenge.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-05.md similarity index 95% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/04_challenge.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-05.md index d78339c76..b5f43ddf0 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/04_challenge.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-05.md @@ -1,4 +1,6 @@ -# Challenge 4: Workbooks +# Challenge 5 - Workbooks + +[Previous Challenge Solution](challenge-04.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-06.md) Workbooks provide a flexible canvas for data analysis and the creation of rich visual reports within the Azure portal. They allow you to tap into multiple data sources from across Azure and combine them into unified interactive experiences. Workbooks let you combine multiple kinds of visualizations and analyses, making them great for freeform exploration. @@ -58,4 +60,3 @@ Set a threshold for the availability rate and add a traffic light icon to the ta ### Congrats :partying_face: -Move on to [Challenge 5 : Collect text logs with Azure Monitor Agent](05_challenge.md). diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/05_challenge.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-06.md similarity index 94% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/05_challenge.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-06.md index 018b948a1..0a7afe343 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/05_challenge.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/challenge-06.md @@ -1,4 +1,6 @@ -# Challenge 5: Collect custom text logs with Azure Monitor Agent +# Challenge 6 - Collect custom text logs with Azure Monitor Agent + +[Previous Challenge Solution](challenge-05.md) - **[Home](../Readme.md)** - [Next Challenge Solution](finish.md) Azure Monitor allows you to collect logs from various sources, including custom logs. Custom logs are logs that are generated by your own applications or services and can be collected using the Azure Monitor agent. You can configure the agent to collect logs from specific files or directories on your virtual machines or from specific event logs on Windows machines. Once collected, you can analyze and query the logs using Azure Monitor Log Analytics. diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/finish.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/finish.md new file mode 100644 index 000000000..3168e5da5 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/challenges/finish.md @@ -0,0 +1,18 @@ +# Finish + +[Previous Challenge Solution](challenge-06.md) - **[Home](../Readme.md)** + +## Congratulations + +Congratulations! :partying_face: You finished the MicroHack for monitoring virutal machines in Azure Monitor. + +We hope you've had the opportunity to experience Azure's Monitoring features. + +If you would like to give us feedback, please don't hesitate to open an issue in the repository or contact one of us directly. + +Thank you for taking the time and see you next time! + +### Delete your lab + +If you have used your own subscription to provision the lab, you can delete the lab environment by simply deleting the resource group you created. If you have used the provisioned subscription, no action is required. + diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/solutions/01_sol_challenge.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/solutions/01_sol_challenge.md deleted file mode 100644 index 8b8578526..000000000 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/solutions/01_sol_challenge.md +++ /dev/null @@ -1,9 +0,0 @@ -### Task 5: Availability rate check - -``` -let total_expected_heartbeats = toscalar(Heartbeat | summarize count() by bin(TimeGenerated, 1m) | summarize count()); -Heartbeat -| summarize actual_heartbeats = dcount(bin(TimeGenerated, 1m)) by Computer -| extend availability_rate = round(actual_heartbeats * 100.0 / total_expected_heartbeats, 2) -| project Computer, availability_rate -``` diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/solutions/02_sol_challenge.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/solutions/02_sol_challenge.md deleted file mode 100644 index a7c87eba9..000000000 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/solutions/02_sol_challenge.md +++ /dev/null @@ -1,22 +0,0 @@ -### *[Optional]* Task 3: Enable VM Insights for `vmss-linux-nginx` automatically - -Use following initiative: [link](https://portal.azure.com/#view/Microsoft_Azure_Policy/InitiativeDetail.ReactView/id/%2Fproviders%2FMicrosoft.Authorization%2FpolicySetDefinitions%2Ff5bf694c-cca7-4033-b883-3a23327d5485/version/1.2.0/scopes~/%5B%22%2Fsubscriptions%2F794194cd-a4b7-4024-970c-9533c4babff0%22%5D). - -Note: make sure to provide the resource ID of the DCR for Linux VMs. - - -### Task 4: Log search and visualize - -- Create a chart with CPU usage trends by computer. Calculate CPU usage patterns over the last hour, chart by percentiles. - -``` -InsightsMetrics -| where TimeGenerated > ago(1h) -| where Name == "UtilizationPercentage" -| summarize - p50 = percentile(Val, 50), - p75 = percentile(Val, 75), - p90 = percentile(Val, 90) - by bin(TimeGenerated, 5m), Computer -| order by TimeGenerated asc -``` \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_01.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_01.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_01.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_01.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_02.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_02.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_02.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_02.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_02_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_02_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_02_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_02_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_e.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_e.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_e.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_e.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_f.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_f.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_03_f.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_03_f.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_4_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_4_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/img/task_4_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/img/task_4_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/solution.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/solution-01.md similarity index 79% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/solution.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/solution-01.md index 327eaafe7..9723e9376 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-0/solution.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-01/solution-01.md @@ -1,13 +1,14 @@ -# Walkthrough Challenge 0 +# Walkthrough Challenge 1 + +**[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-02/solution-02.md) *Duration: 20 Minutes* -- [Walkthrough Challenge 0](#walkthrough-challenge-0) - - [Task 1: Explore and ensure successful deployment](#task-1-explore-and-ensure-successful-deployment) - - [Task 2: Create Log Analytics workspace](#task-2-create-log-analytics-workspace) - - [Task 3: Create an empty Azure Dashboard](#task-3-create-an-empty-azure-dashboard) - - [Task 4: Create an emptpy Monitoring Workbook](#task-4-create-an-emptpy-monitoring-workbook) - - [Links](#links) +- [Task 1: Explore and ensure successful deployment](#task-1-explore-and-ensure-successful-deployment) +- [Task 2: Create Log Analytics workspace](#task-2-create-log-analytics-workspace) +- [Task 3: Create an empty Azure Dashboard](#task-3-create-an-empty-azure-dashboard) +- [Task 4: Create an emptpy Monitoring Workbook](#task-4-create-an-emptpy-monitoring-workbook) +- [Links](#links) ## Task 1: Explore and ensure successful deployment diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_e.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_e.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_e.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_e.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_f.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_f.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_f.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_f.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_g.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_g.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_g.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_g.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_h.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_h.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_h.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_h.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_i.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_i.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_01_i.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_01_i.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_e.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_e.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_e.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_e.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_f.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_f.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_f.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_f.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_g.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_g.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_g.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_g.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_h.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_h.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_h.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_h.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_i.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_i.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_03_i.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_03_i.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_04_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_04_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_04_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_04_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_04_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_04_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_04_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_04_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_04_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_04_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/img/task_04_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/img/task_04_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/solution.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/solution-02.md similarity index 87% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/solution.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/solution-02.md index 656ba05de..9402a4e8e 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-1/solution.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-02/solution-02.md @@ -1,13 +1,14 @@ -# Walkthrough Challenge 1 +# Walkthrough Challenge 2 + +[Previous Challenge Solution](../challenge-01/solution-01.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-03/solution-03.md) *Duration: 45 Minutes* -- [Walkthrough Challenge 1](#walkthrough-challenge--1) - - [Task 1 \& 2](#task-1--2) - - [*\[Optional\]* Task 3: Enable VM Insights for `vmss-linux-nginx` automatically](#optional-task-3-enable-vm-insights-for-vmss-linux-nginx-automatically) - - [Task 4: Validate tables in Log Analytics Workspace](#task-4-validate-tables-in-log-analytics-workspace) - - [Task 5: Availability rate check](#task-5-availability-rate-check) - - [Links](#links) +- [Task 1 \& 2](#task-1--2) +- [*\[Optional\]* Task 3: Enable VM Insights for `vmss-linux-nginx` automatically](#optional-task-3-enable-vm-insights-for-vmss-linux-nginx-automatically) +- [Task 4: Validate tables in Log Analytics Workspace](#task-4-validate-tables-in-log-analytics-workspace) +- [Task 5: Availability rate check](#task-5-availability-rate-check) +- [Links](#links) ## Task 1 & 2 diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_01_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_01_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_01_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_01_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_01_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_01_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_01_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_01_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_01_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_01_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_01_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_01_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_01_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_01_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_01_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_01_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_02_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_02_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_02_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_02_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_02_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_02_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_02_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_02_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_02_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_02_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_02_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_02_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_02_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_02_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_02_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_02_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_03_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_03_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_03_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_03_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_04_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_04_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_04_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_04_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_04_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_04_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/img/task_04_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/img/task_04_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/solution.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/solution-03.md similarity index 72% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/solution.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/solution-03.md index 96eb57f18..55d288c7a 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-2/solution.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-03/solution-03.md @@ -1,12 +1,13 @@ -# Walkthrough Challenge 2 +# Walkthrough Challenge 3 + +[Previous Challenge Solution](../challenge-02/solution-02.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-04/solution-04.md) *Duration: 30 Minutes* -- [Walkthrough Challenge 2](#walkthrough-challenge-2) - - [Task 1: Enable VM Insights for `vm-linux`](#task-1-enable-vm-insights-for-vm-linux) - - [Task 2: Enable VM Insights on unmonitored `vm-windows`](#task-2-enable-vm-insights-on-unmonitored-vm-windows) - - [*\[Optional\]* Task 3: Enable VM Insights for `vmss-linux-nginx` automatically](#optional-task-3-enable-vm-insights-for-vmss-linux-nginx-automatically) - - [Task 4: Log search and visualize](#task-4-log-search-and-visualize) +- [Task 1: Enable VM Insights for `vm-linux`](#task-1-enable-vm-insights-for-vm-linux) +- [Task 2: Enable VM Insights on unmonitored `vm-windows`](#task-2-enable-vm-insights-on-unmonitored-vm-windows) +- [*\[Optional\]* Task 3: Enable VM Insights for `vmss-linux-nginx` automatically](#optional-task-3-enable-vm-insights-for-vmss-linux-nginx-automatically) +- [Task 4: Log search and visualize](#task-4-log-search-and-visualize) ## Task 1: Enable VM Insights for `vm-linux` diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_e.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_e.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_00_e.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_00_e.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_e.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_e.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_e.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_e.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_f.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_f.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_01_f.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_01_f.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_e.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_e.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_02_e.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_02_e.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_e.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_e.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_03_e.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_03_e.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_f.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_f.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_f.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_f.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_g.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_g.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/img/task_04_g.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/img/task_04_g.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/solution.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/solution-04.md similarity index 86% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/solution.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/solution-04.md index 10e8eb169..2182f9354 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-3/solution.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-04/solution-04.md @@ -1,14 +1,15 @@ -# Walkthrough Challenge 3 +# Walkthrough Challenge 4 + +[Previous Challenge Solution](../challenge-03/solution-03.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-05/solution-05.md) *Duration: 45 Minutes* -- [Walkthrough Challenge 3](#walkthrough-challenge-3) - - [Prerequiste](#prerequiste) - - [Task 1: Create an alert for not reporting virtual machines](#task-1-create-an-alert-for-not-reporting-virtual-machines) - - [Task 2: Create a Service Health Alert](#task-2-create-a-service-health-alert) - - [Task 3: Create a Resource Health Alert](#task-3-create-a-resource-health-alert) - - [Task 4: Create an alert which notifies you when the `vm-linux` gets restarted](#task-4-create-an-alert-which-notifies-you-when-the-vm-linux-gets-restarted) - - [Task 5: Knowledge Questions](#task-5-knowledge-questions) +- [Prerequiste](#prerequiste) +- [Task 1: Create an alert for not reporting virtual machines](#task-1-create-an-alert-for-not-reporting-virtual-machines) +- [Task 2: Create a Service Health Alert](#task-2-create-a-service-health-alert) +- [Task 3: Create a Resource Health Alert](#task-3-create-a-resource-health-alert) +- [Task 4: Create an alert which notifies you when the `vm-linux` gets restarted](#task-4-create-an-alert-which-notifies-you-when-the-vm-linux-gets-restarted) +- [Task 5: Knowledge Questions](#task-5-knowledge-questions) ## Prerequiste diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_e.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_e.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_e.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_e.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_f.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_f.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_f.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_f.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_g.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_g.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_01_g.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_01_g.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_3_dashboard.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_3_dashboard.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_3_dashboard.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_3_dashboard.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_4_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_4_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_4_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_4_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_4_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_4_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/img/task_4_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/img/task_4_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/solution.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/solution-05.md similarity index 87% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/solution.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/solution-05.md index 94463c244..6a885c039 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-4/solution.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-05/solution-05.md @@ -1,11 +1,12 @@ -# Walkthrough Challenge 4 +# Walkthrough Challenge 5 + +[Previous Challenge Solution](../challenge-04/solution-04.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-06/solution-06.md) *Duration: 45 Minutes* -- [Walkthrough Challenge 4](#walkthrough-challenge-4) - - [Task 1](#task-1) - - [Task 2](#task-2) - - [Task 3](#task-3) +- [Task 1](#task-1) +- [Task 2](#task-2) +- [Task 3](#task-3) ## Task 1 diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_d.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_d.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_d.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_d.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_e.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_e.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_01_e.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_01_e.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_02_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_02_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_02_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_02_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_02_b.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_02_b.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_02_b.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_02_b.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_02_c.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_02_c.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_02_c.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_02_c.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_03_a.png b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_03_a.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/img/task_03_a.png rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/img/task_03_a.png diff --git a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/solution.md b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/solution-06.md similarity index 93% rename from 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/solution.md rename to 03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/solution-06.md index 33f39a6e6..1d096dda9 100644 --- a/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-5/solution.md +++ b/03-Azure/01-03-Infrastructure/07_Azure_Monitor/walkthrough/challenge-06/solution-06.md @@ -1,13 +1,14 @@ -# Walkthrough Challenge 5 +# Walkthrough Challenge 6 + +[Previous Challenge Solution](../challenge-05/solution-05.md) - **[Home](../../Readme.md)** *Duration: 45 Minutes* -- [Walkthrough Challenge 5](#walkthrough-challenge-5) - - [Task 1](#task-1) - - [Task 2](#task-2) - - [Task 3](#task-3) - - [Task 4](#task-4) - - [Links](#links) +- [Task 1](#task-1) +- [Task 2](#task-2) +- [Task 3](#task-3) +- [Task 4](#task-4) +- [Links](#links) ## Task 1 diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/README.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/README.md index 3905e72c4..312aa55eb 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/README.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/README.md @@ -38,161 +38,28 @@ Furthermore we will address the integration of ODAA into the existing Azure nati ## 🎯 Challenges -### Challenge 0: Set Up Your User Account +- [Challenge 1 - Create an Oracle Database@Azure (ODAA) Subscription](challenges/challenge-01.md) +- [Challenge 2 - Create Azure ODAA [Oracle Database@Azure] Database Resources](challenges/challenge-02.md) +- [Challenge 3 - Update the Oracle ADB NSG and DNS](challenges/challenge-03.md) +- [Challenge 4 - Simulate the On-Premises Environment](challenges/challenge-04.md) +- [Challenge 5 - Measure Network Performance to Your Oracle Database@Azure Autonomous Database](challenges/challenge-05.md) +- [Challenge 6 - Setup High Availability for Oracle ADB](challenges/challenge-06.md) +- [Challenge 7 - (Optional) Use Estate Explorer to visualize the Oracle ADB instance](challenges/challenge-07.md) +- [Challenge 8 - (Optional) Integration of Azure Data Fabric with Oracle ADB](challenges/challenge-08.md) +- [Challenge 9 - (Optional) Enable Microsoft Entra ID Authentication on Autonomous AI Database](challenges/challenge-09.md) + + +## Solutions - Spoiler Warning +- [Solution 1 - Create an Oracle Database@Azure (ODAA) Subscription](walkthrough/challenge-01/solution-01.md) +- [Solution 2 - Create Azure ODAA [Oracle Database@Azure] Database Resources](walkthrough/challenge-02/solution-02.md) +- [Solution 3 - Update the Oracle ADB NSG and DNS](walkthrough/challenge-03/solution-03.md) +- [Solution 4 - Simulate the On-Premises Environment](walkthrough/challenge-04/solution-04.md) +- [Solution 5 - Measure Network Performance to Your Oracle Database@Azure Autonomous Database](walkthrough/challenge-05/solution-05.md) +- [Solution 6 - Setup High Availability for Oracle ADB](walkthrough/challenge-06/solution-06.md) +- [Solution 7 - (Optional) Use Estate Explorer to visualize the Oracle ADB instance](walkthrough/challenge-07/solution-07.md) +- [Solution 8 - (Optional) Integration of Azure Data Fabric with Oracle ADB](walkthrough/challenge-08/solution-08.md) +- [Solution 9 - (Optional) Enable Microsoft Entra ID Authentication on Autonomous AI Database](walkthrough/challenge-09/solution-09.md) -Before we start with the Microhack you should have 3 passwords: -1. You User with the initial password for the registration, which you have to change during the registration - -2. The password you need to use for admin user of the ADB deployment - Don't use different passwords -3. The password you need to use for the AKS cluster deployment - Don't use different passwords - - -Open a private browser session or create an own browser profile to sign in with the credentials you received, and register multi-factor authentication. In a first check you have to verify if the two resource groups for the hackathon are created. -
-The goal is to ensure your Azure account is ready for administrative work in the remaining challenges. - -#### Actions -* Enable the multi factor authentication (MFA) -* Login into the Azure portal with the assigned User -* Verify if the ODAA and AKS resource group including resources are available -* Verfity the users roles - - -#### Sucess criteria -* Download the Microsoft authenticator app on your mobile phone -* Enable MFA for a successful Login -* Check if the resource groups for the aks and ODAA are available and contains the resources. -* Check if the assigned user have the required roles in both resource groups. - -#### Learning Resources -* [Sign in to the Azure portal](https://learn.microsoft.com/azure/azure-portal/azure-portal-sign-in), -* [Set up Microsoft Entra multi-factor authentication](https://learn.microsoft.com/azure/active-directory/authentication/howto-mfa-userdevicesettings) -* [Groups and roles in Azure](https://docs.oracle.com/en-us/iaas/Content/database-at-azure/oaagroupsroles.htm) - -#### Solution -* Challenge 0: [Set Up Your User Account](./walkthrough/setup-user-account/setup-user-account.md) - -
-
- -### Challenge 1: Create an Oracle Database@Azure (ODAA) Subscription - -Review the Oracle Database@Azure service offer, the required Azure resource providers, and the role of the OCI tenancy. By the end you should understand how an Azure subscription links to Oracle Cloud so database services can be created. - -#### Actions -* Move to the ODAA marketplace side. The purchasing is already done, but checkout the implementation of ODAA on the Azure side. -* Access the OCI console via the pre defined federation implementation -* Check if the required Azure resource providers are enabled - - -#### Sucess criteria -* Search for the Oracle Database at Azure -* Make yourself familar with the available services of ODAA and how to purchase ODAA - -#### Learning Resources -* [ODAA in Azure an overview](https://www.oracle.com/cloud/azure/oracle-database-at-azure/) -* [Enhanced Networking for ODAA](https://learn.microsoft.com/en-us/azure/oracle/oracle-db/oracle-database-network-plan) - -#### Solution -* Challenge 1: [Create an Oracle Database@Azure (ODAA) Subscription](./walkthrough/create-odaa-subscription/create-odaa-subscription.md) - - -
-
- - - -### Challenge 2: Create an Oracle Database@Azure (ODAA) Autonomous Database (ADB) Instance - -Walk through the delegated subnet prerequisites, select the assigned resource group, and deploy the Autonomous Database instance with the standard parameters supplied in the guide. Completion is confirmed when the database instance shows a healthy state in the portal. - -#### Actions -* Verify that a delegated subnet of the upcoming ADB deployment is available -* Deploy the ADB in the previous created subnet - - -#### Sucess criteria -* Delegated Subnet is available -* ADB shared is successfully deployed - -#### Learning Resources -* [How to provision an Oracle ADB in Azure](https://learn.microsoft.com/en-us/azure/oracle/oracle-db/oracle-database-provision-autonomous-database) -* [Deploy an ADB in Azure](https://docs.oracle.com/en/solutions/deploy-autonomous-database-db-at-azure/index.html) - -#### Solution -* Challenge 2: [Create an Oracle Database@Azure (ODAA) Autonomous Database (ADB) Instance](./walkthrough/create-odaa-adb/create-odaa-adb.md) - -### Challenge 3: Update the Oracle ADB NSG and DNS - -Update the Network Security Group to allow traffic from the AKS environment and register the Oracle private endpoints in the AKS Private DNS zones. Validate connectivity from AKS after both security and DNS changes are applied. - -#### Actions -* Set the NSG of the CIDR on the OCI side, to allow Ingress from the AKS on the ADB -* Extract the ODAA FQDN and IP Address and assign them to the Azure Private DNS Zones linked to the AKS VNet. - -#### Sucess criteria -* Set the NSG of the CIDR on the OCI side, to allow Ingress from the AKS on the ADB -* DNS is setup correctly. Important: Without a working DNS the next Challenge will failed. - -#### Learning Resources -* [Network security groups overview](https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview), -* [Private DNS zones in Azure](https://learn.microsoft.com/azure/dns/private-dns-privatednszone), -* [Oracle Database@Azure networking guidance](https://docs.oracle.com/en-us/iaas/Content/database-at-azure/azucr-networking-overview.htm) - -#### Solution -* Challenge 3: [Update the Oracle ADB NSG and DNS](./walkthrough/update-odaa-nsg-dns/update-odaa-nsg-dns.md) - -### Challenge 4: Simulate the On-Premises Environment - -Deploy the pre-built Helm chart into AKS to install the sample Oracle database, Data Pump job, GoldenGate services, and Instant Client. Manage the shared secrets carefully and verify that data flows from the source schema into the Autonomous Database target schema. - -#### Actions -* Deploy of the AKS cluster with the responsible Pods, juypter notebook with CPAT, Oracle instant client and Goldengate -* Verify AKS cluster deployment -* Check the connectivity from instant client on the ADB database and check if the SH schema from the 23 ai free edition is migrated to the SH2 schema in the ADB -* Schema the Goldengate configuration - -#### Sucess criteria -* Successful AKS deployment with Pods -* Successful connection from the instant client to the ADB and source database -* Successful login to Goldengate - -#### Learning Resources -* [Connect to an AKS cluster using Azure CLI](https://learn.microsoft.com/azure/aks/learn/quick-kubernetes-deploy-cli), -* [Use Helm with AKS](https://learn.microsoft.com/azure/aks/kubernetes-helm), -* [Oracle GoldenGate Microservices overview](https://docs.oracle.com/en/middleware/goldengate/core/23.3/gghic/oracle-goldengate-microservices-overview.html), -* [Oracle Data Pump overview](https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/introduction-to-oracle-data-pump.html) - -#### Solution -* Challenge 4: [Simulate the On-Premises Environment](./walkthrough/onprem-ramp-up/onprem-ramp-up.md) - -
-
- - -### Challenge 5: Measure Network Performance to Your Oracle Database@Azure Autonomous Database - -Use the Instant Client pod to run the scripted SQL latency test against the Autonomous Database and collect the round-trip results. Optionally supplement the findings with the lightweight TCP probe to observe connection setup timing. - -#### Actions -* Login to the instant client and execute a first performance test from the aks cluster against the deployed ADB - -#### Sucess criteria -* Successful login on the ADB via the instant client -* Sucdessful execution of the available performance scripts - -#### Learning Resources -* [Connect to Oracle Database@Azure using SQL*Plus](https://docs.oracle.com/en-us/iaas/Content/database-at-azure/azucr-connect-sqlplus.htm), -* [Diagnose metrics and logs for Oracle Database@Azure](https://learn.microsoft.com/azure/oracle/oracle-database-at-azure-monitor) - -#### Solution -* Challenge 5: [Measure Network Performance to Your Oracle Database@Azure Autonomous Database](./walkthrough/perf-test-odaa/perf-test-odaa.md) - - ## Contributors diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-01.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-01.md new file mode 100644 index 000000000..975969695 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-01.md @@ -0,0 +1,23 @@ +# Challenge 1 - Create an Oracle Database@Azure (ODAA) Subscription + +**[Home](../Readme.md)** - [Next Challenge Solution](challenge-02.md) + +Please ensure you have completed the prerequisite challenge: + * [Set Up Your User Account - Challenge](setup-user-account.md) + * [Set Up Your User Account - Solution](../walkthrough/prerequisite/setup-user-account.md) + +Review the Oracle Database@Azure service offer, the required Azure resource providers, and the role of the OCI tenancy. By the end you should understand how an Azure subscription links to Oracle Cloud so database services can be created. + +## Actions +* Move to the ODAA marketplace side. The purchasing is already done, but checkout the implementation of ODAA on the Azure side. +* Access the OCI console via the pre defined federation implementation +* Check if the required Azure resource providers are enabled + + +## Sucess criteria +* Search for the Oracle Database at Azure +* Make yourself familar with the available services of ODAA and how to purchase ODAA + +## Learning Resources +* [ODAA in Azure an overview](https://www.oracle.com/cloud/azure/oracle-database-at-azure/) +* [Enhanced Networking for ODAA](https://learn.microsoft.com/en-us/azure/oracle/oracle-db/oracle-database-network-plan) diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-02.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-02.md new file mode 100644 index 000000000..3a2e68a24 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-02.md @@ -0,0 +1,18 @@ +# Challenge 2 - Create Azure ODAA [Oracle Database@Azure] Database Resources + +[Previous Challenge Solution](challenge-01.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-03.md) + +Walk through the delegated subnet prerequisites, select the assigned resource group, and deploy the Autonomous Database instance with the standard parameters supplied in the guide. Completion is confirmed when the database instance shows a healthy state in the portal. + +## Actions +* Verify that a delegated subnet of the upcoming ADB deployment is available +* Deploy the ADB in the previous created subnet + + +## Sucess criteria +* Delegated Subnet is available +* ADB shared is successfully deployed + +## Learning Resources +* [How to provision an Oracle ADB in Azure](https://learn.microsoft.com/en-us/azure/oracle/oracle-db/oracle-database-provision-autonomous-database) +* [Deploy an ADB in Azure](https://docs.oracle.com/en/solutions/deploy-autonomous-database-db-at-azure/index.html) diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-03.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-03.md new file mode 100644 index 000000000..086a398c6 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-03.md @@ -0,0 +1,19 @@ +# Challenge 3 - Update the Oracle ADB NSG and DNS + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-04.md) + +Update the Network Security Group to allow traffic from the AKS environment and register the Oracle private endpoints in the AKS Private DNS zones. Validate connectivity from AKS after both security and DNS changes are applied. + +## Actions +* Set the NSG of the CIDR on the OCI side, to allow Ingress from the AKS on the ADB +* Extract the ODAA FQDN and IP Address and assign them to the Azure Private DNS Zones linked to the AKS VNet. + +## Sucess criteria +* Set the NSG of the CIDR on the OCI side, to allow Ingress from the AKS on the ADB +* DNS is setup correctly. Important: Without a working DNS the next Challenge will failed. + +## Learning Resources +* [Network security groups overview](https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview), +* [Private DNS zones in Azure](https://learn.microsoft.com/azure/dns/private-dns-privatednszone), +* [Oracle Database@Azure networking guidance](https://docs.oracle.com/en-us/iaas/Content/database-at-azure/azucr-networking-overview.htm) + diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-04.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-04.md new file mode 100644 index 000000000..d3d081e0d --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-04.md @@ -0,0 +1,23 @@ +# Challenge 4 - Simulate the On-Premises Environment + +[Previous Challenge Solution](challenge-03.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-05.md) + +Deploy the pre-built Helm chart into AKS to install the sample Oracle database, Data Pump job, GoldenGate services, and Instant Client. Manage the shared secrets carefully and verify that data flows from the source schema into the Autonomous Database target schema. + +## Actions +* Deploy of the AKS cluster with the responsible Pods, juypter notebook with CPAT, Oracle instant client and Goldengate +* Verify AKS cluster deployment +* Check the connectivity from instant client on the ADB database and check if the SH schema from the 23 ai free edition is migrated to the SH2 schema in the ADB +* Schema the Goldengate configuration + +## Sucess criteria +* Successful AKS deployment with Pods +* Successful connection from the instant client to the ADB and source database +* Successful login to Goldengate + +## Learning Resources +* [Connect to an AKS cluster using Azure CLI](https://learn.microsoft.com/azure/aks/learn/quick-kubernetes-deploy-cli), +* [Use Helm with AKS](https://learn.microsoft.com/azure/aks/kubernetes-helm), +* [Oracle GoldenGate Microservices overview](https://docs.oracle.com/en/middleware/goldengate/core/23.3/gghic/oracle-goldengate-microservices-overview.html), +* [Oracle Data Pump overview](https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/introduction-to-oracle-data-pump.html) + diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-05.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-05.md new file mode 100644 index 000000000..d61487e0d --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-05.md @@ -0,0 +1,17 @@ +# Challenge 5 - Measure Network Performance to Your Oracle Database@Azure Autonomous Database + +[Previous Challenge Solution](challenge-04.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-06.md) + +Use the Instant Client pod to run the scripted SQL latency test against the Autonomous Database and collect the round-trip results. Optionally supplement the findings with the lightweight TCP probe to observe connection setup timing. + +## Actions +* Login to the instant client and execute a first performance test from the aks cluster against the deployed ADB + +## Sucess criteria +* Successful login on the ADB via the instant client +* Sucdessful execution of the available performance scripts + +## Learning Resources +* [Connect to Oracle Database@Azure using SQL*Plus](https://docs.oracle.com/en-us/iaas/Content/database-at-azure/azucr-connect-sqlplus.htm), +* [Diagnose metrics and logs for Oracle Database@Azure](https://learn.microsoft.com/azure/oracle/oracle-database-at-azure-monitor) + diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-06.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-06.md new file mode 100644 index 000000000..0591fc1c6 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-06.md @@ -0,0 +1,30 @@ +# Challenge 6 - Setup High Availability for Oracle ADB + +[Previous Challenge Solution](challenge-05.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-07.md) + +## Goal + +The goal of this exercise is to setup high availability configurations for Oracle Autonomous Database (ADB) to ensure business continuity and disaster recovery capabilities. + +## Actions + +* Review the current ADB configuration and service level settings +* Verify existing backup and recovery configurations +* Configure additional high availability features as needed +* Set up cross-region data guard for disaster recovery +* Configure monitoring and alerting for the ADB instance +* Test failover scenarios to validate HA setup +* Perform connectivity tests and verify data consistency + +## Success criteria + +* You have reviewed and documented the current ADB configuration +* You successfully configured backup and recovery settings +* You have successfully setup cross-region data guard (if applicable) +* You have successfully configured monitoring and alerting +* You have validated the HA setup through failover testing +* You have verified data consistency across replicas + +## Learning resources +* Link to https://learn.microsoft.com/en-us/azure/oracle/oracle-db/oracle-database-overview +* Link to https://docs.oracle.com/en/cloud/paas/autonomous-database/ diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-07.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-07.md new file mode 100644 index 000000000..913f389e7 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-07.md @@ -0,0 +1,30 @@ +# Challenge 7 - (Optional) Use Estate Explorer to visualize the Oracle ADB instance + +[Previous Challenge](challenge-06.md) - **[Home](../Readme.md)** - [Next Challenge](challenge-08.md) + +## Goal + +The goal of this exercise is to deploy and configure Estate Explorer to visualize and analyze your Oracle Autonomous Database instance, providing comprehensive insights into your database landscape and performance characteristics. + +## Actions + +* Install Estate Explorer using Helm in your Kubernetes cluster +* Configure the Estate Explorer deployment with the external IP address of your ingress controller +* Set up the database connection credentials in the configuration +* Deploy Estate Explorer to a dedicated namespace +* Access the Estate Explorer interface through the configured ingress +* Connect Estate Explorer to your Oracle ADB instance +* Explore the visualization and analysis capabilities + +## Success criteria + +* You have successfully deployed Estate Explorer using Helm +* All Estate Explorer pods are running in the dedicated namespace +* You can access the Estate Explorer web interface via the ingress controller +* You have successfully configured the connection to your Oracle ADB instance +* You can visualize your Oracle database landscape and explore its features + +## Learning resources +* [Helm Documentation](https://helm.sh/docs/) +* [Oracle Autonomous Database Documentation](https://docs.oracle.com/en/cloud/paas/autonomous-database/) +* [Kubernetes Namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-08.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-08.md new file mode 100644 index 000000000..07363cb77 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-08.md @@ -0,0 +1,30 @@ +# Challenge 8 - (Optional) Integration of Azure Data Fabric with Oracle ADB + +[Previous Challenge Solution](challenge-07.md) - **[Home](../Readme.md)** - [Next Challenge Solution](challenge-09.md) + +## Goal + +The goal of this exercise is to integrate Oracle Autonomous Database (ADB) with Azure Data Fabric to create comprehensive data solutions that leverage both Oracle's database capabilities and Azure's data platform services. You will deploy Oracle GoldenGate for Big Data on your AKS cluster to enable data replication and integration with Azure Data Fabric. + +## Actions + +* Switch to the subscription where your AKS cluster is deployed and connect to the cluster +* Generate the default Helm values for the GoldenGate Big Data deployment +* Retrieve the external IP address of your nginx ingress controller +* Configure the GoldenGate Big Data Helm values file with the correct ingress hostname using the external IP address +* Deploy Oracle GoldenGate for Big Data to your AKS cluster using Helm +* Verify the deployment was successful + +## Success criteria + +* You have successfully connected to your AKS cluster +* You have generated and customized the GoldenGate Big Data Helm values file with the correct ingress configuration +* You have successfully deployed Oracle GoldenGate for Big Data using Helm +* The deployment status shows as "deployed" in the microhacks namespace +* You can access the GoldenGate interface through the configured ingress endpoint + +## Learning resources +* [Azure Data Fabric Documentation](https://docs.microsoft.com/en-us/azure/data-factory/) +* [Oracle ADB Integration Guides](https://docs.oracle.com/en/cloud/paas/autonomous-database/) +* [Oracle GoldenGate for Big Data](https://docs.oracle.com/en/middleware/goldengate/big-data/) +* [Hybrid Data Integration Patterns](https://docs.microsoft.com/en-us/azure/architecture/) diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-09.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-09.md new file mode 100644 index 000000000..6db17bdc2 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/challenge-09.md @@ -0,0 +1,44 @@ +# Challenge 9 - (Optional) Enable Microsoft Entra ID Authentication on Autonomous AI Database + +[Previous Challenge](challenge-08.md) - **[Home](../Readme.md)** - [Next Challenge](finish.md) + +## Goal + +The goal of this exercise is to enable Microsoft Entra ID authentication for your Oracle Autonomous Database, allowing Azure users to authenticate using their Entra ID credentials and OAuth2 tokens instead of traditional database passwords. + +## Additional Context + +Additional context and troubleshooting resources: + * [Debugging Entra ID Auth](../DEBUG-ENTRAID-AUTH.md) + * [Resolution for Entra ID Auth](../RESOLUTION-ENTRAID-AUTH.md) + * [Token Refresh Strategies](../TOKEN-REFRESH-STRATEGIES.md) + +## Actions + +* Create an App Registration in Microsoft Entra ID for your Oracle Autonomous Database +* Configure the App ID URI and enable v2 access tokens in the manifest +* Enable external authentication on the Autonomous Database using `DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION` +* Create a database user mapped to an Azure Entra ID user using the `IDENTIFIED GLOBALLY AS` clause +* Configure network ACLs to allow the database to access Entra ID endpoints (login.windows.net and login.microsoftonline.com) +* Download the database wallet and configure it for OAuth token authentication +* Generate an Entra ID access token and save it to a file +* Configure the SQL*Plus client with `TOKEN_AUTH=OAUTH` and `TOKEN_LOCATION` parameters +* Test the connection by connecting to the database using the OAuth token + +## Success criteria + +* You have successfully created an App Registration in Entra ID with the correct App ID URI +* External authentication is enabled on the database with `identity_provider_type` set to `AZURE_AD` +* You have created a global database user mapped to an Azure Entra ID user +* Network ACLs are configured to allow database access to Entra ID endpoints +* The wallet is configured with `TOKEN_AUTH=OAUTH` and `TOKEN_LOCATION` parameters +* You can successfully obtain an Entra ID access token for your database application +* You can connect to the Autonomous Database using SQL*Plus with the OAuth token (slash login) +* The connection shows the correct Entra ID-authenticated user in the database session + +## Learning resources + +* [Autonomous Database - Enable Microsoft Entra ID Authentication](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/autonomous-azure-ad-enable.html#GUID-C69B47D7-E5B5-4BC5-BB57-EC5BACFAC1DC) +* [Authenticating and Authorizing Microsoft Entra ID Users for Oracle Databases](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/authenticating-and-authorizing-microsoft-entra-id-ms-ei-users-oracle-databases-oracle-exadata.html#GUID-CC8FFE52-DC3B-4F2F-B1CA-308E35288C73) +* [Configuring SQL*Plus for Azure AD Access Tokens](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/authenticating-and-authorizing-microsoft-entra-id-ms-ei-users-oracle-databases-oracle-exadata.html#GUID-89CB6E1E-E383-476A-8B46-4343CEF8512E) +* [Operational Flow for SQL*Plus Client Connection](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/authenticating-and-authorizing-microsoft-entra-id-ms-ei-users-oracle-databases-oracle-exadata.html#GUID-455CDC87-C5A1-4A58-801A-29D216CB66B5) diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/finish.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/finish.md new file mode 100644 index 000000000..e3fb60134 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/finish.md @@ -0,0 +1,11 @@ +# Finish + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** + +## Congratulations + +You finished the MicroHack *Oracle Database @ Azure (ODAA)*. We hope you had the chance to learn about the how to implement a successful... +If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. + +Thank you for investing the time and see you next time! + diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/setup-user-account.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/setup-user-account.md new file mode 100644 index 000000000..7bfa41019 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/challenges/setup-user-account.md @@ -0,0 +1,30 @@ +# Set Up Your User Account + +Before we start with the Microhack you should have 3 passwords: +1. You User with the initial password for the registration, which you have to change during the registration + +2. The password you need to use for admin user of the ADB deployment - Don't use different passwords +3. The password you need to use for the AKS cluster deployment - Don't use different passwords + + +Open a private browser session or create an own browser profile to sign in with the credentials you received, and register multi-factor authentication. In a first check you have to verify if the two resource groups for the hackathon are created. +
+The goal is to ensure your Azure account is ready for administrative work in the remaining challenges. + +#### Actions +* Enable the multi factor authentication (MFA) +* Login into the Azure portal with the assigned User +* Verify if the ODAA and AKS resource group including resources are available +* Verfity the users roles + + +#### Sucess criteria +* Download the Microsoft authenticator app on your mobile phone +* Enable MFA for a successful Login +* Check if the resource groups for the aks and ODAA are available and contains the resources. +* Check if the assigned user have the required roles in both resource groups. + +#### Learning Resources +* [Sign in to the Azure portal](https://learn.microsoft.com/azure/azure-portal/azure-portal-sign-in), +* [Set up Microsoft Entra multi-factor authentication](https://learn.microsoft.com/azure/active-directory/authentication/howto-mfa-userdevicesettings) +* [Groups and roles in Azure](https://docs.oracle.com/en-us/iaas/Content/database-at-azure/oaagroupsroles.htm) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/oci-account-admin-details.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/oci-account-admin-details.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/oci-account-admin-details.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/oci-account-admin-details.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/oci-account-validation-message.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/oci-account-validation-message.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/oci-account-validation-message.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/oci-account-validation-message.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-marketplace-offer.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-marketplace-offer.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-marketplace-offer.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-marketplace-offer.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-marketplace-purchase-options.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-marketplace-purchase-options.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-marketplace-purchase-options.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-marketplace-purchase-options.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-onboarding-final-step.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-onboarding-final-step.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-onboarding-final-step.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-onboarding-final-step.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-onboarding-overview.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-onboarding-overview.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-onboarding-overview.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-onboarding-overview.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-onboarding-step-detail.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-onboarding-step-detail.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-onboarding-step-detail.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-onboarding-step-detail.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-service-deployment-complete.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-service-deployment-complete.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-service-deployment-complete.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-service-deployment-complete.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-service-deployment-progress.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-service-deployment-progress.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-service-deployment-progress.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-service-deployment-progress.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-service-portal-view.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-service-portal-view.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-service-portal-view.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-service-portal-view.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-account-menu.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-account-menu.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-account-menu.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-account-menu.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-activated-status.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-activated-status.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-activated-status.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-activated-status.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-create-oci-link.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-create-oci-link.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-create-oci-link.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-create-oci-link.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-select-default.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-select-default.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-select-default.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-select-default.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-view-oracle-button.jpeg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-view-oracle-button.jpeg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/odaa-subscription-view-oracle-button.jpeg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/odaa-subscription-view-oracle-button.jpeg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/resource_provider.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/resource_provider.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/media/resource_provider.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/media/resource_provider.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/create-odaa-subscription.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/solution-01.md similarity index 98% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/create-odaa-subscription.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/solution-01.md index 861eb851b..9f2bb8ff8 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-subscription/create-odaa-subscription.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-01/solution-01.md @@ -1,6 +1,6 @@ -# πŸš€ Challenge 1: Create Azure ODAA [Oracle Database@Azure] Service +# Challenge 1 - Create an Oracle Database@Azure (ODAA) Subscription -[Back to workspace README](../../README.md) +**[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-02/solution-02.md) > **IMPORTANT: In the case of this Microhack, the ODAA Subscription, which will be discussed here, is already created and therefore your user does not need the create one.** @@ -137,4 +137,3 @@ To purchase an ODAA Subscription via Private Offer, contact the Oracle sales tea Billing and payment for the service is processed through Azure for public and private offers. Payment for ODAA Subscription counts toward Microsoft Azure Consumption Commitment (MACC). Existing Oracle Database software customers can use a bring-your-own-license (BYOL) option or an unlimited license agreement (ULA). On your regular invoice for Azure, charges for ODAA Subscription appear with charges for your other Azure Marketplace services. ([source](https://learn.microsoft.com/en-us/azure/oracle/oracle-db/oracle-database-get-started#purchase-oracle-databaseazure)) -[Back to workspace README](../../README.md) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/adb_creation2.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/adb_creation2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/adb_creation2.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/adb_creation2.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/adb_creation3.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/adb_creation3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/adb_creation3.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/adb_creation3.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/adb_creation_01.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/adb_creation_01.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/adb_creation_01.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/adb_creation_01.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/delegated_subnet.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/delegated_subnet.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/delegated_subnet.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/delegated_subnet.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 10.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 10.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 10.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 11.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 11.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 11.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 12.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 12.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 12.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 13.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 13.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 13.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 2.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 2.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 2.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 3.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 3.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 3.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 4.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 4.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 4.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 5.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 5.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 5.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 6.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 6.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 6.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 7.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 7.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 7.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 8.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 8.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 8.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 9.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy 9.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy 9.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image copy.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image copy.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/image.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/image.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/oci_region_check_compartment.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/oci_region_check_compartment.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/oci_region_check_compartment.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/oci_region_check_compartment.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/vnet_peering/vnet_peering_1.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/vnet_peering/vnet_peering_1.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/vnet_peering/vnet_peering_1.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/vnet_peering/vnet_peering_1.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/vnet_peering/vnet_peering_2.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/vnet_peering/vnet_peering_2.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/vnet_peering/vnet_peering_2.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/vnet_peering/vnet_peering_2.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/vnet_peering/vnet_peering_3.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/vnet_peering/vnet_peering_3.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/media/vnet_peering/vnet_peering_3.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/media/vnet_peering/vnet_peering_3.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/create-odaa-adb.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/solution-02.md similarity index 97% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/create-odaa-adb.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/solution-02.md index fa468874b..66cb658e0 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/create-odaa-adb/create-odaa-adb.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-02/solution-02.md @@ -1,6 +1,6 @@ -# πŸš€ Challenge 2: Create Azure ODAA [Oracle Database@Azure] Database Resources +# Challenge 2 - Create Azure ODAA [Oracle Database@Azure] Database Resources -[Back to workspace README](../../README.md) +[Previous Challenge Solution](../challenge-01/solution-01.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-03/solution-03.md) 1. Registration of the Azure resource provider in Azure. In our case they are alreay deployed but can be checked if they are registered - see [Oracle Documentation: Oracle Database at Azure Network Enhancements](https://learn.microsoft.com/en-us/azure/oracle/oracle-db/oracle-database-network-plan) 2. Check the availability of a vnet and delegated subnet for the deployment of the database. @@ -153,4 +153,3 @@ Oracle Database@Azure ADB doesn’t currently expose aliases for dataStorageSize Currently you can only restrict the locations. -[Back to workspace README](../../README.md) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/OCI_nsg1.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/OCI_nsg1.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/OCI_nsg1.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/OCI_nsg1.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 2.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 2.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 2.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 3.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 3.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 3.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 4.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 4.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 4.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 5.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 5.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 5.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 6.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 6.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 6.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 7.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 7.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 7.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 8.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy 8.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy 8.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image copy.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image copy.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/image.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/image.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/oci_nsg2.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/oci_nsg2.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/oci_nsg2.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/oci_nsg2.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/oci_nsg3.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/oci_nsg3.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/oci_nsg3.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/oci_nsg3.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/oci_nsg4.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/oci_nsg4.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/oci_nsg4.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/oci_nsg4.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/oci_nsg5.jpg b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/oci_nsg5.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/oci_nsg5.jpg rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/oci_nsg5.jpg diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_1.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_1.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_1.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_2.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_2.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_2.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_3.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_3.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_3.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_4.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_4.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_4.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_5.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/private_dns_5.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/private_dns_5.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/prviate_dns_0.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/prviate_dns_0.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/media/prviate_dns_0.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/media/prviate_dns_0.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/update-odaa-nsg-dns.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/solution-03.md similarity index 97% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/update-odaa-nsg-dns.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/solution-03.md index c8c8273c6..d2deca6fd 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/update-odaa-nsg-dns/update-odaa-nsg-dns.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-03/solution-03.md @@ -1,6 +1,6 @@ -# πŸ” Challenge 3: Update Oracle ADB NSG and DNS Configuration +# Challenge 3 - Update Oracle ADB NSG and DNS Configuration -[Back to workspace README](../../README.md) +[Previous Challenge Solution](../challenge-02/solution-02.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-04/solution-04.md) ## 🌐 Network Security Group Configuration @@ -206,4 +206,3 @@ t6bchxz9 192.168.0.185 > NOTE: The script does already create A-Records for all 4 private DNS zones linked to the AKS VNet. But we are going only use the one which contain paris in the name for the moment. -[Back to workspace README](../../README.md) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/onprem-ramp-up/onprem-ramp-up.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-04/solution-04.md similarity index 99% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/onprem-ramp-up/onprem-ramp-up.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-04/solution-04.md index 989405603..86e048a35 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/onprem-ramp-up/onprem-ramp-up.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-04/solution-04.md @@ -1,6 +1,7 @@ -# πŸ”„ Challenge 4: OnPrem ramp up +# Challenge 4 - OnPrem ramp up + +[Previous Challenge Solution](../challenge-03/solution-03.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-05/solution-05.md) -[Back to workspace README](../../README.md) After you successfully created the ODAA Autonomous Database instance, you will now setup Oracle Data Pump and GoldenGate to replicate data from an on-premises Oracle database running in Azure Kubernetes Service (AKS) to the ODAA ADB instance. @@ -590,4 +591,3 @@ kubectl logs -n microhacks $podBigDataName kubectl describe pod $podBigDataName -n microhacks | Select-String -Pattern "Failed|Error|Warning" -A 2 -B 2 ~~~ -[Back to workspace README](../../README.md) diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/perf-test-odaa/perf-test-odaa.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-05/solution-05.md similarity index 99% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/perf-test-odaa/perf-test-odaa.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-05/solution-05.md index dd4288259..1dfe593dd 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/perf-test-odaa/perf-test-odaa.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-05/solution-05.md @@ -1,6 +1,6 @@ -# πŸ”Œ Challenge 3: Perform Connectivity Tests on Oracle Database@azure [ODAA] Autonoumous Database +# Challenge 5 - Measure Network Performance to Your Oracle Database@Azure Autonomous Database -[Back to workspace README](../../README.md) +[Previous Challenge Solution](../challenge-04/solution-04.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-06/solution-06.md) ODAA Autonoumous Database are so called PaaS (Platform as a Service) offerings, where the underlying infrastructure is fully managed by Microsoft and Oracle. @@ -701,4 +701,3 @@ Exit Pod exit ~~~ --> -[Back to workspace README](../../README.md) \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/ha-oracle-adb/ha-oracle-adb.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-06/solution-06.md similarity index 83% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/ha-oracle-adb/ha-oracle-adb.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-06/solution-06.md index 7ee42259c..2d66ef0fa 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/ha-oracle-adb/ha-oracle-adb.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-06/solution-06.md @@ -1,6 +1,6 @@ -# πŸ—οΈ Challenge 6: Setup High Availability for Oracle ADB +# Challenge 6 - Setup High Availability for Oracle ADB -[Back to workspace README](../../README.md) +[Previous Challenge Solution](../challenge-05/solution-05.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-07/solution-07.md) ⚑ This challenge focuses on setting up high availability configurations for Oracle Autonomous Database (ADB) to ensure business continuity and disaster recovery capabilities. @@ -26,4 +26,3 @@ > ℹ️ **NOTE**: Specific implementation steps depend on your organization's requirements. Please refer to Oracle documentation for detailed high availability setup procedures for Oracle ADB on Azure. -[Back to workspace README](../../README.md) diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/estate-explorer-odaa/estate-explorer-odaa.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-07/solution-07.md similarity index 83% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/estate-explorer-odaa/estate-explorer-odaa.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-07/solution-07.md index 2e110a9ac..7add31624 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/estate-explorer-odaa/estate-explorer-odaa.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-07/solution-07.md @@ -1,6 +1,6 @@ -# πŸ“Š Challenge 7: (Optional) Use Estate Explorer to visualize the Oracle ADB instance +# Challenge 7 - (Optional) Use Estate Explorer to visualize the Oracle ADB instance -[Back to workspace README](../../README.md) +[Previous Challenge Solution](../challenge-06/solution-06.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-08/solution-08.md) ## 🎯 Overview diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/azure-data-fabric-odaa/azure-data-fabric-odaa.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-08/solution-08.md similarity index 95% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/azure-data-fabric-odaa/azure-data-fabric-odaa.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-08/solution-08.md index 13be01d71..0e809f263 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/azure-data-fabric-odaa/azure-data-fabric-odaa.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-08/solution-08.md @@ -1,6 +1,6 @@ -# 🧡 Challenge 8: (Optional) Integration of Azure Data Fabric with Oracle ADB +# Challenge 8 - (Optional) Integration of Azure Data Fabric with Oracle ADB -[Back to workspace README](../../README.md) +[Previous Challenge Solution](../challenge-07/solution-07.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-09/solution-09.md) ## 🎯 Overview diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/entraid/entraid.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-09/solution-09.md similarity index 98% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/entraid/entraid.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-09/solution-09.md index 0a3c7f7a5..18d0fa8d6 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/entraid/entraid.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/challenge-09/solution-09.md @@ -1,6 +1,8 @@ -# πŸ” Enable Microsoft Entra ID Authentication on Autonomous AI Database +# Solution 9 - (Optional) Enable Microsoft Entra ID Authentication on Autonomous AI Database + +[Previous Challenge Solution](../challenge-08/solution-08.md) - **[Home](../../Readme.md)** + -[Back to workspace README](../../README.md) - [Oracle guide to enabling Entra ID authentication](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/autonomous-azure-ad-enable.html#GUID-C69B47D7-E5B5-4BC5-BB57-EC5BACFAC1DC) - [Oracle database authentication steps](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/authenticating-and-authorizing-microsoft-entra-id-ms-ei-users-oracle-databases-oracle-exadata.html#GUID-CC8FFE52-DC3B-4F2F-B1CA-308E35288C73) diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/image.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/image.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/image.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/image.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 2.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 2.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 2.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 3.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 3.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 3.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 4.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 4.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 4.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 5.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 5.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 5.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 6.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 6.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 6.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 7.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy 7.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy 7.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image copy.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image copy.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image.png b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/media/image.png rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/media/image.png diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/setup-user-account.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/setup-user-account.md similarity index 98% rename from 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/setup-user-account.md rename to 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/setup-user-account.md index 640689343..8fb1ec9b0 100644 --- a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/setup-user-account/setup-user-account.md +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/walkthrough/prerequisite/setup-user-account.md @@ -1,7 +1,5 @@ # Setup your User Account on Azure -[Back to workspace README](../../README.md) - IMPORTANT due to time restrictions
Before you start with the Microhack download the Microsoft Authenticator App on your mobile phone. The App is required for the multi factor authentication. @@ -164,4 +162,3 @@ Your final cloud shell should look similar to this one * Find the goup "mh-odaa-user-grp" and add the group to the excluded users - [see](../../media/conditional_access_issue/conditional%20access%20issue%205.png) * Finally press the Save button -[Back to workspace README](../../README.md) \ No newline at end of file diff --git a/99-MicroHack-Template/Readme.md b/99-MicroHack-Template/Readme.md index 47110e6bb..5939d2dae 100644 --- a/99-MicroHack-Template/Readme.md +++ b/99-MicroHack-Template/Readme.md @@ -50,64 +50,17 @@ Permissions for the deployment: - Contributor on your Resource Group - Other necessary permissions -## Challenge 1 - Prerequisites and landing zone preparation -### Goal +## Challenges -The goal of this exercise is to deploy... +* [Challenge 1 - title](challenges/challenge-01.md) **<- Start here** +* [Challenge 2 - title](challenges/challenge-02.md) -### Actions +## Solutions - Spoilerwarning -* Write down the first 3 steps.... -* Set up and enable... -* Perform and monitor.... +* [Solution 1 - title](./walkthrough/challenge-01/solution-01.md) +* [Solution 2 - title](./walkthrough/challenge-02/solution-02.md) -### Success criteria - -* You have deployed .... -* You successfully enabled ... -* You have successfully setup .... -* You have successfully .... - -### Learning resources -* Link to https://learn.microsoft.com/en-us/azure/.... - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-1/solution.md) - -## Challenge 2 - ... - -### Goal - -The goal of this exercise is to deploy... - -### Actions - -* Write down the first 3 steps.... -* Set up and enable... -* Perform and monitor.... - -### Success criteria - -* You have deployed .... -* You successfully enabled ... -* You have successfully setup .... -* You have successfully .... - -### Learning resources -* Link to https://learn.microsoft.com/en-us/azure/.... - -### Solution - Spoilerwarning - -[Solution Steps](./walkthrough/challenge-2/solution.md) - -## Finish - -Congratulations! You finished the MicroHack *Name*. We hope you had the chance to learn about the how to implement a successful... -If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. - -Thank you for investing the time and see you next time! ## Contributors diff --git a/99-MicroHack-Template/challenges/challenge-01.md b/99-MicroHack-Template/challenges/challenge-01.md new file mode 100644 index 000000000..8f9bc8fb0 --- /dev/null +++ b/99-MicroHack-Template/challenges/challenge-01.md @@ -0,0 +1,24 @@ +# Challenge 1 - Prerequisites and landing zone preparation + +**[Home](../Readme.md)** - [Next Challenge Solution](challenge-02.md) + +## Goal + +The goal of this exercise is to deploy... + +## Actions + +* Write down the first 3 steps.... +* Set up and enable... +* Perform and monitor.... + +## Success criteria + +* You have deployed .... +* You successfully enabled ... +* You have successfully setup .... +* You have successfully .... + +## Learning resources +* Link to https://learn.microsoft.com/en-us/azure/.... + diff --git a/99-MicroHack-Template/challenges/challenge-02.md b/99-MicroHack-Template/challenges/challenge-02.md new file mode 100644 index 000000000..27f4818da --- /dev/null +++ b/99-MicroHack-Template/challenges/challenge-02.md @@ -0,0 +1,23 @@ +# Challenge 2 - ... + +[Previous Challenge Solution](challenge-01.md) - **[Home](../Readme.md)** - [Next Challenge Solution](finish.md) + +## Goal + +The goal of this exercise is to deploy... + +## Actions + +* Write down the first 3 steps.... +* Set up and enable... +* Perform and monitor.... + +## Success criteria + +* You have deployed .... +* You successfully enabled ... +* You have successfully setup .... +* You have successfully .... + +## Learning resources +* Link to https://learn.microsoft.com/en-us/azure/.... diff --git a/99-MicroHack-Template/challenges/finish.md b/99-MicroHack-Template/challenges/finish.md new file mode 100644 index 000000000..a1dd58f77 --- /dev/null +++ b/99-MicroHack-Template/challenges/finish.md @@ -0,0 +1,11 @@ +# Finish + +[Previous Challenge Solution](challenge-02.md) - **[Home](../Readme.md)** + +## Congratulations + +You finished the MicroHack *Name*. We hope you had the chance to learn about the how to implement a successful... +If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. + +Thank you for investing the time and see you next time! + diff --git a/99-MicroHack-Template/walkthrough/challenge-1/solution.md b/99-MicroHack-Template/walkthrough/challenge-01/solution-01.md similarity index 91% rename from 99-MicroHack-Template/walkthrough/challenge-1/solution.md rename to 99-MicroHack-Template/walkthrough/challenge-01/solution-01.md index ad85b171a..5e295bfbd 100644 --- a/99-MicroHack-Template/walkthrough/challenge-1/solution.md +++ b/99-MicroHack-Template/walkthrough/challenge-01/solution-01.md @@ -1,5 +1,7 @@ # Walkthrough Challenge 1 - Prerequisites and Landing Zone +**[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-02/solution-02.md) + Duration: 20 minutes ## Prerequisites @@ -33,4 +35,3 @@ Please ensure that you successfully verified the [General prerequisits](../../Re You successfully completed challenge 1! πŸš€πŸš€πŸš€ - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-2/solution.md) \ No newline at end of file diff --git a/99-MicroHack-Template/walkthrough/challenge-02/solution-02.md b/99-MicroHack-Template/walkthrough/challenge-02/solution-02.md new file mode 100644 index 000000000..0cbc6aabd --- /dev/null +++ b/99-MicroHack-Template/walkthrough/challenge-02/solution-02.md @@ -0,0 +1,37 @@ +# Walkthrough Challenge 1 - Prerequisites and Landing Zone + +[Previous Challenge Solution](../challenge-01/solution-01.md) - **[Home](../../Readme.md)** - [Next Challenge Solution](../challenge-03/solution-03.md) + +Duration: 20 minutes + +## Prerequisites + +Please ensure that you successfully verified the [General prerequisits](../../Readme.md#general-prerequisites) before continuing with this challenge. + +### **Task 1: Write down...** + +πŸ’‘ The first.... + +πŸ’₯ **Here are the first three general steps that are typically happen:** +1. Everybody struggles with finding the right person.... +2. If somebody finds the plan, the first three actions... +3. Do not sress to much we have a... + +πŸ”‘ **Key to a successful strategy....** +- The key to success is not a technical consideration of.... + +### **Task 2: Think about if...** + + +### **Task 3: Put yourself in the position...** + +* [Checklist Testing for...](Link to checklist or microsoft docs) + +### Task 4: Who defines the requirements... + + +![image](Link to image) + + +You successfully completed challenge 1! πŸš€πŸš€πŸš€ + diff --git a/99-MicroHack-Template/walkthrough/challenge-2/solution.md b/99-MicroHack-Template/walkthrough/challenge-2/solution.md deleted file mode 100644 index e69de29bb..000000000