This tutorial shows how to deploy the Python Bookshelf sample app using Cloud Deployment Manager.
Deployment Manager lets you create the necessary Google Cloud resources for a deployment in a single step, through a declarative, repeatable process. With Deployment Manager, you can update your deployments, track your modifications over time, create templates using Jinja or Python, and parameterize your templates, so that similar deployments share a template.
Objectives
- Clone and configure the Bookshelf sample app.
- Create Deployment Manager configurations and templates.
- Create Deployment Manager deployments.
- Deploy the Bookshelf sample app using Deployment Manager.
Costs
In this document, you use the following billable components of Google Cloud:
To generate a cost estimate based on your projected usage,
use the pricing calculator.
When you finish the tasks that are described in this document, you can avoid continued billing by deleting the resources that you created. For more information, see Clean up.
Before you begin
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Datastore API, Cloud Storage API, Pub/Sub API APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Datastore API, Cloud Storage API, Pub/Sub API APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Install Python,
pip
, andvirtualenv
on your system. For instructions, see Setting up a Python development environment for Google Cloud.
Creating a Cloud Storage bucket
The following instructions detail how to create a Cloud Storage bucket. Buckets are the basic containers that hold your data in Cloud Storage.
In your terminal window, create a Cloud Storage bucket, where YOUR_BUCKET_NAME represents the name of your bucket:
gcloud storage buckets create gs://YOUR_BUCKET_NAME
To view uploaded images in the Bookshelf app, set the bucket's Identity and Access Management policy to grant the
legacyObjectReader
role toallUsers
:gcloud storage buckets add-iam-policy-binding gs://YOUR_BUCKET_NAME --member=allUsers --role=roles/storage.legacyObjectReader
Cloning the sample app
The sample app is available on GitHub at
GoogleCloudPlatform/getting-started-python
.
Clone the repository:
git clone https://github.com/GoogleCloudPlatform/getting-started-python.git -b steps
Go to the sample directory:
cd getting-started-python/7-gce
Configuring the app
Open
config.py
for editing.Set the value of
PROJECT_ID
to your project ID.Set the value
CLOUD_STORAGE_BUCKET
to the name of your Cloud Storage bucket.
Save and close
config.py
.
Running the app on your local computer
Create an isolated Python environment, and install dependencies:
Linux/macOS
virtualenv -p python3 env source env/bin/activate pip install -r requirements.txt
Windows
virtualenv -p python3 env env\scripts\activate pip install -r requirements.txt
Run the application:
python main.py
In your browser, enter the following address:
To stop the local web server, press Control+C. If you want to exit
the virtual environment, enter deactivate
.
Deploying the sample app
Push your code to a repository
You can get your code onto a running Compute Engine instance in several ways. One way is to use Cloud Source Repositories. Every project includes a Git repository that is available to Compute Engine instances. Your instances then pull the latest version of your app's code during startup. Using a Git repository is convenient because updating your app doesn't require configuring new images or instances; just restart an existing instance or create one.
For your first time using Git, use
git config --global
to set up your identity.In your Google Cloud console, create a repository:
Then push your app code to your project's repository where
[YOUR_PROJECT_ID]
is your project ID and[YOUR_REPO]
is the name of your repository:git commit -am "Updating configuration" git config credential.helper gcloud.sh git remote add cloud https://source.developers.google.com/p/[YOUR_PROJECT_ID]/r/[YOUR_REPO] git push cloud master
Create the deployment
After your configuration is committed and your code is uploaded to Cloud Source Repositories, you can use the Deployment Manager to create the deployment:
Go to the
deployment_manager
directory:cd getting-started-python/7-gce/gce/deployment_manager
Create the deployment:
gcloud deployment-manager deployments create my-deployment --config config.yaml
View a list of all the deployments:
gcloud deployment-manager deployments list
Get a description of the deployment and the resources it created:
gcloud deployment-manager deployments describe my-deployment
View your app
After you create the forwarding rule, it can take several minutes for your configuration to propagate and for traffic to be routed to your instances.
To check the progress:
gcloud compute backend-services get-health bookshelf-my-deployment-frontend --global
When at least one of your instances reports
HEALTHY
, get the forwarding IP address for the load balancer:gcloud compute forwarding-rules list --global
Your forwarding-rules IP address is in the
IP_ADDRESS
column.In your browser, enter the IP address from the list.
Your app is now running on Google Cloud.
Understanding the code
Configure the deployment
You can see how the deployment is configured in config.yaml
:
The configuration file imports the template file as a resource and uses it to
define a resource named bookshelf
. The template takes several properties as
parameters. For more information about creating
Deployment Manager configuration files, see
Creating a configuration.
Configure the deployment template's schema
Look at the schema file bookshelf.jinja.schema
, which defines and
documents the parameters that the deployment is expected to provide in its
configuration file. For more information about configuration schemas, see
Using schemas.
Configure the deployment template
The template defines several resources needed to create an autoscaled, load- balanced, managed instance group. For a full description of the resources created, see the comments in the template and review the Bookshelf on Compute Engine tutorial.
Keep in mind that Deployment Manager provides a way to declaratively define resources, but most of the configuration for a given resource is defined by its API. For example, most of the configuration options for the instance template resource are found in the instance template resource definition in the reference documentation for the Compute Engine API.
The template is written using the Jinja templating language. When writing Deployment Manager templates, you can either use Jinja or Python. Jinja has the advantage of being more declarative, which can be more readable and easier to understand than Python. For some complex deployments, the full expressiveness of Python might make things simpler. In this case, Jinja is sufficient to create the necessary resources.
In a template, certain environment variables are automatically set, and you can
access these variables by using the env
dictionary. In this case, the name of
the deployment is referenced as a name to be reused when assigning names to the
resources that are created. For more information about available environment
variables, see
Using environment variables
in the Deployment Manager documentation:
The template uses the same startup script that is used in the Compute Engine tutorial. The script's content is inserted into the template, and the Jinja indent directive indents the content correctly:
In a Deployment Manager Jinja template, you can also refer to resources created elsewhere in the template. In the following example, the backend service uses the reference of the managed instance group to obtain the instance group it should point to:
Properties specified in config.yaml
can be used in the template:
Clean up
To avoid incurring charges to your Google Cloud account for the resources used in this tutorial, either delete the project that contains the resources, or keep the project and delete the individual resources.
Delete the project
The easiest way to eliminate billing is to delete the project that you created for the tutorial.
To delete the project:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Delete your deployment
To delete your deployment, enter the following command. This command deletes the load balancer and any Compute Engine instances that are associated with your deployment:
gcloud deployment-manager deployments delete my-deployment
What's next
Learn more about defining Deployment Manager templates.
Learn how to run the Python Bookshelf sample app on Google Kubernetes Engine.
Learn how to run the Python Bookshelf sample app in the App Engine flexible environment.
Explore reference architectures, diagrams, and best practices about Google Cloud. Take a look at our Cloud Architecture Center.
Explore other Google Cloud services.