---
title: "AWS Python Voting App"
description: "Voting app that uses containers"
url: "https://www.pulumi.com/dev/examples/aws-py-voting-app/"
image: "https://www.pulumi.com/assets/og/dev/examples/aws-py-voting-app.png"
---

# AWS Python Voting App

Voting app that uses containers

- Source on GitHub: https://github.com/pulumi/examples/tree/master/aws-py-voting-app
- Deploy with Pulumi: https://app.pulumi.com/new?template=https%3A%2F%2Fgithub.com%2Fpulumi%2Fexamples%2Ftree%2Fmaster%2Faws-py-voting-app

## Get started with this example

This example lives in the [pulumi/examples](https://github.com/pulumi/examples/tree/master/aws-py-voting-app) repo. Pull down just this directory to follow along:

```bash
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
```

## Voting app Using Redis and Flask

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](https://www.pulumi.com/docs/get-started/install/)
1. [Configure Pulumi for AWS](https://www.pulumi.com/docs/intro/cloud-providers/aws/setup/)
1. [Configure Pulumi for Python](https://www.pulumi.com/docs/intro/languages/python/)
1. [Install Docker](https://docs.docker.com/engine/installation/)

## Deploying and running the program

1. Create a new stack:

    ```bash
    pulumi stack init aws-py-voting-app
    ```

1. Set the AWS region and Redis password:

    ```bash
    pulumi config set aws:region us-west-2
    pulumi config set redis-password <PASSWORD> --secret
    ```

1. Run `pulumi up -y` to deploy changes:

    ```bash
    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
    ```

1. View the DNS address of the instance via `stack output`:

    ```bash
    $ pulumi stack output
    Current stack outputs (1):
        OUTPUT   VALUE
        app-url  flask-balancer-3987b84-b596c9ee2027f152.elb.us-west-2.amazonaws.com

    ```

1. Verify that the EC2 instance exists, by connecting to it in a browser window.

## Clean up

To clean up resources, run `pulumi destroy` and answer the confirmation question at the prompt.
