Skip to main content

AWS Python Voting App

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

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
  2. Configure Pulumi for AWS
  3. Configure Pulumi for Python
  4. Install Docker

Deploying and running the program#

  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. Run pulumi up -y to deploy changes:

    Terminal window
    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
  4. 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
  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.

Related

The infrastructure as code platform for any cloud.