AWS Classic

Pulumi Official
Package maintained by Pulumi
v5.9.1 published on Tuesday, Jun 21, 2022 by Pulumi

Voting app Using Redis and Flask

View Code Deploy

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

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


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

Deploying and running the program

  1. Create a new stack:

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

    $ pulumi config set aws:region us-west-2
    $ pulumi config set redis-password <PASSWORD> --secret
  3. Run pulumi up -y to deploy changes:

    Updating (aws-py-voting-app):
        Type                                  Name                            Status      Info
    +   pulumi:pulumi:Stack                   webserver-py-aws-py-voting-app  created     
    +   ├─ docker: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     
        app-url: ""
        + 26 created
    Duration: 3m10s
  4. View the DNS address of the instance via stack output:

    $ pulumi stack output
    Current stack outputs (1):
        OUTPUT   VALUE
  5. 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.