The TechConf website allows attendees to register for an upcoming conference. Administrators can also view the list of attendees and notify all attendees via a personalized email message.
The application is currently working but the following pain points have triggered the need for migration to Azure:
- The web application is not scalable to handle user load at peak
- When the admin sends out notifications, it's currently taking a long time because it's looping through all attendees, resulting in some HTTP timeout exceptions
- The current architecture is not cost-effective
In this project, you are tasked to do the following:
- Migrate and deploy the pre-existing web app to an Azure App Service
- Migrate a PostgreSQL database backup to an Azure Postgres database instance
- Refactor the notification logic to an Azure Function via a service bus queue message
You will need to install the following locally:
- Create a Resource group
- Create an Azure Postgres Database single server
- Add a new database
techconfdb
- Allow all IPs to connect to database server
- Restore the database with the backup located in the data folder
- Add a new database
- Create a Service Bus resource with a
notificationqueue
that will be used to communicate between the web and the function- Open the web folder and update the following in the
config.py
filePOSTGRES_URL
POSTGRES_USER
POSTGRES_PW
POSTGRES_DB
SERVICE_BUS_CONNECTION_STRING
- Open the web folder and update the following in the
- Create App Service plan
- Create a storage account
- Deploy the web app
-
Create an Azure Function in the
function
folder that is triggered by the service bus queue created in Part 1.Note: Skeleton code has been provided in the README file located in the
function
folder. You will need to copy/paste this code into the__init.py__
file in thefunction
folder.- The Azure Function should do the following:
- Process the message which is the
notification_id
- Query the database using
psycopg2
library for the given notification to retrieve the subject and message - Query the database to retrieve a list of attendees (email and first name)
- Loop through each attendee and send a personalized subject message
- After the notification, update the notification status with the total number of attendees notified
- Process the message which is the
- The Azure Function should do the following:
-
Publish the Azure Function
- Refactor the post logic in
web/app/routes.py -> notification()
using servicebusqueue_client
:- The notification method on POST should save the notification object and queue the notification id for the function to pick it up
- Re-deploy the web app to publish changes
Complete a month cost analysis of each Azure resource to give an estimate total cost using the table below:
Azure Resource | Service Tier | Monthly Cost |
---|---|---|
Azure Postgres Database | Basic - Single Server | $65.08 |
Azure Service Bus | Basic Service Plan - B1 | $13.14 |
App Service | Basic | $0.05 |
Azure Functions | Consumption Tier | $0 |
Storage Accounts | Storage (general purpose v1) | $0.018 |
-
Azure Postgres Database:
- Service Tier: Basic - Single Server
- Monthly Cost: $65.08
- Explanation:
- The Basic tier was chosen for cost effectiveness while meeting database requirements.
- The Single Server option suits small applications, providing a standalone PostgreSQL server.
- This tier provides a balance of performance and cost for your database needs.
-
App Service:
- Service Tier: Basic
- Monthly Cost: $0.05
- Explanation:
- The Basic tier was chosen to keep costs low while meeting the needs to host a Flask based web application.
- This tier provides enough resources for small to medium applications.
- App Service provides easy and scalable deployments on demand.
-
Azure Functions:
- Service Tier: Consumption Tier
- Monthly Cost: (Not specified in the table)
- Explanation:
- The Consumption tier was chosen for Azure Functions to take advantage of a serverless architecture.
- This tier incurs costs based on actual usage, making it cost effective for uneven workloads.
- Azure Functions handles background processing tasks, like notification jobs, in an event-driven way.
-
Azure Service Bus:
- Service Tier: Basic Service Plan - B1
- Monthly Cost: $13.14
- Explanation:
- The Basic Service Plan provides enough capabilities for message queuing.
- B1 was chosen for cost effectiveness while meeting the application's needs.
- Azure Service Bus supports asynchronous communication between the web application and Azure Functions.
-
Storage Accounts:
- Service Tier: Storage (general purpose v1)
- Monthly Cost: (Not specified in the table)
- Explanation:
- A Storage account can be used to store static assets, logs, or other data.
- General-purpose v1 is a standard storage tier suitable for many storage needs.
- Costs depend on the amount of data stored and operations performed.
This architecture enables efficient handling of user interactions, background processing, and communication between components, ensuring a cost-effective and scalable solution for the application.