[PYTHON] Ce que j'ai trouvé en déployant Django sur EC2

introduction

Jusqu'à présent, j'utilisais Heroku comme plate-forme cloud, mais depuis que j'ai eu l'opportunité de migrer vers EC2, j'ai résumé la solution sur laquelle je suis tombé par hasard pendant le travail de migration et des points à noter lors du déploiement d'applications Web sur EC2. C'était.

Cette fois, la structure de répertoires suivante est supposée

root
├── etc
│   └── systemd
│       └── system
│           └── sampled.service
└── home
    └── ubuntu
        └── sample
            └── sample.py

C'est un programme Python qui affiche "OK" toutes les minutes.

sample.py


#!/usr/bin/env python3
import syslog
from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

@sched.scheduled_job("interval", minutes=1)
def sample():
    syslog.syslog("OK")

sched.start()

À part: je n'ai pas pu créer de compte AWS tout de suite

Dans mon cas, j'ai eu une erreur dans l'authentification du téléphone et je n'ai pas pu continuer, j'ai donc fait une demande d'assistance et demandé de l'aide.

Après tout, il a fallu près d'une semaine au centre d'appels pour effectuer une procédure manuelle et le compte est devenu disponible, donc si vous obtenez une erreur, créez immédiatement un dossier d'assistance et faites-le traiter!

Précautions lors de la création d'une instance EC2

Tout d'abord, j'écrirai sur les points à noter lors de la création d'une instance EC2.

Lors de la création d'une instance EC2, vous sélectionnez l'AMI à utiliser. Fondamentalement, il est préférable de sélectionner le système Amazon Linux, mais cela modifiera la méthode de création du processus démon qui sera introduit ultérieurement.

Ainsi, lors du déploiement en vous référant à un site, vérifiez d'abord quelle AMI vous utilisez avant de continuer!

Précautions lors de la création d'un démon

Le point suivant à noter lors de la transformation d'un programme en démon.

Comme je l'ai écrit plus tôt, la méthode de fabrication changera en fonction de l'AMI utilisée.

Depuis Ubuntu 20.04 a été utilisé cette fois, le fichier de paramètres de service pour la démonisation du programme se trouvait à l'emplacement suivant.

Dépend de l'AMI utilisée
Ubuntu: /etc/systemd/system/sampled.service

Variables d'environnement du démon

Le point suivant à noter lors de la gestion des variables d'environnement dans le démon.

C'est la principale pierre d'achoppement dans la définition des variables d'environnement du démon.

Fondamentalement, il n'y a aucun problème si vous tapez la commande suivante pour exécuter le programme à partir du terminal.

$ SAMPLE=123456789
$ export SAMPLE
$ echo $SAMPLE
>>> 123456789

Si vous souhaitez rendre les variables d'environnement persistantes

sudo vi /etc/profile

Si vous énumérez les variables d'environnement que vous souhaitez définir, elles seront appliquées au démarrage suivant.

/etc/profile


SAMPLE=123456789
export SAMPLE

Pourtant!!

Le démon ne lit pas ces variables d'environnement <<< important ici !!

Créons donc un paramètre de variable d'environnement dédié au démon comme suit

/etc/sysconfig/sampled_env


SAMPLE=123456789

Ajoutez également la variable d'environnement spécifiée aux paramètres du service afin que le démon puisse la lire.

/etc/systemd/system/sampled.service


'''
réduction
'''
[Service]
#Postscript
EnvironmentFile=/etc/sysconfig/sampled_env
'''
réduction
'''

Après cela, tapez la commande suivante pour recharger les paramètres du service et redémarrer le démon.

$ sudo systemctl daemon-reload
$ sudo systemctl restart sampled

Après cela, tapez la commande suivante et si l'élément actif est actif (en cours d'exécution), il réussit.

$ sudo systemctl status sampled 
>>> sampled.service - sampled daemon
>>>   Loaded: loaded (/lib/systemd/system/sampled.service; enabled; vendor preset: enabled)
>>>   Active: active (running)
>>> '''
>>>réduction
>>> '''

Si vous souhaitez consulter le journal du programme, vous pouvez le vérifier avec la commande suivante!

$ sudo journalctl -u sampled
>>> Jul 29 17:50:24 ip-Omis échantillonné.py[réduction]: OK
>>> Jul 29 17:51:24 ip-Omis échantillonné.py[réduction]: OK

Paramètres d'autorisation de fichier

Ensuite, il y a des notes liées aux autorisations de fichiers.

J'ai trébuché parce que je ne définissais pas correctement les autorisations de fichier lors de la démonstration d'un programme.

Si vous tapez la commande suivante comme avant et que l'élément actif échoue (résultat: code de sortie), suspectez une erreur d'autorisation.

$ sudo systemctl status sampled 
>>> sampled.service - sampled daemon
>>>   Loaded: loaded (/lib/systemd/system/sampled.service; enabled; vendor preset: enabled)
>>>   Active: failed (Result: exit-code)
>>> '''
>>>réduction
>>> '''

Tout d'abord, si une erreur Permission refusée apparaît, accédez au répertoire contenant le fichier que vous souhaitez démoniser et tapez la commande suivante.

~/sampled


$ ls -l
>>> -rw-r--r-- 1 root  root  1052 Jul 29 17:16 sample.py

Vérifiez l'autorisation d'accès du fichier affiché par la commande, et s'il est différent de l'utilisateur et du groupe décrits dans le fichier de paramètres de service du démon, entrez la commande suivante.

/etc/systemd/system/sampled.service


'''
réduction
'''
[Service]
User=sample
Group=sample-group
'''
réduction
'''

Avec les paramètres ci-dessus

#Modifier les autorisations de fichier
$ sudo chown sample:sample-group /home/ubuntu/sample/sample.py
$ sudo chmod 755 /home/ubuntu/sample/sample.py

#Confirmation du changement d'autorisation de fichier
$ ls -l
>>> -rwxr-xr-x 1 sample  sample-group  1052 Jul 29 17:16 sample.py

#Redémarrer le démon
$ sudo systemctl restart sampled

#Affichage de l'état de fonctionnement du démon
$ systemctl status sampled
>>> sampled.service - sampled daemon
>>>   Loaded: loaded (/lib/systemd/system/sampled.service; enabled; vendor preset: enabled)
>>>   Active: active (running)
>>> '''
>>>réduction
>>> '''

Si l'élément actif est maintenant activé (en cours d'exécution), vous avez terminé !!

en conclusion

C'était difficile jusqu'à ce que je puisse faire diverses choses parce que je n'utilise généralement pas Linux, mais ce sera très pratique si je peux le maîtriser, donc je vais continuer à apprendre!

Après tout, AWS est incroyable

Merci pour votre visite.

Recommended Posts

Ce que j'ai trouvé en déployant Django sur EC2
Ce que j'ai appris au hackerrank en 1/30 jours.
J'ai fait une webAPI! Construire un environnement à partir de Django Rest Framework 1 avec EC2
J'ai essayé de réduire les coûts en démarrant / arrêtant EC2 dans un lot avec AWS Lambda
Débutants en Python accro à Django
Qu'est-ce que Django? .. ..
A vous qui êtes acculé par le déploiement de Django. Déploiement de Django 2.2 version complète sur Ubuntu 18.04 + Nginx
J'ai essayé Django
Mémo de déploiement de Django × Postgresql sur Docker vers Heroku
Notes diverses sur le déploiement de l'application django sur Heroku
Ce que j'ai appris en participant aux qualifications ISUCON10