Skip to content
CAMPUX Cloud Bootcamp Labs · Start Here ← All labs
Start Here · Do this once
~15 min setup + 10 min warm-up
each lab adds its own tools and cost
Before Your First Lab

Set up your machine once.

Free Azure account, the Azure CLI, az login, and ten minutes at the prompt so the commands in Class 7 read as sentences instead of noise. That covers the first labs. Later ones need more (Git, Docker, Python, a cluster), and a few cost real money while they run, so each lab says what it adds before its first command. No terminal? Jump to Cloud Shell at the end.

Start

Run one step, then check it

Read the step before copying. Bash commands belong in Git Bash on Windows or Azure Cloud Shell set to Bash; PowerShell uses different syntax. A JSON, YAML, Bicep or application-code example belongs in the named file, not directly at the terminal prompt. Follow any shell-specific instructions below.

Keep the same terminal open so earlier variables remain available. Copy one complete command block without the terminal's $ prompt. A backslash continues a command onto the next line. If Bash shows a lone >, it is waiting for the rest of a quote, command or file block. Finish the complete block; if the paste was incomplete, press Ctrl+C and copy it again. Do not paste the next step into an unfinished command.

A line such as RG="training-group" stores a value without printing it. Output captured with $(...) is also stored; a blank screen alone does not prove failure. A sleep deliberately waits, and -o none suppresses normal output. Wait for your normal prompt, then run the step's checkpoint. After an error, stop and keep the exact command and message; later steps cannot repair a missing resource. Never share passwords, access tokens or secret values in a screenshot.

01

Get a free Azure account

The labs build real resources in a real subscription. Signing up gives you three things: a $200 credit that lasts your first 30 days, 12 months of extra free quota on 20+ popular services (new customers only), and 65+ services that stay free forever. Most labs cost nothing or a few cents and tear down what they built. A handful do not: the AKS clusters, the full app deploy and the disaster-recovery labs bill by the hour while they run. What each lab costs lists them, and each lab's header says the same before you start.

→ Sign up: azure.microsoft.com/free — you end up with a subscription (the billing container everything lives in). It asks for a credit or debit card to verify your identity; Azure does not charge it unless you move to pay-as-you-go. After the 30 days a free account has to make that move before it can create paid resources, and from then on the card pays for whatever you leave running.

required for every labuse a personal sub, not your employer'scard charged only after you upgrade
02

Open a terminal — a Bash one

Every lab is written in Bash — the commands use Bash variables, loops, and <<EOF here-docs. Run them in a Bash shell so they work exactly as written:

macOS / Linux   your Terminal is already Bash-compatible — nothing to do.
Windows         install Git (it bundles "Git Bash"), then use Git Bash — not PowerShell:
                  winget install --exact --id Git.Git
              then open Git Bash from the Start menu and work there.

The winget installs below can run from PowerShell, but run the actual lab commands in Git Bash. No Git? WSL or Azure Cloud Shell (bottom of page) are Bash too.

why PowerShell cannot read Bash syntax — NAME="x", $RANDOM, and cat > file <<EOF all fail there. Git Bash, WSL, and Cloud Shell run every lab unchanged.

One Git Bash quirk, already handled: Git Bash rewrites any argument starting with / into a Windows path, which breaks Azure resource IDs (a --scope /subscriptions/… then fails with MissingSubscription). Two more Git Bash gaps: it has no zip (labs that zip an app show a PowerShell Compress-Archive line beside it) and no /proc (the one lab that reads a random ID from there shows a fallback). Every lab defuses the path problem with export MSYS_NO_PATHCONV=1 as its first line — leave that line in place and it just works. (On macOS/Linux that line does nothing, so it is safe everywhere.)

02b

Ten minutes at the prompt

Every lab after this is a stack of Bash commands. Before Class 7 asks you to run one against Azure, run a few that cannot break anything. Use the Bash window from step 02 (or Cloud Shell set to Bash). Before each block, read the comment and guess what will appear. Then run it and compare.

1 · Which shell am I in?
echo "$0"                     # expect bash, -bash or /usr/bin/bash

If it says powershell or pwsh, you are in the wrong window. Go back to step 02.

2 · Store a value, then print it
NAME="Ada"                    # guess: what does this line print?
echo "Hello, $NAME"           # Hello, Ada

The first line prints nothing. Storing a value is quiet; only echo shows it. The labs do this all the time (RG="training-group"), and a blank line after it is success, not a hang. Now change Ada to your own name, guess the output, and run both lines again.

3 · A command that succeeds silently
mkdir -p practice             # makes a folder; prints nothing when it works
echo $?                       # 0 means the last command succeeded
ls -d practice                # practice

Many Azure commands in the labs end with -o none, which does the same thing on purpose: no output unless something fails. The checkpoint line after it is how you see the result.

4 · Write a file from a block
cat > practice/note.txt <<'EOF'
first line
second line
EOF
cat practice/note.txt         # first line, then second line

cat > practice/note.txt <<'EOF' means: put everything that follows into that file, until a line that says only EOF. Labs use this to write JSON, Bicep and Python files. If Bash shows a lone > and waits, it has not seen the closing EOF yet. Paste the rest of the block, or press Ctrl+C and paste the whole block again.

5 · One long command across two lines
echo one \
  two                         # one two

A backslash at the very end of a line means the command carries on to the next. Long az commands are written this way so each option sits on its own line.

6 · A small reusable function
greet() {
  echo "Hello, $1"
}
greet Ada                     # Hello, Ada
greet Ben                     # guess first

The first three lines define greet and print nothing. $1 is the first word after the function's name. Labs C and D wrap each step in a function like this: one paste defines the step, the next line runs it, and if it fails you run that one line again instead of re-pasting twenty commands.

On your own: write a function called show_rg that prints Resource group: followed by its first argument, then call it with training-group.

Compare with one answer
show_rg() {
  echo "Resource group: $1"
}
show_rg training-group        # Resource group: training-group

Different spacing is fine. If it printed only Resource group:, the call had no word after the name, so $1 was empty.

rm -r practice                # clean up the practice folder

ready when you can say which shell you are in, store and print a value, write and read a file with a block, and explain why mkdir printed nothing. That is everything Classes 7 to 16 assume about the terminal. Class 25 comes back for loops, error handling and safe automation.

03

Install the Azure CLI

The az command every lab uses. One line for your OS.

Windows · winget
winget install --exact --id Microsoft.AzureCLI
macOS · Homebrew
brew update && brew install azure-cli
Linux · Debian / Ubuntu
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

verify az version -> prints 2.x. Not found? Reopen the terminal so az is on PATH. No winget? MSI at aka.ms/installazurecliwindows.

04

Sign in

Opens a browser, then hands control back to the terminal. Set the subscription if you have more than one.

az login
az account show --query name -o tsv                    # which sub am I in?
az account set --subscription "<id-or-name>"            # switch if needed

verify az account show -> prints your subscription as JSON. Signed in.

05

Install Terraform — IaC labs only

Skip until a lab asks for it. The Bicep and CLI labs do not need it.

Windows · winget
winget install --exact --id Hashicorp.Terraform
macOS · Homebrew
brew tap hashicorp/tap && brew install hashicorp/tap/terraform
Linux · Debian / Ubuntu
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

verify terraform -version -> Terraform v1.x. Python (AI labs) is preinstalled on macOS/Linux; on Windows: winget install --exact --id Python.Python.3.12.

06

Make a workspace you will remember

Before you clone anything: make one folder for all the labs, somewhere you will find again — your home directory or Documents. Note the path. Every lab clones or builds here, so you always know where your work is.

cd ~                          # home (Windows: cd $HOME) — or wherever you'll remember
mkdir azure-labs              # any name you'll recognise later
cd azure-labs
pwd                           # <- note this path. this is home base.

verify pwd prints your folder's full path. Remember it — you will cd back here at the start of every lab, then run its git clone.

Later

Extra tools some labs ask for

Nothing here is needed for Classes 7 to 16. Install a tool when the class or lab that needs it says so, and run its check before the lab's first step. Cloud Shell already has Git, Bicep, Terraform, kubectl, Helm and a Python 3 (run the version check, since some steps want 3.11 or later).

ToolFirst neededInstall (Windows · macOS)Check
GitClass 17, and any lab that starts with git clonestep 02 · brew install gitgit --version
BicepClass 20az bicep install (both)az bicep version
TerraformClass 21step 05terraform -version
DockerClass 26, and building images on your own machinewinget install --exact --id Docker.DockerDesktop · brew install --cask dockerdocker run --rm hello-world
kubectlClass 27 Part Aaz aks install-cli (both)kubectl version --client
HelmClass 27 Part Gwinget install --exact --id Helm.Helm · brew install helmhelm version
Python 3.11 or laterThe AI labs (Classes 33 and 34) and Class 41step 05 · brew install pythonpython3 --version
Node.js LTSInstalling the two tools belowwinget install --exact --id OpenJS.NodeJS.LTS · brew install nodenode --version
Functions Core Tools 4Class 41winget install --exact --id Microsoft.Azure.FunctionsCoreTools (asks for admin) · brew tap azure/functions && brew install azure-functions-core-tools@4. Avoid the npm package on Node 24 or later: newer npm blocks its install script and func fails on first run.func --version prints 4.x
AzuriteClass 41 (a local stand-in for Azure Storage)npm install -g azuriteazurite --version

Cloud Shell cannot run a Docker daemon. Labs that build an image there use az acr build, which builds in Azure instead.

Money

What each lab costs

The cost line at the top of each lab is the one to trust; this is the summary. Every figure assumes you run the cleanup step in the same sitting. In your first 30 days the $200 credit covers all of it.

CostLabs
Nothing deployedApp Service Environment (compile only), API catalogue (desk track), first GitHub Actions pipeline
Free tier or a few centshub and spoke, first Bicep storage, resource locks, cost guardrails, Lab A, Lab B, Lab C, Lab D, plan and slot swap, VM patch and schedule, backup and restore, Terraform landing zone, observability and KQL, Container Apps, Actions OIDC, MCP server, RAG with AI Search (model calls are billed per token)
Billed by the hour while it runsThe AKS labs (first cluster, Helm, least privilege, storage, limits and autoscaling, ingress and policy): the control plane is free, the nodes and disks are not. Campux Retail deploy: a few dollars if left running, cents if you clean up straight away.
Several dollars, several hoursGitOps with Argo CD (about $4–8), AKS disaster recovery (about $10–20, two clusters), zero-trust AKS

If Azure refuses a region or a size. Two errors are about capacity, not about you: "The selected region is currently not accepting new customers" (change the lab's region variable, for example to eastus) and SkuNotAvailable for a VM size (list what you can use with az vm list-skus -l eastus --resource-type virtualMachines --query "[?restrictions[0]==null].name" -o tsv). We hit both while testing the labs in October 2026.

A few lesson pages also offer an optional paid exercise outside these labs: Front Door in Class 13 Part B, a model deployment in Class 34, a real API Management instance in Class 38. Each says so beside the step, and each has a desk path that costs nothing.

Some labs need more than Contributor Several labs — RBAC and managed identity, security groups, resource locks, Container Apps, GitHub Actions OIDC, the Azure DevOps service connection, and the Campux Retail deploy — run az role assignment create, which needs Owner or User Access Administrator on the subscription; a plain Contributor gets AuthorizationFailed. A few of those same labs also run az ad app create to register an Entra application, which needs permission to register apps in the directory. On your own free subscription you have both by default. On a work or school subscription you likely do not — check the lab's own prerequisites, or use a personal account instead.
No installs? Use Azure Cloud Shell Local is cleaner and mirrors the job — but shell.azure.com (choose Bash) is a browser terminal with az, terraform, python, and git preinstalled and already signed in; no az login needed. The first time you open it, it asks about storage: pick No storage account required for a throwaway session (nothing survives once you close the tab — fine for a single lab), or let it create a small storage account so your $HOME persists between sessions (a few cents a month, on top of the always-free list). Either path reads the same.