https://github.com/devenes/cloudformation-containerization-bookstore-api
Bookstore Web API Application aims to create a bookstore web service using Docker to have the understanding to dockerization of an application. The application code is to be deployed as a RESTful web service with Flask using Dockerfile and Docker Compose on AWS Elastic Compute Cloud (EC2) Instance using AWS CloudFormation Service.
https://github.com/devenes/cloudformation-containerization-bookstore-api
api aws aws-elastic-compute-cloud cloudformation docker docker-compose dockerization ec2 flask mysql python
Last synced: 9 months ago
JSON representation
Bookstore Web API Application aims to create a bookstore web service using Docker to have the understanding to dockerization of an application. The application code is to be deployed as a RESTful web service with Flask using Dockerfile and Docker Compose on AWS Elastic Compute Cloud (EC2) Instance using AWS CloudFormation Service.
- Host: GitHub
- URL: https://github.com/devenes/cloudformation-containerization-bookstore-api
- Owner: devenes
- License: mit
- Created: 2022-04-23T19:51:18.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2022-04-25T21:38:12.000Z (almost 4 years ago)
- Last Synced: 2025-02-22T19:26:59.519Z (about 1 year ago)
- Topics: api, aws, aws-elastic-compute-cloud, cloudformation, docker, docker-compose, dockerization, ec2, flask, mysql, python
- Language: Python
- Homepage:
- Size: 228 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Dockerization of Bookstore Web API Python Flask with MySQL using Docker Compose and CloudFormation
## Description
Bookstore Web API Application aims to create a bookstore web service using Docker to have the understanding to dockerization of an application. The application code is to be deployed as a RESTful web service with Flask using Dockerfile and Docker Compose on AWS Elastic Compute Cloud (EC2) Instance using AWS CloudFormation Service.
## Problem Statement

- Your team has started working on a project to create a `Bookstore` Application as Web Service.
- Software Developers in your team have already developed first version of `Bookstore` application. They have designed a database to keep book records with following fields.
- book_id: unique identifier for books, type is numeric.
- title: title of the book, type is string.
- author: author of the book. type is string.
- is_sold: book availability status, type is boolean.
- Your teammates also created the RESTful web service as given in [Bookstore API](./bookstore-api.py) using Python Flask Framework. Below table shows how the HTTP methods are designed to affect the given resources identified by URIs.
| HTTP Method | Action | Example |
| ----------- | ----------------------------------- | --------------------------------------------------------------------------------------------------- |
| `GET` | Obtain information about a resource | http://[ec2-hostname]/books (retrieves list of all books) |
| `GET` | Obtain information about a resource | http://[ec2-hostname]/books/123 (retrieves book with id=123) |
| `POST` | Create a new resource | http://[ec2-hostname]/books (creates a new book, from data provided with the request) |
| `PUT` | Update a resource | http://[ec2-hostname]/books/123 (updates the book with id=123, from data provided with the request) |
| `DELETE` | Delete a resource | http://[ec2-hostname]/books/123 (delete the book with id=123) |
- You are, as a cloud engineer, requested to deploy the app in the development environment on a Docker Machine on AWS EC2 Instance using AWS CloudFormation Service to showcase your project. To do that you need to;
- Get the app code from GitHub repo of your team.
- Create docker image using the `Dockerfile`.
- Deploy the app using `docker compose`. To do so;
- Create a database service using MySQL.
- Configure the app service to run on `port 80`.
- Use a custom network for the services.
- In the development environment, you can configure your CloudFormation template using the followings,
- The application stack should be created with new AWS resources.
- The application should run on Amazon Linux 2 EC2 Instance
- EC2 Instance type can be configured as `t2.micro`.
- Instance launched by CloudFormation should be tagged `Web Server of StackName`
- The Web Application should be accessible via web browser from anywhere.
- The Application files should be downloaded from Github repo and deployed on EC2 Instance using user data script within CloudFormation template.
- Bookstore Web API URL should be given as output by CloudFormation Service, after the stack created.
## Expected Outcome
### At the end of the project, following topics are to be covered;
- MySQL Database Configuration
- Bash scripting
- Docker Images
- Docker Compose
- AWS EC2 Service
- AWS Security Group Configuration
- AWS CloudFormation Service
- AWS CloudFormation Template Design
- Git & Github for Version Control System
### At the end of the project, you will be able to;
- configure connection to the `MySQL` database.
- build a Docker images.
- configure Docker Compose to run Python Flask app.
- improve bash scripting skills using `user data` section in CloudFormation to install and setup web application on EC2 Instance
- configure AWS EC2 Instance and Security Groups.
- configure CloudFormation template to use AWS Resources.
- use AWS CloudFormation Service to launch stacks.
- use git commands (push, pull, commit, add etc.) and Github as Version Control System.
- run the web application on AWS EC2 instance using the GitHub repo as codebase.
## Notes
- To showcase your projects REST functions, use `curl` command for each HTTP methods namely, `GET`, `POST`, `PUT`, `DELETE`.
## Resources
- [Representational State Transfer](https://en.wikipedia.org/wiki/Representational_state_transfer)
- [AWS CloudFormation User Guide](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)