Want to start blogging? Lets create a simple WordPress site hosted on a WebApp along with a MySQL DB
With a few Azure CLI commands you will have the basics up and running, pretty cool – eh?
Secondly, the configuration is totally stateless as you will be configuring both an Azure WebApp and Azure Database for MySQL
To create a WebApp, you will need an active App Service plan. A service place defines a set of compute resources for for a WebApp to run on. They are prices in tiers:
- Shared Compute: Free & Shared – Used for developed or testing purposes, these are shared with other customers. These tiers allocate CPU quotas to each app that runs on the shared resources, and the resources cannot scale out. Also note, these tiers have any a certain amount of compute minutes per day (Free: 60 CPU mins Shared: 240 CPU mins and cannot scale out)
- Dedicated compute: The Basic, Standard, Premium, and PremiumV2 tiers run apps on dedicated Azure VMs
- Isolated Compute: Runs on dedicated Virtual Machines inside a dedicated Virtual Network
- Consumption: Only available for Azure Functions
Lets get started, create a Resource Group & Linux App Service Plan, will be hosted in North Europe and with use the Standard service plan S1:
$ResourceGroup = "tamops-wp-rg"
$Location = "northeurope"
$AppPlanName="tamops-wpplan"
az group create -l $Location -n $ResourceGroup
az appservice plan create -n $AppPlanName -g $ResourceGroup -l $Location --is-linux --sku S1
Now lets create the WebApp and use WordPress Docker container image
$AppName = "tamops-wp-app"
az webapp create -n $AppName -g $ResourceGroup --plan $PlanName -i "wordpress"
The Azure Database for MySQL will be a simple deployment, notice –ssl-enforcement is disabled due to WordPress doesn’t use SSL during initial setup – a separate plugin is required.
$MySqlServerName = "tamops-mysql"
$MySqlAdminUser = "tamopsadmin"
$MySqlAdminPassword = "PasswordEnterHere"
az mysql server create -l $Location -g $ResourceGroup -n $MySqlServerName -u $MySqlAdminUser -p $MySqlAdminPassword --sku-name B_Gen5_1 --ssl-enforcement Disabled
Now, lets create a firewall rule to allow Azure App Service acess to the newly created database.
az mysql server firewall-rule create -g $ResourceGroup --server $MySqlServerName --name AllowAppService --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0
You see the any:any ip addressing and wonder if I have made a mistake? Nope! Taken from Microsoft documentation
This option configures the firewall to allow all connections from Azure including connections from the subscriptions of other customers. When selecting this option, make sure your login and user permissions limit access to only authorized users.
Time to add some environment variables that is required by the WebApp for a successful configuration of a WordPress Setup
$Find_DBHostName = (az mysql server show -g $ResourceGroup -n $MySqlServerName --query "FullyQualifiedDomainName" -o tsv)
az webapp config appsettings set -n $AppName -g $ResourceGroup --settings WORDPRESS_DB_HOST=$Find_DBHostName WORDPRESS_DB_USER="$MySqlAdminUser@$MySqlServerName" WORDPRESS_DB_PASSWORD="$AdminPassword"
Good news – you have now configured a stateless WordPress site in a matter of minutes!
$DisplaySite = az webapp show -n $AppName -g $ResourceGroup --query "DefaultHostName" -o tsv
Start-Process https://$DisplaySite
Pretty cool eh? Follow the on screen setup for WordPress and you will finish with a main page like this:

Full script below, change the parameters and it can be ran as one complete script!
$ResourceGroup = "tamops-wp-rg"
$Location = "northeurope"
$AppPlanName="tamops-wpplan"
$AppName = "tamops-wp-app"
$MySqlServerName = "tamops-mysql"
$MySqlAdminUser = "tamopsadmin"
$MySqlAdminPassword = "PasswordEnterHere"
az group create -l $Location -n $ResourceGroup
az appservice plan create -n $AppPlanName -g $ResourceGroup -l $Location --is-linux --sku S1
az webapp create -n $AppName -g $ResourceGroup --plan $PlanName -i "wordpress"
az mysql server create -l $Location -g $ResourceGroup -n $MySqlServerName -u $MySqlAdminUser -p $MySqlAdminPassword --sku-name B_Gen5_1 --ssl-enforcement Disabled
az mysql server firewall-rule create -g $ResourceGroup --server $MySqlServerName --name AllowAppService --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0
$Find_DBHostName = (az mysql server show -g $ResourceGroup -n $MySqlServerName --query "FullyQualifiedDomainName" -o tsv)
az webapp config appsettings set -n $AppName -g $ResourceGroup --settings WORDPRESS_DB_HOST=$Find_DBHostName WORDPRESS_DB_USER="$MySqlAdminUser@$MySqlServerName" WORDPRESS_DB_PASSWORD="$AdminPassword"
$DisplaySite = az webapp show -n $AppName -g $ResourceGroup --query "DefaultHostName" -o tsv
Start-Process https://$DisplaySite
Running this stateless WordPress Application is not the cheapest option to host your personal blog but gives you an insight into the scalability Azure can provide.
In a future blog I will detail a cost effective personal blog that can be hosted in Azure
Thanks for the post. I learned a lot in implementing it. My first error was quite cryptic, but it ended up being an insufficient password. Would I ever love to get proper error messages one day. After finally fixing that the script ran without error, however I now get “Error establishing a database connection” when I go to the app page. Btw, the final step only spawns an empty browser window. I tried troubleshooting in Azure but could not figure out the issue. Any ideas?
Hi Sean,
can you give me a shout via Twitter PM? I can have a look.