Accès HTTPS sur un AWS EC2 hebergeant un streamlit

Bonjour !

Je viens vers vous à car je rame un peu pour crée un accès HTTPS à un streamlit.
J’ai volontairement essayé de ne présenter que la version qui me semble la plus simple, afin de faciliter la comprehension.
De même, j’ai essayé de présenter les choses de manière abstraite et générale plutôt que particulière, à la fois par soucis de simplicité, mais aussi parce que je présume que je ne suis pas le permier à vouloir déployer un streamlit sur une EC2 :slight_smile:

Méthodologie suivie:

[image docker] le port 8501 est exposé dans l’image docker, l’image est herbergé sur dockerhub.

[EC2] le container Streamlit est deployé dans une EC2 sur AWS.
[Instance EC2] Le port 8501 est exposé dans le container

sudo docker container run --rm -d --name containername -p 8501:8501 dockerhubrepo/dockerimage:1.0.0

[EC2] Le security group de l’instance ouvre les ports 8501 et 22

[EC2] Une IP fixe à été crée via le service d’IP Elastic d’AWS
[EC2] L’IP fixe à été attribuée à l’instance EC2

[Route 53] Un nom de domaine à été acheté
[Route 53] Le nom de domaine à été attaché à l’adresse IP fixe (hosted zone)

[ACM] Un certificat AWS à été crée pour le nom de domaine
[ACM=>Route 53] Les 2 enregistrements CNAME liés au certificats ont été ajoutés au nom de domaine (via la fonction automatique de AWS).

[EC2] un security group à été crée, en entrée et sortie sont ouverts les ports 80, 443
[EC2] Un target group à été crée, avec pour cible l’instance EC2 sur le port 8501
[EC2] Un Load balancer basique à été crée pour router les ports 80 et 443 vers le target group

Voici un rapide schéma, en espérant qu’il soit plus digeste:

Problème :
Le certificat AWS fonctionne correctement puisque, dans un navigateur, le nom de domaine est automatiquement redirigé de HTTP à HTTPS.

Cependant je n’arrive pas à acceder au streamlit, j’ai un message “La connexion à échouée”.

Tests réalisés :

Le streamlit fonctionne :

  • en restant sur un accès http, le streamlit fonctionne parfaitement en se rendant sur mon-ip-fixe:8501
  • En définissant la redirection du container sur 80:8501, j’ai aussi accès HTTP au streamlit en accédant à http://www.nomdedomaine.net

Avant de découvrir que AWS pouvait pouvait fournir des certificats gratuitement, j’utilisais let’s encrypt via l’agent certbot installé directement sur l’instance. j’ai depuis revoqué et supprimé le certificat let’s encrypt pour éviter un conflit avec le certificat AWS.

Piste
La couche de cryptage n’intervient qu’au niveau du load balancer, donc je penche pour un manque d’ouverture de port, mais je vois pas ou.

Question :

Est-ce que la démarche décrite dans le contexte vous semble correcte ?
Est-ce que vous auriez une idée ce qui pourrait ne pas fonctionner ?

Note:

J’ai conscience de l’existence de AWS Fargate et Lightsails, mais après quelques comparatifs une machine EC2 est plus économique dans mon cas (effet de seuil sur les config des machines + coûts additionnels de services annexes (load balancer payant par exemple)).

Je vous remercie par avance pour tout indice :slight_smile:

Cédric

Hello Cédric ,

le port 443 a bien été ouvert pour la partie SSL ? Pouvez vous vérifier que ce soit bien le cas.

Avez vous exposé le port 443 sur le port 8501 de votre conteneur ?

un exemple de configuration de streamlit en avec un certificat SSL sur nginx:
https://www.alibabacloud.com/blog/600130.
Ceci permettra de se rassurer qu’au niveau serveur et Sécurity Group les configs sont bonne afin de vérifier les pistes suivantes.

Cordialement

Bonjour Fall Lewis,

Merci pour votre retour !
Le port 443 n’était pas ouvert sur le container, parce que je pensais que le cryptage SSL/TLS s’arrêtait/commencait au niveau du load balancer.

J’ai l’impression que le load balancer ne gère pas le décryptage, bien que c’est lui qui à les certificats d’installés, et qu’il faut que tous passe par le port 443 jusqu’à l’EC2 et donc avoir des certificats SSL/TLS d’installés dans l’instance EC2, est-ce correct ?

J’ai également vu beaucoup de ressources sur le net mentionant NGINX, cependant ne connaissant pas cet OS je suis resté sur du Ubuntu Server (Instance EC2) et Debian (container docker).
Le lien que vous m’avez envoyé va dans le même sens, avec l’installation en direct d’un streamlit.

Je vais regarder si on peut faire la même chose mais en utilisant un container docker sur NGINX.
Sinon j’installerais directement le streamlit sur NGINX, mais ont perds tous l’intérêt du container qui sécurise l’environnement (version python et packages python).

Effectivement Cédric , dans ce contexte il faudra utiliser une instance de conteneur nginx qui servira de reverse proxy et qui aura pour rôle de gérer en amont les certificats et le chiffrement.
Un exemple sur mon dépôt GitHub - fallewi/streamssldocker avec docker-compose.

Cordialement
Fall Lewis

Merci, c’est désormais plus clair.

Le désavantage de passer par un container streamlit devient plus important pour un “petit projet”, puisqu’il faut alors avoir à minima deux containers (NGNIX + Streamlit), ce qui demande (a priori) d’avoir une machine un peu plus dimensionnée.

En revanche pour un projet plus complexe avec plusieurs containers, ajouter un NGINX en plus peut apporter plus de flexibilité que de surcoût en VM (et j’en ai un de ce genre en cours avec des containers Airflow, MysQL, streamlit et FastAPI).

Merci pour ces informations :slight_smile: !

Cédric

Bonjour ,

En tenant compte de l’ajout d’un server NGINX pour avoir la fonctionnalité reverse proxy, j’arriverais à une structure comme ceci :

En modifiant ce schéma je me suis demandé si il n’est pas possible de remplacer le load balancer de AWS par le server NGINX, étant donné que l’app streamlit en question n’aura qu’un traffic très faible et n’a aucune criticité, et donc aucune redondance.
Mais j’ai l’impression que ce Load Balancer est un passage obligé, qu’en pensez vous ?

De même les certificats SSL / TLS sont à deux endroits dans cette structure : dans le server NGINX et dans le Load Balancer.
Le server NGINX à de toute évidence besoin de ces certificats, mais j’ai aussi l’impression que le load balancer en à aussi besoin.
Est-ce un doublon réellement nécessaire ?

En résumé, deployer un simple streamlit sur une EC2 avec un exigence d’accès HTTPS crée un structure assez complexe ! Il est vrai que LightSail permet de faire la même chose bien plus simplement :slight_smile:

exactement :slightly_smiling_face: !!