First we create a web server. In the GCP Console's Products and Services menu, I scroll down to Compute Engine, and choose VM instances. I'll create an instance. I'll name the instance: bloghost. And I'll leave it in the offered zone us-central1-a. I'll take the other defaults. And I'll configure the firewall to allow HTTP traffic in. I also want to add a startup script. This startup script will install a web server. I click Create, and the Virtual Machine instance is created for me. Notice its external IP address. We'll need that later. Now I'm going to make a Cloud Storage bucket using Cloud Shell. I enter the command: gsutil mb -l then I name the location in which I want the bucket to reside. In this case, the US Multi-Region. The name of my Cloud Storage bucket must be globally unique, and the easiest way to make sure of this is to name the bucket after my GCP Project ID, which is also globally unique. In the Cloud Shell, the environment variable $DEVSHELL_PROJECT_ID always contains my project ID. Now I've created my bucket. I'm going to copy a graphical image from another Cloud Storage bucket, this one called: cloud-training. Now I have the graphical image here in my directory, my-excellent-blog.png. Now I use the gsutil cp command again to upload it to my own Cloud Storage bucket. I can see the resulting file, both from the command line using: gsutil ls... ...and also from the GCP Console's Storage Browser. There's my bucket, and there's the object I created in the bucket. Recall that my VM instance is in zone us-central1-a. Now we'll create a Cloud SQL instance in the same zone. In the Products and Services menu, we scroll down to SQL. We choose MySQL for our database engine, Second Generation. We name our instance "blog-db" and we define a root password. We'll place this instance in the same zone as our Compute instance. When the database instance has been made, we click on its name to configure it. With my database instance finished provisioning, I can click on its name to configure it. I want to create a MySQL username called: blogdbuser. I'll define a password. Now I want to configure this database instance so that it can be only contacted from my Virtual Machine instance. So I need to go back to its entry in the VM instance's listing and capture its public IP address. There it is. We'll copy it. We return to our SQL instance, click on our instance name, and click Authorization. We wish to authorize a network consisting only of the desired VM instance. We'll name the network: web front end and insert the IP address of that instance followed by /32. Now our database instance is protected from broad internet access. Now I'm going to return to my Virtual Machine and configure it to use the resources we've set up. I'll log into it using SSH. I'm going to edit its PHP homepage. I've prepared a page that I can paste in. I'll fill in my database's IP address and password. Notice the comment. In a real blog, we would never store the MySQL password anywhere in the document root. Instead, we would store it in a separate configuration file somewhere else in the web server Virtual Machine. Now let's try it. We'll restart the web server daemon. Now we'll return to the GCP Console's VM instances list and attempt to view the homepage. Our database connection succeeded. If this were a real blog, we would now begin to load blog content into our SQL database. Now let's enhance our homepage by adding our graphical image to it. In the GCP Console, we'll navigate to the Storage Browser and create a public link to our graphical image. There's the image. We check the box: Share publicly. That gives us a hyperlink that we can clone. Now we return to our PHP homepage and add in an HTML reference to that image. Now let's return to our PHP homepage and refresh it. Our page now contains an image hosted in Google Cloud Storage.