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:
git clone --filter=blob:none --sparse https://github.com/pulumi/examples pulumi-examplesgit -C pulumi-examples sparse-checkout set classic-azure-ts-cosmosapp-componentcd pulumi-examples/classic-azure-ts-cosmosapp-componentThis example demonstrates the usage of Pulumi to create globally-distributed applications with Azure Cosmos DB as the backend and pluggable infrastructure as the web tier.
The application shows several notable features:
- Easy global deployments - a config setting provides a list of all the regions to deploy and a single execution deploys across them all.
- Abstraction - the
CosmosAppcomponent - abstracts away all the common logic for a global app with Cosmos DB multi-region data distribution and Traffic Manager for routing the traffic. - Multi-model - examples are provided for serverless functions, containers, and virtual machines, all fitting to the above abstraction.
The 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:

The application has three examples of using this component with the following compute services:
- Azure Functions
- Azure Container Instances
- Azure VM Scale Sets + Azure Load Balancer
Prerequisites#
Deploying the example#
-
Create a new stack:
Terminal window pulumi stack init dev -
Log in to the Azure CLI (you will be prompted to do this during deployment if you forget this step):
Terminal window az login -
Configure the target Azure environment:
Terminal window pulumi config set azure:location <location>pulumi config set azure:subscriptionId <YOUR_SUBSCRIPTION_ID> -
Install dependencies:
Terminal window npm install -
Deploy the stack:
Terminal window pulumi upPreviewing 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... -
Check the deployed website endpoints. Three endpoints are now available. For example:
Terminal window pulumi stack output functionsEndpointcurl "$(pulumi stack output functionsEndpoint)"http://functionscosmosfunc-rgcc15ea50.trafficmanager.net/api/cosmosDocument 'cosmos' not foundGo 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:
mocha -r ts-node/register unittests.tsRunning the policy pack#
The policy folder contains two sample policies that can be applied with the policy-pack argument:
pulumi up --policy-pack policyCleaning up#
Once you are done, you can destroy all of the resources, and the stack:
pulumi destroypulumi stack rm