Skip to main content

Search the Dev Center

Search tutorials, templates, examples, and more.

Voting app using Redis and Flask

Voting app that uses containers

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 aws-py-voting-app
cd pulumi-examples/aws-py-voting-app

A simple voting app that uses Redis for a data store and a Python Flask app for the frontend. The example has been ported from https://github.com/Azure-Samples/azure-voting-app-redis.

The example shows how easy it is to deploy containers into production and to connect them to one another. Since the example defines a custom container, Pulumi does the following:

  • Builds the Docker image
  • Provisions AWS Container Registry (ECR) instance
  • Pushes the image to the ECR instance
  • Creates a new ECS task definition, pointing to the ECR image definition

Prerequisites#

  1. Install Pulumi
  2. Configure AWS credentials
  3. Install Python
  4. Install Docker

Deploying the example#

  1. Create a new stack:

    Terminal window
    pulumi stack init aws-py-voting-app
  2. Set the AWS region and Redis password:

    Terminal window
    pulumi config set aws:region us-west-2
    pulumi config set redis-password <PASSWORD> --secret
  3. Install dependencies:

    Terminal window
    python3 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
  4. Run pulumi up to deploy changes:

    Terminal window
    pulumi up
    Updating (aws-py-voting-app):
    Type Name Status Info
    + pulumi:pulumi:Stack webserver-py-aws-py-voting-app created
    + ├─ docker-build:image:Image flask-dockerimage created
    + ├─ aws:ec2:Vpc app-vpc created
    + ├─ aws:ecs:Cluster app-cluster created
    + ├─ aws:iam:Role app-exec-role created
    + ├─ aws:iam:Role app-task-role created
    + ├─ aws:ecr:Repository app-ecr-repo created
    + ├─ aws:ecr:LifecyclePolicy app-lifecycle-policy created
    + ├─ aws:iam:RolePolicyAttachment app-exec-policy created
    + ├─ aws:iam:RolePolicyAttachment app-access-policy created
    + ├─ aws:iam:RolePolicyAttachment app-lambda-policy created
    + ├─ aws:ecs:TaskDefinition redis-task-definition created
    + ├─ aws:ec2:InternetGateway app-gateway created
    + ├─ aws:ec2:SecurityGroup security-group created
    + ├─ aws:ec2:Subnet app-vpc-subnet created
    + ├─ aws:lb:TargetGroup redis-targetgroup created
    + ├─ aws:lb:TargetGroup flask-targetgroup created
    + ├─ aws:ec2:RouteTable app-routetable created
    + ├─ aws:lb:LoadBalancer redis-balancer created
    + ├─ aws:lb:LoadBalancer flask-balancer created
    + ├─ aws:ec2:MainRouteTableAssociation app_routetable_association created
    + ├─ aws:lb:Listener flask-listener created
    + ├─ aws:lb:Listener redis-listener created
    + ├─ aws:ecs:TaskDefinition flask-task-definition created
    + ├─ aws:ecs:Service redis-service created
    + └─ aws:ecs:Service flask-service created
    Outputs:
    app-url: "flask-balancer-3987b84-b596c9ee2027f152.elb.us-west-2.amazonaws.com"
    Resources:
    + 26 created
    Duration: 3m10s
  5. View the DNS address of the instance via stack output:

    Terminal window
    pulumi stack output
    Current stack outputs (1):
    OUTPUT VALUE
    app-url flask-balancer-3987b84-b596c9ee2027f152.elb.us-west-2.amazonaws.com
  6. Verify that the app is running by connecting to it in a browser window.

Cleaning up#

Once you’re finished experimenting, destroy your stack and remove it to avoid incurring any additional cost:

Terminal window
pulumi destroy
pulumi stack rm

Related

The infrastructure as code platform for any cloud.