You need to evaluate the use of Azure Web apps for hosting Contoso's web sites, hosted currently in the company's on-premises data centers. The web sites are running on Windows servers using PHP runtime stack. You also need to determine how you can implement DevOps practices by leveraging Azure web apps deployment slots.
## Objectives
In this lab, you will:
+ Task 1: Create an Azure web app
+ Task 2: Create a staging deployment slot
+ Task 3: Configure web app deployment settings
+ Task 4: Deploy code to the staging deployment slot
+ Task 5: Swap the staging slots
+ Task 6: Configure and test autoscaling of the Azure web app
>**Note:** The password must be at least eight characters long, with two of the following three elements: letters, numbers, and non-alphanumeric characters.
>**Note:** You will need these credentials in the next task of this lab.
#### Task 4: Deploy code to the staging deployment slot
In this task, you will deploy code to the staging deployment slot.
1. In the Azure portal, open the **Azure Cloud Shell** by clicking on the icon in the top right of the Azure Portal.
1. If prompted to select either **Bash** or **PowerShell**, select **PowerShell**.
>**Note**: If this is the first time you are starting **Cloud Shell** and you are presented with the **You have no storage mounted** message, select the subscription you are using in this lab, and click **Create storage**.
1. From the Cloud Shell pane, run the following to clone the remote repository containing the code for the web app.
1. From the Cloud Shell pane, run the following to set the current location to the newly created clone of the local repository containing the sample web app code.
1. From the Cloud Shell pane, run the following to add the remote git (make sure to replace the `[deployment_user_name]` and `[git_clone_url]` placeholders with the value of the **Deployment Credentials** user name and **Git Clone Url**, respectively, which you identified in previous task):
>**Note**: The value following `git remote add` does not have to match the **Deployment Credentials** user name, but has to be unique
1. From the Cloud Shell pane, run the following to push the sample web app code from the local repository to the Azure web app staging deployment slot (make sure to replace the `[deployment_user_name]` placeholder with the value of the **Deployment Credentials** user name, which you identified in previous task):
1. Navigate back to the blade displaying the production slot of the web app.
1. In the **Deployment** section, click **Deployment slots** and then, click **Swap** toolbar icon.
1. On the **Swap** blade, review the default settings and click **Swap**.
1. Click **Overview** on the production slot blade of the web app and then click the **URL** link to display the web site home page in a new browser tab.
1. Verify the default web page has been replaced with the **Hello World!** page.
>**Note**: Obviously these values do not represent a realistic configuration, since their purpose is to trigger autoscaling as soon as possible, without extended wait period.
while ($true) { Invoke-WebRequest -Uri $webapp.DefaultHostName }
```
1. Minimize the Cloud Shell pane (but do not close it) and, on the web app blade, in the **Monitoring** section, click **Process explorer**.
>**Note**: Process explorer facilitates monitoring the number of instances and their resource utilization.
1. Monitor the utilization and the number of instances for a few minutes.
>**Note**: You may need to **Refresh** the page.
1. Once you notice that the number of instances has increased to 2, reopen the Cloud Shell pane and terminate the script by pressing **Ctrl+C**.
1. Close the Cloud Shell pane.
#### Clean up resources
>**Note**: Remember to remove any newly created Azure resources that you no longer use. Removing unused resources ensures you will not see unexpected charges.
1. In the Azure portal, open the **PowerShell** session within the **Cloud Shell** pane.
1. List all resource groups created throughout the labs of this module by running the following command:
>**Note**: The command executes asynchronously (as determined by the -AsJob parameter), so while you will be able to run another PowerShell command immediately afterwards within the same PowerShell session, it will take a few minutes before the resource groups are actually removed.