Aller au contenu

Comment déployer automatiquement une application Python Flask avec AWS Elastic Beanstalk

7 décembre 2023

Onkar Singh

Ce tutoriel est conçu pour aider les développeurs à déployer automatiquement une API en Python grâce à AWS Elastic Beanstalk. Il est divisé en trois sections :

  1. Le déploiement de l’application Flask en Python via AWS Elastic Beanstalk
  2. L’automatisation de l’installation et du renouvellement du certificat SSL
  3. L’ajustement automatique de la configuration nginx pour éviter les erreurs HTTP 413 « Payload Too Large ».

Les étapes 2 et 3 visent à assurer la continuité du service. Une bonne connaissance des services AWS est recommandée pour suivre ce guide.

Table des matières

  1. Pourquoi choisir Elastic Beanstalk?
  2. Exemple d’application
  3. Déploiement sur Elastic Beanstalk (EB)
  4. Gestion et renouvellement du certificat SSL
  5. Mise à jour Automatique de la Configuration nginx pour éviter les erreurs HTTP 413 « Payload Too Large »
  6. Conclusion
  7. Références

Pourquoi choisir Elastic Beanstalk?

Elastic Beanstalk est un service AWS accessible aux débutants qui permet de déployer des applications Web sans connaissance approfondie de l’infrastructure AWS sous-jacente.

Exemple d’application

1. Installez Python depuis https://www.python.org/downloads/

2. Dans ce tutoriel, nous allons travailler avec l’application Flask ci-dessous :

from flask import Flask

application = Flask(__name__)

@application.route("/")
def hello():
    return "Welcome to Onkar's Sample Python Flask App"

if __name__ == "__main__":
    application.run(host='127.0.0.1', port=5000, debug=True)


3. Créez un fichier supplémentaire appelé requirements.txt qui spécifie que Flask v2.0.1 est essentiel à l’application et permet l’installation des dépendances.

Flask==2.0.1

4. Exécutez la commande suivante sur votre machine pour installer Flask et démarrer l’application : 

# Install Flask
pip install flask

# Run the python Flask Application locally
python ./application.py

5. Compressez le dossier du projet et appelez-le « SampleApp.zip » pour les étapes suivantes. 

 

Déploiement sur Elastic Beanstalk (EB)

1. Utilisez la console AWS pour créer une nouvelle application sur Elastic Beanstalk.

a. Accédez à Elastic Beanstalk depuis le menu des services AWS.
b. Cliquez sur le bouton « Create Application ». Un formulaire s’affiche.
c. Nommez votre application; j’appelle la mienne « Sample App Onkar ».
d. Sélectionnez « Python » comme plateforme et gardez les autres paramètres par défaut.
e. Pour le code de l’application, choisissez « upload your own code » et sélectionnez SampleApp.zip.
f. Validez en cliquant sur « Create Application ».

EXEMPLE D'APPLICATION

2. Cela créera l’application ainsi qu’un environnement de serveur Web.

3. Comptez environ 5 minutes pour la configuration de l’ensemble des ressources nécessaires, des équilibreurs de charge aux instances EC2, en passant par les groupes de sécurité.

4. Une fois que tout est opérationnel, visitez l’URL dédiée pour accéder à l’application : http://sampleapponkar-env.eba-ffjmsc4p.us-east-1.elasticbeanstalk.com/

Localhost

5. Pour les déploiements subséquents, il suffit de cliquer sur « Upload and Deploy » dans la page liée à l’environnement pour téléverser le dossier compressé à jour.

C’est tout pour la partie déploiement. Pour le dépannage d’applications plus sophistiquées, consultez les journaux, les paramètres et les outils de surveillance disponibles dans l’interface de l’environnement.

Gestion et renouvellement du certificat SSL

Pour faciliter la gestion de l’application EB, pensez à automatiser le renouvellement des certificats SSL. Généralement, ces certificats sont associés à des domaines en votre possession, mais ce n’est pas le cas de notre adresse EB http://sampleapponkar-env.eba-ffjmsc4p.us-east-1.elasticbeanstalk.com/, et nous ne détenons pas le domaine elasticbeanstalk.com.

Il existe plusieurs façons d’intégrer un certificat SSL à un environnement Elastic Beanstalk :

  1. Utiliser l’Application Load Balancer avec ACM. Cependant, utiliser un équilibreur de charge pour une application à instance unique peut entraîner des coûts AWS superflus uniquement pour activer HTTPS.
  2. Utiliser une configuration CloudFront, idéale pour diffuser du contenu CDN à un public international.
  3. Intégrer directement votre certificat SSL à l’instance EC2 sous-jacente. Bien que plus technique, c’est l’option la plus rentable pour les applications à instance unique.

Dans ce guide, nous nous concentrerons sur la troisième option et sur l’automatisation du renouvellement du certificat SSL. Notez qu’il est nécessaire de rediriger le DNS de votre domaine personnalisé vers l’URL de votre application Elastic Beanstalk. Par exemple, http://onkar.bluerelay.com doit pointer vers http://sampleapponkar-env.eba-ffjmsc4p.us-east-1.elasticbeanstalk.com/. Cette technique ne génère aucuns frais supplémentaires. Pour créer des certificats SSL, nous avons choisi CertBot, un outil populaire dans le domaine. Nous utilisons également des scripts ebextensions pour faciliter leur génération et leur renouvellement.

1. Dans le répertoire principal, créez un dossier appelé .ebextensions.

2. Créez ensuite un fichier intitulé config et insérez-y le code suivant :

container_commands:
    00_download_epel:
        command: "sudo wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/"
        ignoreErrors: true
    10_install_epel_release:
        command: "sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm"
        ignoreErrors: true
    20_enable_epel:
        command: "sudo yum-config-manager --enable epel*"
        ignoreErrors: true
    30_install_certbot:
        command: "sudo yum install -y certbot python2-certbot-nginx"
        ignoreErrors: true

Ce fichier configure l’installation de CertBot et de ses dépendances sur l’instance EC2.

3. Ouvrez le port 443 sur l’instance EC2 en modifiant les règles pour connexions entrantes du groupe de sécurité approprié. Ensuite, ajoutez un autre fichier nommé 2_open_port_443.config contenant le code ci-après :

Resources:
    sslSecurityGroupIngress:
        Type: AWS::EC2::SecurityGroupIngress
        Properties:
            GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
            IpProtocol: tcp
            ToPort: 443
            FromPort: 443
            CidrIp: 0.0.0.0/0

4. Une fois le déploiement terminé, nous utiliserons le hook postdeploy (le dernier à s’activer) pour lancer l’installation du certificat.

Vous pouvez consulter le rôle des commandes EB Platform ici : https://docs.aws.amazon.com/fr_fr/elasticbeanstalk/latest/dg/platforms-linux-extend.html

5. Dans le répertoire principal, créez deux dossiers nommés respectivement .platform

  • et hooks
  • À l’intérieur de hooks, créez un sous-dossier appelé postdeploy
  • Le chemin complet devrait ressembler à .platform/hooks/postdeploy

    #!/usr/bin/env bash sudo certbot -n -d YOUR_DOMAIN_NAME --nginx --agree-tos --email YOUR_EMAIL

6. Dans postdeploy, créez un fichier nommé sh et insérez-y le code suivant :

#!/usr/bin/env bash
sudo certbot -n -d YOUR_DOMAIN_NAME --nginx --agree-tos --email YOUR_EMAIL

N’oubliez pas de modifier le domaine et l’adresse courriel selon vos besoins. Cette commande vérifie que le serveur hôte pointe bien vers le nom de domaine indiqué, génère les certificats SSL, les intègre au bon répertoire nginx, et met à jour les paramètres nginx pour les utiliser. Merci, CertBot!

7. Il faut maintenant accorder les droits d’exécution au script. Pour ce faire, créez le fichier config avec le code suivant :

container_commands:
    00_permission_hook:
        command: "chmod +x .platform/hooks/postdeploy/1_generate_certificate.sh"


8. À ce stade, les certificats seront générés automatiquement. Pour assurer leur renouvellement, nous allons configurer une tâche planifiée avec une crontab. Dans le dossier .ebextensions, créez un fichier intitulé config contenant le code ci-dessous :

files:
    /tmp/renew_ssl_cron:
        mode: "000777"
        owner: root
        group: root
        content: |
            0 3,15 * * * certbot renew --no-self-upgrade

container_commands:
    1_create_cert_crontab:
        command: "sudo crontab /tmp/renew_ssl_cron"
    2_delete_cronjob_file:
        command: "sudo  rm /tmp/renew_ssl_cron"
        ignoreErrors: true

Ce fichier contient une expression Cron qui se chargera, à l’aide de commandes précises, de créer une crontab basée sur ce document et de le nettoyer par la suite. Ce mécanisme renouvellera les certificats quotidiennement à 3 h et à 15 h.

Téléversez-le sur EB

9. Voici à quoi devrait ressembler la structure de votre projet :

À présent, compressez le projet et téléversez-le sur EB.

10. Si vous souhaitez suivre ou diagnostiquer les scripts ebextensions, consultez les fichiers /var/log/cfn-init.log et /var/log/eb-hooks.log de l’instance EC2.

Mise à jour Automatique de la Configuration nginx pour éviter les erreurs HTTP 413 « Payload Too Large »

Il se peut que la configuration EB par défaut pour nginx ne soit pas suffisante. Par exemple, nginx a, de base, une limite de 1 Mo pour les requêtes POST. Étant donné que chaque nouvelle version écrase cette configuration, il est essentiel d’automatiser la mise à jour pour éviter les manipulations inutiles.

AUTOMATION

Pour augmenter limite à 20 Mo, il faut modifier le fichier /etc/nginx/nginx.conf comme indiqué à gauche :

Pour automatiser cette action, il faut ajouter des commandes additionnelles au dossier .ebextensions de la section précédente.

1. Dans postdeploy, créez un fichier appelé sh et collez-y le script suivant :

#!/usr/bin/env bash
sudo sed -i 's/client_header_timeout/client_max_body_size 20M;\n    client_header_timeout/g'  /etc/nginx/nginx.conf
sudo nginx -s reload
echo nginx config update complete

 

Ce script utilise la commande sed pour remplacer:

client_header_timeout

par

client_max_body_size 20M; client_header_timeout

Il actualise ensuite la configuration nginx avec nginx -s reload.

2. Modifiez également le fichier config dans le dossier .ebextensions pour permettre l’exécution de ce nouveau script. Voici à quoi ressemble le fichier 3_grant_exec_permission.config modifié :

container_commands:
    00_permission_hook:
        command: "chmod +x .platform/hooks/postdeploy/1_generate_certificate.sh"
    01_permission_hook2:
        command: "chmod +x .platform/hooks/postdeploy/01_update_filesize_nginx.sh"

3. Compressez à nouveau votre projet et déployez-le sur EB. Consultez le répertoire /var/log/ pour surveiller les hooks et l’exécution des scripts.

Conclusion

Félicitations! Vous avez maintenant les compétences pour :

  1. déployer une application Python Flask avec AWS Elastic Beanstalk;
  2. utiliser des scripts ebextensions pour automatiser la création et la mise à jour de certificats SSL avec Certbot;
  3. modifier n’importe quelle configuration sur l’instance EC2 grâce aux fichiers ebextension.

J’espère que vous avez aimé ce tutoriel sur Elastic Beanstalk autant que moi.

Références

Escandell, M. (18 avril 2021). How to get a SSL certificate running in AWS Elastic Beanstalk using Certbot. Medium. Consulté le 3 août 2022 sur : https://medium.com/edataconsulting/how-to-get-a-ssl-certificate-running-in-aws-elastic-beanstalk-using-certbot-6daa9baa3997

VOUS AVEZ UN PROJET ?