Host a Static Website on Azure Blob Storage

Deploy a live website on Azure Blob Storage and master AZ-900 storage concepts.

Introduction

30 Second Summary

Every website needs somewhere to live. Cloud storage lets you host and serve web content to anyone in the world, without setting up or managing a physical server.

In this project, you will build and deploy a multi-page website on Azure Blob Storage. Along the way, you will get hands-on with every storage concept the AZ-900 exam tests, from redundancy options and access tiers to data movement with AzCopy.

What You'll Build

A fully styled website, live on the internet and hosted entirely on Azure Blob Storage, that you can pull up in any browser and share by sending the URL.

By the end of this project, you'll have:

  • A live website served from Azure Blob Storage's static website feature, accessible via a public URL.
  • A storage account where you have changed redundancy from single-datacenter to cross-region and experimented with access tiers from Hot all the way to Archive, seeing the trade-offs first-hand.
  • Files deployed to Azure using AzCopy, the command-line data movement tool tested on the AZ-900 exam.
  • Secret Mission: Set up a lifecycle management policy to automate access tier transitions.

Are there any prerequisites?

You will need an Azure account with free credits remaining. You should also be comfortable navigating the Azure Portal.

Before We Start

Before we dive in, let's lock in what you're about to build and why it matters for the AZ-900 exam.

Set Up AzCopy

You've committed to building a static website on Azure Blob Storage. Time to get your tools ready.

Your Azure account is already set up, so the Azure Portal is ready to go. The one tool still missing is AzCopy, a command-line utility for moving data into Azure Storage. Installing it now means no interruptions when it's time to deploy your website.

In this step, get ready to:
  • Download AzCopy v10 for Windows.
  • Extract the zip archive and locate the executable.
  • Verify AzCopy works by running a version check in PowerShell.
Download and extract AzCopy v10
  • Download the AzCopy v10 zip archive for Windows from the official download page.
  • Open File Explorer and navigate to your Downloads folder.
  • Right-click the downloaded zip file and select Extract All.
  • In the destination field, type C:\azcopy.
  • Click Extract.

Windows opens the C:\azcopy folder automatically. Inside, you'll see a subfolder with a long name containing azcopy.exe.

What is AzCopy?

AzCopy is a command-line tool from Microsoft for copying data to and from Azure Storage. It's a single executable with no extra dependencies, making it the fastest data movement tool to set up.

The AZ-900 exam tests your knowledge of data movement options including AzCopy, Azure Storage Explorer, and Azure File Sync. This project uses AzCopy because it's lightweight and teaches the CLI-based data movement pattern.

Verify AzCopy in PowerShell

Now that AzCopy is extracted, you need to confirm the executable actually runs.

  • Press the Windows key to open your search bar.
  • Type PowerShell and press Enter to open PowerShell.
  • Navigate to the AzCopy folder by running this command:
cd C:\azcopy
  • List the folder contents by running:
dir

You'll see a folder with a name starting with azcopy_windows. This is where azcopy.exe lives.

  • Navigate into that subfolder by running:
cd azcopy*

What does this command do?

The * is a wildcard that matches any folder name starting with azcopy. This saves you from typing the full version-numbered folder name.

Before you run the next command, what do you expect to see if AzCopy is set up correctly?

  • Check that AzCopy works by running:
.\azcopy --version

✔️ I see a version number

You should see output like azcopy version 10.x.x. AzCopy is installed and ready to use.

ⓧ I see an error or nothing happens

  • Run dir to check whether azcopy.exe is listed in your current folder. If not, you're in the wrong directory.
  • Navigate back up with cd C:\azcopy, then run dir to find the subfolder name and cd into it.
  • If the folder is empty, re-download the zip from the official download page and extract again to C:\azcopy.

Still stuck?

Help me troubleshoot my AzCopy installation.

AzCopy is locked and loaded. Next up, you'll create your Azure Storage account and launch a live website.

Create a Storage Account and Launch Your Website

AzCopy is installed and ready to go. Now it is time to create the Azure resources that will host your website.

You need a live website in a storage account before you can explore features like access tiers and redundancy. Hosting it through Blob Storage's static website feature gives you a public URL and a visible payoff in minutes.

In this step, get ready to:
  • Create an Azure Storage account with the right configuration.
  • Enable static website hosting and copy the public URL.
  • Upload HTML files and visit your live website.
Create a storage account in the Azure Portal

Every Azure resource lives inside a storage account, and every storage account lives inside a resource group. You will create both from scratch right now.

  • In the Azure Portal, type Storage accounts in the search bar at the top of the page.
  • Select Storage accounts from the results.
  • Click + Create.

The Create a storage account page opens on the Basics tab.

  • Leave Subscription set to your current subscription.
  • Under Resource group, click Create new.
  • Enter a name for your resource group (for example, az900-storage-lab) and click OK.
  • In the Storage account name field, enter a globally unique name using only lowercase letters and numbers (for example, az900yourname).
  • Record your storage account name here: your storage account name
  • Select a Region close to you.
  • Set Performance to Standard.
  • Set Redundancy to LRS (Locally-redundant storage).

What do these settings mean?

Standard performance is for general-purpose workloads and is the recommended tier for most scenarios.

StorageV2 (general-purpose v2) is the default account type. It supports blobs, files, queues, and tables.

LRS keeps three copies of your data in a single datacenter. It is the lowest-cost redundancy option, providing at least 99.999999999% (11 nines) durability.

  • Click the Advanced tab at the top.
  • Under Blob storage, confirm that Access tier is set to Hot. This is the default.

What is the Hot access tier?

Hot tier is optimized for data you access frequently. It has the highest storage cost but the lowest access cost. Your website files are a perfect fit because visitors request them constantly.

  • Click Review + create at the bottom of the page.
  • Review the summary, then click Create.

Azure begins deploying your storage account. This takes about 30 seconds.

  • When the deployment completes, click Go to resource.

You are now on the storage account's Overview page. You can see the account name, resource group, and region you selected.

Deployment failed?

The most common cause is a storage account name that is not unique. Storage account names must be globally unique across all of Azure. Try a different name with more characters or numbers.

If the error mentions your subscription, confirm your Azure free credits have not expired.

Help me troubleshoot my storage account deployment

Enable static website hosting

Azure Blob Storage can serve static files (HTML, CSS, JavaScript) directly to browsers. You just need to turn the feature on and tell Azure which file is your homepage.

  • In the left menu of your storage account, scroll down to Data management.
  • Select Static website.
  • Toggle the status to Enabled.
  • In the Index document name field, type index.html.
  • In the Error document path field, type error.html.
  • Click Save.

After saving, a Primary endpoint URL appears on the page. This is the public web address for your website.

  • Copy the Primary endpoint URL and save it here: your primary endpoint URL

What just happened?

Enabling static website hosting automatically creates a special container called $web in your storage account. Any files you upload to $web are served publicly at the primary endpoint URL.

The index.html file is your homepage. The error.html file is shown whenever someone visits a page that does not exist.

Don't see the Primary endpoint?

Make sure you clicked Save after toggling the status to Enabled. The endpoint only appears after the settings are saved.

Help me find the primary endpoint for my static website

Create your website files and upload them

Your storage account is ready to serve web pages. Now you need to create the HTML files and upload them to the $web container.

  • Create a folder for your website files by running this command in PowerShell:
mkdir C:\mywebsite
  • Open index.html in Notepad by running this command:
notepad C:\mywebsite\index.html
  • Notepad asks if you want to create a new file. Click Yes.
  • Paste the following HTML code into the empty Notepad window:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Azure Website</title>
</head>
<body>
    <header>
        <h1>My Azure Website</h1>
    </header>
    <main>
        <h2>Welcome!</h2>
        <p>This website is hosted on Azure Blob Storage using static website hosting.</p>
        <p>It demonstrates core Azure Storage concepts for the AZ-900 exam.</p>
    </main>
    <footer>
        <p>Hosted on Azure Blob Storage</p>
    </footer>
</body>
</html>

What does this HTML do?

  • The <header> contains the site title that appears at the top of the page.
  • The <main> section holds the welcome message and a description of the project.
  • The <footer> shows a line of text at the bottom confirming the site is hosted on Azure Blob Storage.
  • Press Ctrl+S to save the file, then close Notepad.
  • Confirm index.html was saved by running:
ls C:\mywebsite

You should see index.html listed in the output.

✔️ Awesome, I've got everything!

Double check you have saved index.html in the C:\mywebsite folder.

ⓧ I'd like to double check the full code

Your index.html should look exactly like this:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Azure Website</title>
</head>
<body>
    <header>
        <h1>My Azure Website</h1>
    </header>
    <main>
        <h2>Welcome!</h2>
        <p>This website is hosted on Azure Blob Storage using static website hosting.</p>
        <p>It demonstrates core Azure Storage concepts for the AZ-900 exam.</p>
    </main>
    <footer>
        <p>Hosted on Azure Blob Storage</p>
    </footer>
</body>
</html>
  • Open error.html in Notepad by running this command:
notepad C:\mywebsite\error.html
  • Notepad asks if you want to create a new file. Click Yes.
  • Paste the following HTML code into the empty Notepad window:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Page Not Found</title>
</head>
<body>
    <header>
        <h1>My Azure Website</h1>
    </header>
    <main>
        <h2>404 - Page Not Found</h2>
        <p>The page you are looking for does not exist.</p>
        <a href="index.html">Go back to the homepage</a>
    </main>
    <footer>
        <p>Hosted on Azure Blob Storage</p>
    </footer>
</body>
</html>

What does this HTML do?

This is your 404 error page. When a visitor tries to access a page that does not exist on your website, Azure serves this file instead of a generic browser error.

The link at the bottom lets visitors navigate back to the homepage.

  • Press Ctrl+S to save the file, then close Notepad.
  • Confirm both files exist by running:
ls C:\mywebsite

You should see both index.html and error.html listed in the output.

✔️ Awesome, I've got everything!

Double check you have saved both index.html and error.html in the C:\mywebsite folder.

ⓧ I'd like to double check the full code

Your error.html should look exactly like this:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Page Not Found</title>
</head>
<body>
    <header>
        <h1>My Azure Website</h1>
    </header>
    <main>
        <h2>404 - Page Not Found</h2>
        <p>The page you are looking for does not exist.</p>
        <a href="index.html">Go back to the homepage</a>
    </main>
    <footer>
        <p>Hosted on Azure Blob Storage</p>
    </footer>
</body>
</html>

Files not showing up?

If ls does not show your files, make sure you saved them to C:\mywebsite and not to a different folder. Reopen Notepad with the same command and check the title bar for the file path.

Help me find my saved HTML files

Now upload both files to the $web container in the Azure Portal.

  • Switch back to the Azure Portal in your browser.
  • In the left menu of your storage account, under Data storage, click Containers.
  • Click the $web container to open it.
  • Click Upload.
  • In the upload panel, click Browse for files.
  • Navigate to C:\mywebsite, select both index.html and error.html, then click Open.
  • Click Upload to upload both files.

After the upload completes, you should see index.html and error.html listed inside the $web container.

Don't see the $web container?

The $web container is created automatically when you enable static website hosting. If it is missing, go back to Data management > Static website and confirm the status shows Enabled.

Help me find the $web container

Before you open the URL, what do you think you will see when you visit your primary endpoint?

  • Open a new browser tab and paste your Primary endpoint URL: your primary endpoint URL

You should see your website with the heading "My Azure Website" and the welcome message below it. Your website is live on the internet, hosted entirely on Azure Blob Storage.

Seeing an error page instead?

If you see the 404 error page, make sure you uploaded a file named exactly index.html (not index.html.txt) to the $web container. Click the file in the container to check its name.

If the browser shows a generic "page not found" error, double check that you copied the full Primary endpoint URL, including the trailing slash.

Help me get my Azure static website working

Your website is live and serving pages from Azure Blob Storage. Next up, you will add more pages and styling, then deploy them all at once using AzCopy.

Deploy Files with AzCopy

Your website is live, but it is just plain HTML with no styling or navigation. Adding more pages through the Azure Portal means uploading files one at a time, which does not scale.

AzCopy solves this by letting you deploy an entire folder in a single command. In this step, you will create a stylesheet and an About page, generate a SAS token for secure access, and use AzCopy to batch-upload everything to Azure.

In this step, get ready to:
  • Create style.css and about.html and update the existing HTML files with styling and navigation.
  • Generate a SAS token for secure access to your storage account.
  • Use AzCopy to batch-upload all files to the $web container.
Create the website files

Your current website has no CSS and no navigation links between pages. You need four files in total: a stylesheet, an About page, and updated versions of your homepage and error page.

  • Open a text editor (Notepad or any editor you prefer).
  • Create a new file and save it as style.css inside your C:\mywebsite folder.
  • Paste the following layout and header styles into style.css:
/* Page layout */
body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 0;
    background-color: #f4f4f4;
    color: #333;
}

/* Blue header bar */
header {
    background-color: #0078d4;
    color: white;
    padding: 1rem 2rem;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

header h1 {
    margin: 0;
    font-size: 1.5rem;
}

/* Navigation links */
nav a {
    color: white;
    text-decoration: none;
    margin-left: 1rem;
}

nav a:hover {
    text-decoration: underline;
}

What do these styles do?

The body rule resets margins and sets a light grey background. The header block creates a blue bar with flexbox layout, pushing the title left and navigation links right.

The nav a rules style the navigation links as white text without underlines, adding an underline on hover.

  • Add the following content area and footer styles below the code you just pasted in style.css:
/* Main content card */
main {
    max-width: 800px;
    margin: 2rem auto;
    padding: 2rem;
    background-color: white;
    border-radius: 8px;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

/* Section headings */
h2 {
    color: #0078d4;
}

/* Footer */
footer {
    text-align: center;
    padding: 1rem;
    color: #666;
    font-size: 0.9rem;
}

What do these styles do?

The main rule centres the content in a white card with rounded corners and a subtle shadow. The h2 and footer rules apply Azure-blue headings and a centred, muted footer.

  • Save style.css.

✔️ Awesome, I've got everything!

Great. Make sure you have saved style.css inside C:\mywebsite.

ⓧ I'd like to double check the full code

Scroll up and confirm you have both chunks pasted into style.css in order: the layout and header styles first, then the content area and footer styles below. The combined file should have rules for body, header, header h1, nav a, nav a:hover, main, h2, and footer.

Now update your homepage to link the stylesheet and add navigation.

  • Open index.html in your text editor.
  • Replace the entire contents of the file with the following code:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Azure Website</title>
    <!-- Link the stylesheet -->
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header>
        <h1>My Azure Website</h1>
        <!-- Navigation bar -->
        <nav>
            <a href="index.html">Home</a>
            <a href="about.html">About</a>
        </nav>
    </header>
    <main>
        <h2>Welcome!</h2>
        <p>This website is hosted on Azure Blob Storage using static website hosting.</p>
        <p>It demonstrates core Azure Storage concepts for the AZ-900 exam.</p>
    </main>
    <footer>
        <p>Hosted on Azure Blob Storage</p>
    </footer>
</body>
</html>

What changed in this file?

Two things changed compared to the original index.html. First, a <link rel="stylesheet" href="style.css"> tag in the <head> pulls in your new stylesheet.

Second, a <nav> element inside the <header> adds Home and About links so visitors can navigate between pages.

  • Save index.html.
  • Double-click index.html in C:\mywebsite to open it in your browser.

You should see a blue header bar with your site title on the left and Home and About links on the right. The page content sits in a white card with a subtle shadow.

Page looks the same as before?

  • Make sure style.css is saved in the same folder as index.html (C:\mywebsite). The stylesheet link is a relative path, so both files must be side by side.
  • Check that the <link> tag in index.html says href="style.css" with no typos.
  • Try a hard refresh in your browser with Ctrl+F5 to clear any cached version.

Still stuck? Why isn't my CSS showing up when I open index.html locally?

Now create the About page.

  • Create a new file in your text editor and save it as about.html inside C:\mywebsite.
  • Paste the following code into about.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>About - My Azure Website</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header>
        <h1>My Azure Website</h1>
        <nav>
            <a href="index.html">Home</a>
            <a href="about.html">About</a>
        </nav>
    </header>
    <main>
        <h2>About This Project</h2>
        <p>This website was built as an AZ-900 lab to explore Azure Storage concepts:</p>
        <ul>
            <li>Static website hosting with Blob Storage</li>
            <li>Storage account types and configuration</li>
            <li>Access tiers: Hot, Cool, Cold, and Archive</li>
            <li>Redundancy options: LRS, ZRS, GRS, and more</li>
            <li>Data movement with AzCopy</li>
        </ul>
    </main>
    <footer>
        <p>Hosted on Azure Blob Storage</p>
    </footer>
</body>
</html>

What does this page do?

The About page lists the Azure Storage concepts you are covering in this project. It uses the same header, nav, and footer structure as index.html, so visitors get a consistent look across pages.

  • Save about.html.
  • Open error.html in your text editor and replace its entire contents with the following code:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Page Not Found</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header>
        <h1>My Azure Website</h1>
        <nav>
            <a href="index.html">Home</a>
            <a href="about.html">About</a>
        </nav>
    </header>
    <main>
        <h2>404 - Page Not Found</h2>
        <p>The page you are looking for does not exist.</p>
        <a href="index.html">Go back to the homepage</a>
    </main>
    <footer>
        <p>Hosted on Azure Blob Storage</p>
    </footer>
</body>
</html>

What changed in this file?

Just like index.html, the updated error.html now links style.css and includes the same <nav> bar. Visitors who hit a missing page still see a styled, navigable error message.

  • Save error.html.
  • Confirm all four files exist by opening PowerShell and running:
dir C:\mywebsite

You should see about.html, error.html, index.html, and style.css listed in the output.

Generate a SAS token

AzCopy needs permission to write to your storage account. A Shared Access Signature (SAS) token grants temporary, scoped access without sharing your account key.

  • Switch back to the Azure Portal in your browser.
  • Navigate to your storage account.
  • In the left menu under Security + networking, click Shared access signature.
  • Under Allowed services, check only Blob.
  • Under Allowed resource types, check Container and Object.
  • Under Allowed permissions, check Read, Write, Create, and List.
  • Set the End date/time to approximately 1 hour from now.
  • Leave all other settings at their defaults.
  • Click Generate SAS and connection string.

A set of tokens and connection strings appears below the button.

  • Find the field labelled SAS token and click the copy icon next to it. The token starts with sv=.
  • Paste the token somewhere safe (a text file or notepad) for the next substep.

What is a SAS token?

A SAS token is a query string appended to a storage URL that grants temporary, limited access. It encodes which services, resource types, and permissions are allowed, plus a start and expiry time.

Because the token expires, you do not need to share your storage account key. SAS tokens are a core AZ-900 exam topic under data security.

SAS tokens and the question mark delimiter

The SAS token from the Azure Portal does not include the leading ? delimiter. When you build the AzCopy URL in the next substep, you will add ? between the container path and the token yourself.

Upload files with AzCopy

With all four files ready and a SAS token in hand, you can deploy everything to Azure in a single command.

  • Open PowerShell and navigate to the folder where you extracted AzCopy (for example, C:\azcopy).
  • Upload all files from C:\mywebsite to the $web container by running this command:
.\azcopy copy 'C:\mywebsite\*' 'https://[[STORAGE_ACCOUNT="your storage account name"]].blob.core.windows.net/$web?your-sas-token-here' --recursive
  • Replace your storage account name with the name of your storage account (visible in the Azure Portal header).
  • Replace your-sas-token-here with the SAS token you copied. The token starts with sv=, so the URL will look like ...$web?sv=2022-11-02&ss=b&....

What does this command do?

  • .\azcopy copy invokes the AzCopy data movement tool.
  • The first argument (C:\mywebsite\*) is the source. The wildcard * selects all files in the folder.
  • The second argument is the destination URL: your storage account's blob endpoint, the $web container, and the SAS token for authorization.
  • Single quotes prevent PowerShell from interpreting $web as a variable. If you are using Command Prompt (cmd.exe) instead, use double quotes.
  • The --recursive flag ensures all files and subdirectories are included.

AzCopy prints a summary showing the number of files transferred. You should see all four files listed as completed.

Before you check the live site, what do you think will happen when you visit the About page? Will it be styled?

  • Open your browser and visit your primary endpoint URL. Add /about.html to the end of the URL.

You should see a styled About page with a blue header, navigation links, and a bullet list of Azure Storage concepts. Click the Home link in the nav bar to confirm the homepage is also styled.

Page shows the old unstyled version?

  • Check the AzCopy output in PowerShell. If it shows 0 files transferred, your SAS token may have expired or the permissions were incorrect. Generate a new SAS token and try again.
  • If AzCopy succeeded but the page looks unstyled, try a hard refresh with Ctrl+F5 to clear your browser cache.
  • Make sure the destination URL in your AzCopy command points to $web (the static website container), not a different container.

Still seeing issues? Help me troubleshoot my AzCopy upload to Azure Blob Storage.

Your website is live with styling, navigation, and multiple pages, all deployed in a single AzCopy command. Next up, you will explore access tiers to understand how Azure charges for storing and retrieving your blobs.

Explore Access Tiers

Your multi-page website is live and styled. In the previous step, you deployed all four files to Azure Blob Storage using AzCopy. Right now, every blob in your storage account sits in the Hot access tier, which means Azure keeps the data ready for instant retrieval.

Hot is great for frequently accessed data, but it comes with the highest storage cost. The AZ-900 exam tests your understanding of all four access tiers and when to use each one. In this step, you will create a test blob and walk it through the tiers to see the trade-offs first-hand.

In this step, get ready to:
  • Create a new container and upload a test blob.
  • Change the blob's access tier from Hot to Cool to Archive.
  • Discover what happens when you try to access an archived blob.
Create a container and upload a test blob

The $web container holds your website files, so you do not want to experiment with tiers there. A separate container gives you a safe sandbox.

  • In the Azure Portal, return to your storage account.
  • In the left menu under Data storage, click Containers.
  • Click + Container at the top.
  • Enter documents for the container name.
  • Click Create.

You should see the documents container appear in the list alongside $web.

  • Click the documents container to open it.
  • Click Upload at the top.
  • Select any small file from your computer (a text file, an image, anything under 1 MB).
  • Click Upload.

The file appears in the container's blob list.

  • Click the blob name to open its properties.
  • Look at the Access tier field in the blob's properties.

The access tier shows Hot. This is the default because your storage account was created with Hot as the default access tier.

What is an access tier?

Azure offers four access tiers for block blobs. Each tier balances storage cost against access cost.

Hot tier keeps your data ready for instant access but charges the most for storage. The other tiers reduce storage cost by making the data slower or harder to reach.

Don't see the documents container?

Make sure you clicked Create after entering the container name. If the container still does not appear, refresh the page and check the Containers list again.

Why isn't my documents container showing up in the Azure Portal?

Change the blob's access tier

Now you will walk this blob through two tier changes so you can see how Azure handles each one.

  • Return to the blob list by clicking documents in the breadcrumb at the top of the page.
  • Select your blob by clicking the checkbox next to its name.
  • Click Change tier in the toolbar at the top.
  • In the dropdown, select Cool.
  • Click Save.
  • Click the blob name again to view its properties.

The Access tier now shows Cool. The blob is still online and accessible, but Azure now charges less to store it and more to access it.

What does Cool tier mean?

Cool tier is designed for data you access infrequently. It has a lower storage cost than Hot but a higher access cost.

Azure enforces a 30-day minimum retention period. If you delete or move the blob before 30 days, you may incur an early deletion charge.

Now change the blob to Archive tier.

  • Return to the blob list by clicking documents in the breadcrumb.
  • Select your blob again by clicking the checkbox.
  • Click Change tier.
  • Select Archive from the dropdown.

Read the warning that appears before saving. Archive tier takes the blob completely offline. It requires rehydration (which can take hours) before you can read or download it.

  • Click Save.
Try to download the archived blob

Your blob is now in the Archive tier. Before you try the next action, think about this: what do you expect to happen if you try to download the blob right now?

  • Click the blob name to view its properties.
  • Click Download at the top of the page.

The download fails. The blob is offline because it is in the Archive tier. Azure will not serve data from an archived blob until it has been rehydrated back to an online tier, which takes hours.

Why can't I download an archived blob?

A blob in the Archive tier is completely offline. It cannot be read or modified until it is rehydrated to Hot or Cool. Rehydration can take up to 15 hours depending on the priority you set.

This is the key trade-off: Archive has the lowest storage cost of any tier, but the blob is completely inaccessible until you rehydrate it. It is meant for data you rarely need to touch.

Now verify the blob's properties to confirm the Archive tier is applied.

  • Look at the blob's properties. The Access tier shows Archive.

Access tier comparison

Here is a summary of all four access tiers tested on the AZ-900 exam:

  • Hot - Frequent access. Highest storage cost, lowest access cost. 99.9% availability.
  • Cool - Infrequent access. 30-day minimum retention. 99% availability.
  • Cold - Rare access. 90-day minimum retention. 99% availability.
  • Archive - Rarely accessed. 180-day minimum retention. Offline. Takes hours to rehydrate. Lowest storage cost, highest access cost.

Access tiers apply only to block blobs. They are not supported for append blobs or page blobs.

Archive tier and redundancy

Archive tier is only supported with LRS, GRS, and RA-GRS redundancy. It is not supported for ZRS, GZRS, or RA-GZRS accounts. Keep this in mind for the AZ-900 exam.

Blob still showing Cool tier?

Make sure you clicked Save after selecting Archive in the Change tier dialog. If the tier still shows Cool, refresh the page and check the properties again.

Why is my blob still showing Cool tier after I changed it to Archive?

You have seen the full spectrum of access tiers first-hand. Next up, you will explore how Azure replicates your data to protect it from outages by changing the storage account's redundancy settings.

Change Redundancy Settings

In the last step, you discovered that Archive blobs are completely offline and need hours of rehydration before you can access them. Now you will tackle the other major cost lever in Azure Storage: redundancy.

Right now your storage account uses LRS, which keeps three copies of your data in a single datacenter. If that datacenter suffers a serious outage, all three copies could be lost.

In this step, get ready to:
  • Review the current LRS redundancy setting and its durability guarantee.
  • Upgrade the storage account redundancy from LRS to GRS.
  • Explore the full redundancy spectrum tested on the AZ-900 exam.
Review the current LRS redundancy setting

Your storage account was created with Locally-redundant storage (LRS), the lowest cost redundancy option. Let's confirm this in the portal and understand what it means for your data.

  • Return to your storage account in the Azure Portal.
  • In the left menu under Data management, click Redundancy.

The Redundancy dropdown shows Locally-redundant storage (LRS).

What is LRS?

LRS replicates your data three times within a single datacenter in your primary region. It provides at least 99.999999999% (11 nines) durability over a given year.

LRS protects against drive, server, and rack failures inside that one datacenter. However, if a disaster like a fire or flood hits the entire datacenter, all three copies could be lost or unrecoverable.

Upgrade redundancy to GRS

GRS solves the single-datacenter risk by replicating your data to a secondary region hundreds of miles away. Let's upgrade your storage account now.

  • Click the Redundancy dropdown.
  • Select Geo-redundant storage (GRS).

Before you save, what new information do you expect to appear on this page once Azure applies GRS?

  • Click Save at the top of the page.

The page now shows GRS selected. A secondary region field appears below, showing the Azure region where your data is being replicated to.

What is GRS?

GRS copies your data synchronously within the primary region using LRS, then copies it asynchronously to a secondary region hundreds of miles away. This provides at least 99.99999999999999% (16 nines) durability over a given year.

If the primary region suffers a catastrophic outage, your data survives in the secondary. However, the secondary data is not available for read or write access unless a failover occurs.

Don't see the GRS option in the dropdown?

Make sure your storage account was created as a Standard general-purpose v2 (StorageV2) account. GRS is only available for certain account types.

If you enabled large file shares when creating the account, the option to switch to a geo-redundant SKU is blocked. Help me troubleshoot why GRS is unavailable for my storage account.

Review the full redundancy spectrum

Azure offers six redundancy options for Standard general-purpose v2 storage accounts. The AZ-900 exam expects you to know when to use each one and the trade-offs they involve.

  • On the Redundancy page, click the dropdown to see all of the available options listed.

Here is what each option provides:

  • LRS (Locally-redundant storage): Three copies in one datacenter. Lowest cost. 11 nines durability (99.999999999%).
  • ZRS (Zone-redundant storage): Three copies across three availability zones in one region. 12 nines durability (99.9999999999%).
  • GRS (Geo-redundant storage): Copies in the primary region (LRS) plus copies in a secondary region. 16 nines durability (99.99999999999999%).
  • RA-GRS (Read-access geo-redundant storage): Same as GRS, but adds read access to the secondary region without requiring a failover.
  • GZRS (Geo-zone-redundant storage): Zone redundancy in the primary region (ZRS) plus replication to a secondary region. 16 nines durability.
  • RA-GZRS (Read-access geo-zone-redundant storage): Same as GZRS, but adds read access to the secondary region.

What about Archive tier and redundancy?

The Archive tier is only supported with LRS, GRS, and RA-GRS accounts. It is not supported with ZRS, GZRS, or RA-GZRS.

This is an important connection to the access tiers you explored in the previous step. If you need both zone redundancy and Archive storage, you would need to use separate storage accounts.

  • Leave the dropdown set to Geo-redundant storage (GRS) and confirm the secondary region is still displayed below.

Why LRS to GRS and not something higher?

LRS to GRS is a direct change you can make in the portal with no downtime. Switching to ZRS, GZRS, or RA-GZRS requires a conversion process that can take much longer.

GRS gives you the biggest durability jump (11 nines to 16 nines) for a simple dropdown change. For a small lab like this, the cost difference is negligible.

Secret mission

Automate Tier Management with Lifecycle Policies

In the previous steps you manually changed blob tiers one at a time. Lifecycle management policies let you define rules that automatically move blobs between tiers based on age. In this mission, you will create a policy that transitions blobs in the documents container to Cool tier after 30 days and Archive tier after 90 days.

Clean Up Your Resources

Clean Up Your Resources

Decide whether to keep your resources running, pause them to come back later, or delete them entirely. This project created an Azure Storage account that costs fractions of a cent per month for the small amount of data stored, covered by your Azure free credits.

Cost warning

Your storage account is currently set to GRS redundancy, which roughly doubles the storage cost compared to LRS. For this project's tiny data volume, that still means well under $1 per month.

If you plan to keep the account, switch redundancy back to LRS to minimize ongoing charges. If you are done with the project, delete the resource group to drop costs to $0 immediately.

Resources you used:

  • Azure Resource Group containing your storage account.
  • Azure Storage Account (Standard GPv2) with GRS redundancy, hosting your static website in the $web container and the documents container.
  • Local mywebsite folder with your HTML and CSS project files.
  • AzCopy extracted folder (e.g. C:\azcopy).

Keep everything running

No action needed. Choose this if you are still actively building on your Azure Storage project or want to keep your static website live.

  • Your static website stays live at the primary endpoint URL you bookmarked earlier.
  • Storage costs for this data volume are well under $1 per month and are covered by your Azure free credits.
  • GRS redundancy costs roughly double what LRS costs. To minimize charges, navigate to your storage account, select Data management > Redundancy, change the dropdown to LRS, and click Save.
  • AzCopy and the local mywebsite folder remain on your machine. They use negligible disk space.

Pause - I'll come back to this later

Azure Storage accounts cannot be paused or suspended. They exist until you delete them. You can reduce costs while keeping the account ready for your return.

  • Switch redundancy from GRS back to LRS to cut storage costs. In the Azure Portal, open your storage account, select Data management > Redundancy, change the dropdown to LRS, and click Save.
  • Your static website and all blobs remain accessible whenever you return.
  • The SAS token you generated earlier had a short expiry window and has already expired. No action needed for it.
  • AzCopy and the local mywebsite folder can stay on your machine until you are ready to continue.

Delete - I don't want to use this again

Remove all project resources and start fresh. This deletes your storage account, static website, all containers, blobs, and the lifecycle management policy. Costs drop to $0 immediately.

  • In the Azure Portal, type Resource groups in the top search bar and select it.
  • Click the resource group you created for this project to open it.
  • Click Delete resource group at the top of the page.
  • Type the resource group name to confirm, then click Delete. This removes the storage account and everything inside it.

Next, delete the local project files. Open PowerShell and run this command to remove the mywebsite folder:

Remove-Item -Recurse -Force C:\mywebsite
  • Delete the AzCopy folder by running:
Remove-Item -Recurse -Force C:\azcopy

Used a different folder path?

If you extracted AzCopy or created your website files in a different location, replace C:\azcopy and C:\mywebsite with the actual paths you used.

Nice Work!

Nice Work!

Nice work! You just built a live static website on Azure Blob Storage and explored every Azure Storage concept tested on the AZ-900 exam.

You've learned how to:

  • Created a Standard general-purpose v2 storage account, enabled static website hosting, and deployed a multi-page website accessible via a public URL.
  • Used AzCopy v10 to batch-upload files to Blob Storage with a SAS token, practicing the data movement tool tested on the AZ-900 exam.
  • Explored access tiers (Hot, Cool, Archive) and changed storage account redundancy from LRS to GRS, understanding the durability spectrum from 11 nines to 16 nines across all six redundancy options.
  • Secret Mission: Created a lifecycle management policy to automatically transition blobs between access tiers based on age.

Ready to quiz yourself?