La pandémie mondiale du CoronaVirus COVID-19, également appelée SRAS-CoV-2, a déjà touché des millions de personnes dans le monde. L'application Web COVID-19 est un prototype d'application cloud développée en Python et Flask qui donne les statistiques mondiales des cas touchés par le COVID-19. Cette application utilise un service API REST pour obtenir les statistiques quotidiennes de COVID-19 et l'application est déployée dans l'instance AWS EC2.
Obtenez le résumé de tous les pays et les statistiques mondiales.
Obtenez la liste de tous les pays ainsi que les détails des slugs et des codes de pays.
Cela charge la base de données avec les statistiques des pays COVID 19 à l'aide de l'API externe « https://api.covid19api.com/summary ».
La page d'accueil affiche les statistiques mondiales du COVID 19 ainsi que des liens pour afficher les statistiques par pays et l'interaction avec l'API REST externe. On peut utiliser la commande curl :
Obtenez les statistiques de tous les pays de la base de données. Peut être exécuté à l'aide de la commande curl suivante :
curl -i -k https://0.0.0.0/summary/country
Obtenez les statistiques globales de la base de données. Peut être exécuté à l'aide de la commande curl suivante :
curl -i -k https://0.0.0.0/summary/global
Obtenez les statistiques spécifiques au pays à partir de la base de données. Peut être exécuté à l'aide de la commande curl suivante :
curl -i -k https://0.0.0.0/summary/country/TestCountry
Ajoutez un nouveau pays à la base de données. L'utilisateur doit fournir les éléments suivants :
Il s'agit d'une requête POST et peut être exécutée à l'aide de la commande curl suivante :
curl -i -k -H "Content-Type: application/json" -X POST -d '{"NewConfirmed":2,"TotalConfirmed":3,"NewDeaths":3,"TotalDeaths":3,"NewRecovered":3,"TotalRecovered":3,"Country":"TestCountry"}' https://0.0.0.0/summary/country
Mettez à jour un pays existant dans la base de données. L'utilisateur doit fournir les éléments suivants :
Il s'agit d'une requête PUT et peut être exécutée à l'aide de la commande curl suivante :
curl -i -k -H "Content-Type: application/json" -X PUT -d '{"NewConfirmed":999,"TotalConfirmed":3,"NewDeaths":3,"TotalDeaths":3,"NewRecovered":3,"TotalRecovered":3,"Country":"TestCountry"}' https://0.0.0.0/summary/country
Supprime un enregistrement de pays de la base de données. L'utilisateur doit fournir les éléments suivants :
Il s'agit d'une requête DELETE et peut être exécutée à l'aide de la commande curl suivante :
curl -i -k -H "Content-Type: application/json" -X DELETE -d '{"Country":"TestCountry"}' https://0.0.0.0/summary/country
Ajoutez les statistiques globales à la base de données. L'utilisateur doit fournir les éléments suivants :
Ici, « clé » fait référence à la valeur « Globale ». Il s'agit d'une requête POST et peut être exécutée à l'aide de la commande suivante :
curl -i -k -H "Content-Type: application/json" -X POST -d '{"NewConfirmed":9,"TotalConfirmed":3,"NewDeaths":3,"TotalDeaths":3,"NewRecovered":3,"TotalRecovered":3,"Key":"TestGlobal"}' https://0.0.0.0/summary/global
Met à jour les statistiques globales dans la base de données. L'utilisateur doit fournir les éléments suivants :
Ici, « clé » fait référence à la valeur « Globale ». Il s'agit d'une requête PUT et peut être exécutée à l'aide de la commande suivante :
curl -i -k -H "Content-Type: application/json" -X PUT -d '{"NewConfirmed":1,"TotalConfirmed":10,"NewDeaths":3,"TotalDeaths":3,"NewRecovered":3,"TotalRecovered":3,"Key":"TestGlobal"}' https://0.0.0.0/summary/global
Supprime l'enregistrement de statistiques globales de la base de données. L'utilisateur doit fournir les éléments suivants :
*Clé
Ici, « clé » fait référence à la valeur « Globale ». Il s'agit d'une requête DELETE et peut être exécutée à l'aide de la commande suivante :
curl -i -k -H "Content-Type: application/json" -X DELETE -d '{"Key":"TestGlobal"}' https://0.0.0.0/summary/global
sudo apt update
sudo apt install docker.io
sudo docker pull cassandra:latest
sudo docker run --name cassandra-test -p 9042:9042 -d cassandra:latest
wget https://raw.githubusercontent.com/niranjanganesan/ECS781P_Cloud_Computing_Mini_Project/master/country.csv
wget https://raw.githubusercontent.com/niranjanganesan/ECS781P_Cloud_Computing_Mini_Project/master/global.csv
sudo docker cp country.csv cassandra-test:/home/country.csv
sudo docker cp global.csv cassandra-test:/home/global.csv
sudo docker exec -it cassandra-test cqlsh
cqlsh> CREATE KEYSPACE COVID19 WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': '1'};
cqlsh> CREATE TABLE COVID19.summary (Country text PRIMARY KEY,NewConfirmed int,
TotalConfirmed int, NewDeaths int, TotalDeaths int, NewRecovered int,
TotalRecovered int);
cqlsh> CREATE TABLE COVID19.global (Key text PRIMARY KEY,NewConfirmed int,
TotalConfirmed int, NewDeaths int, TotalDeaths int, NewRecovered int,
TotalRecovered int, TimeStamp text);
cqlsh> COPY COVID19.summary(Country, NewConfirmed, TotalConfirmed, NewDeaths, TotalDeaths, NewRecovered, TotalRecovered)
FROM '/home/country.csv' WITH HEADER=TRUE;
cqlsh> COPY COVID19.global(Key, NewConfirmed, TotalConfirmed, NewDeaths, TotalDeaths, NewRecovered, TotalRecovered)
FROM '/home/global.csv' WITH HEADER=TRUE;
L'application est servie via https en configurant les certificats auto-signés comme indiqué ci-dessous :
$ openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
Generating a RSA private key
.....................................++++
....................................................................................++++
writing new private key to 'key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:UK
State or Province Name (full name) [Some-State]:England
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:QMUL
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:[email protected]
if __name__ == "__main__":
context = ('cert.pem','key.pem')
app.run(host='0.0.0.0',port=443,ssl_context=context)
Vous trouverez ci-dessous les étapes pour créer l'image Docker et déployer l'application dans Kubernetes.
sudo snap install microk8s --classic
sudo microk8s enable registry
apiVersion: apps/v1
kind: Deployment
metadata:
name: covidapp-deployment
labels:
app: covidapp
spec:
selector:
matchLabels:
app: covidapp
replicas: 3
template:
metadata:
labels:
app: covidapp
spec:
containers:
- name: covidapp
image: localhost:32000/covidapp:registry
ports:
- containerPort: 443
sudo docker build . -t localhost:32000/covidapp:registry
sudo docker push localhost:32000/covidapp:registry
{
"insecure-registries" : ["localhost:32000"]
}
Remarque : Cette étape est facultative et doit être effectuée uniquement si Docker Push a échoué.
sudo systemectl restart docker
sudo docker start cassandra-test
sudo microk8s.kubectl apply -f ./deployment.yaml
L'application we est désormais déployée dans kubernetes
sudo microk8s.kubectl get deployment
sudo microk8s.kubectl get pods
sudo microk8s.kubectl expose deployment covidapp-deployment --port=443 --type=LoadBalancer
sudo microk8s.kubectl get services
Vous trouverez ci-dessous un exemple d'état du service :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/covidappv3-deployment LoadBalancer 10.152.183.77 <pending> 443:30873/TCP 17h
service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 9d
Ici, nous pouvons voir que l'application Web déployée est exposée au Nodeport « 30873 ». Par défaut, le service Kubernetes alloue un port dans la plage « 30000-32767 ».
Enfin, affichez l'application Web dans le navigateur en utilisant le DNS public du compte AWS EC2 ainsi que ce Nodeport qui commence par « 30xxx ».
sudo microk8s.kubectl delete deployment covidapp-deployment
sudo microk8s.kubectl delete service covidapp-deployment
sudo docker rm cassandra-test