Skip to main content

Reusable Component to Create Globally-distributed Applications with Azure Cosmos DB

Reusable Component to Create Globally-distributed Applications with Azure Cosmos DB

This example lives in the pulumi/examples repository. Check out just this directory to use it:

Get started with this example
git clone --filter=blob:none --sparse https://github.com/pulumi/examples pulumi-examples
git -C pulumi-examples sparse-checkout set classic-azure-ts-cosmosapp-component
cd pulumi-examples/classic-azure-ts-cosmosapp-component

This example demonstrates the usage of Pulumi to create globally-distributed applications with Azure Cosmos DB as the backend and pluggable infrastrustructure as the web tier.

The application shows several notable features:

  1. Easy global deployments - a config setting provides a list of all the regions to deploy and a single execution deploys across them all.
  2. Abstraction - the CosmosApp component - abstracts away all the common logic for a global app with Cosmos DB multi-region data distribution and Traffic Manager for routing the traffic.
  3. Multi-model - examples are provided for serverless functions, containers, and virtual machines, all fitting to the above abstraction.

CosmosApp component#

The CosmosApp defines a skeleton for the application. While not limiting the type of compute resources, it creates the multi-regional pieces of the infrastructure:

Cosmos App

The application has three example of using this component with the following compute services:

  • Azure Functions
  • Azure Container Instances
  • Azure VM Scale Sets + Azure Load Balancer

Prerequisites#

  1. Install Pulumi
  2. Configure Azure credentials

Steps#

Step 1: Create a new stack#

Terminal window
pulumi stack init dev

Step 2: Log in to the Azure CLI#

You will be prompted to do this during deployment if you forget this step.

Terminal window
az login

Step 3: Install NPM dependencies#

Terminal window
npm install

Step 4: Configure target Azure environment#

Terminal window
pulumi config set azure:location <location>
pulumi config set azure:subscriptionId <YOUR_SUBSCRIPTION_ID>

Step 5: Deploy your changes#

Run pulumi up to preview and deploy changes:

Terminal window
pulumi up
Previewing changes:
+ azure-ts-cosmosapp-component-dev create
+ examples:azure:CosmosApp vms create
+ azure:network:VirtualNetwork vnet-westeurope create
+ azure:network:PublicIp pip-westeurope create
+ azure:trafficmanager:Profile tmvms create
+ azure:trafficmanager:Endpoint tmvmswesteurope create
+ azure:cosmosdb:Account cosmos-vms
...

Step 6: Check the deployed website endpoints#

Three endpoints are now available. For example,

Terminal window
pulumi stack output functionsEndpoint
http://functionscosmosfunc-rgcc15ea50.trafficmanager.net/api/cosmos
curl "$(pulumi stack output functionsEndpoint)"
Document 'cosmos' not found

Go to the Azure portal and add a document with the ID “cosmos” to receive a non-empty response.

Running Unit Tests#

The unittests.ts file contains two sample unit tests that can be run with Mocha:

Terminal window
mocha -r ts-node/register unittests.ts

Running Policy Pack#

The policy folder contains two sample policies that can be applied with the policy-pack argument:

Terminal window
pulumi up --policy-pack policy

Related

The infrastructure as code platform for any cloud.