Créez une application Django avec CodeStar et CI / CD avec CodePipline.
Machine locale
AWS EC2
Sauvegardez helloworld.pem
Sélectionnez la paire de clés que vous avez créée et cliquez sur Créer un projet Dix. Ignorer (AWS Cloud9 était dans la région de l'Oregon)
Le tableau de bord CodeStar s'affiche
CodePipline Source → Build → Attendez que le déploiement soit terminé
Your requested instance type (t2.micro) is not supported in your requested Availability Zone (us-west-2d). Please retry your request by not specifying an Availability Zone or choosing us-west-2a, us-west-2b, us-west-2c. (Service: AmazonEC2; Status Code: 400; Error Code: Unsupported; Request ID: 7ee63da9-fc85-4e2a-999c-629fe3997dbe)
Une fois le déploiement terminé, ouvrez le point de terminaison de l'application
OK si vous pouvez voir la page
Cliquer sur un code du tableau de bord CodeStar passe à CodeCommit
Copier l'URL du clonage d'URL
Quatre. Ouvrir l'invite anaconda
Cinq. Créer un environnement virtuel pour django1 et django2
conda create -n django1 python=3.6
conda create -n django2 python=3.6
Les autorisations du groupe IAM ressemblent à ce qui suit.
AmazonEC2FullAccess
AWSCodeCommitFullAccess
AWSLambdaFullAccess
AmazonS3FullAccess
AmazonDynamoDBFullAccess
AmazonSageMakerFullAccess
AmazonSageMaker-ExecutionPolicy-20191208Txxxxxx
AWSCloudFormationFullAccess
Générer des informations d'identification à partir des informations d'identification des utilisateurs IAM
(base) $ conda activate django1
(django1) $ git config --global user.email "[email protected]"
(django1) $ git config --global user.name "s-fujimoto"
(django1) $ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/helloworld
(django1) $ cd helloworld
(django1) $ git branch develop
(django1) $ git checkout develop
Switched to branch 'develop'
(django1) $ git branch feature
(django1) $ git checkout feature
Switched to branch 'feature'
Dix. Installez les bibliothèques requises pour votre projet
(django1) $ pip install -r requirements/dev.txt
Collecting Django==1.11.18
Using cached https://files.pythonhosted.org/packages/e0/eb/6dc122c6d0a82263bd26bebae3cdbafeb99a7281aa1dae57ca1f645a9872/Django-1.11.18-py2.py3-none-any.whl
Collecting pytz
Using cached https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl
Installing collected packages: pytz, Django
Successfully installed Django-1.11.18 pytz-2019.3
Django 1.11.18 est installé
(django1) $ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
December 23, 2019 - 18:15:46
Django version 1.11.18, using settings 'ec2django.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[23/Dec/2019 18:15:54] "GET / HTTP/1.1" 200 6652
[23/Dec/2019 18:15:54] "GET /static/helloworld/css/styles.css HTTP/1.1" 200 2690
[23/Dec/2019 18:15:54] "GET /static/helloworld/js/set-background.js HTTP/1.1" 200 137
[23/Dec/2019 18:15:54] "GET /static/helloworld/css/gradients.css HTTP/1.1" 200 2133
[23/Dec/2019 18:15:54] "GET /static/helloworld/img/tweet.svg HTTP/1.1" 200 1418
[23/Dec/2019 18:15:54] "GET /favicon.ico HTTP/1.1" 404 77
Si vous accédez à http://127.0.0.1:8000/ depuis votre navigateur et que vous voyez la même page, c'est OK.
Voir les changements de programme dans l'état de git
(django1) $ git status
On branch feature
Untracked files:
(use "git add <file>..." to include in what will be committed)
db.sqlite3
ec2django/__pycache__/
helloworld/__pycache__/
helloworld/migrations/__pycache__/
nothing added to commit but untracked files present (use "git add" to track)
Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
C extensions
*.so
Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
PyInstaller
Usually these files are written by a python script from a template
before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
Installer logs
pip-log.txt
pip-delete-this-directory.txt
Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
Translations
*.mo
*.pot
Django stuff:
*.log
local_settings.py
Flask stuff:
instance/
.webassets-cache
Scrapy stuff:
.scrapy
Sphinx documentation
docs/_build/
PyBuilder
target/
Jupyter Notebook
.ipynb_checkpoints
pyenv
.python-version
celery beat schedule file
celerybeat-schedule
SageMath parsed files
*.sage.py
dotenv
.env
virtualenv
.venv
venv/
ENV/
Spyder project settings
.spyderproject
.spyproject
Rope project settings
.ropeproject
mkdocs documentation
/site
mypy
.mypy_cache/
.idea/
db.sqlite3
migrations/
(django1) $ git add .
(django1) $ git commit -m "add .gitignore"
[feature 6d9a594] add .gitignore
1 file changed, 106 insertions(+)
create mode 100644 .gitignore
(django1) $ git push origin feature
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 939 bytes | 939.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/helloworld
* [new branch] feature -> feature
Si vous cochez CodeCommit, une branche de fonctionnalité a été créée
créer une branche de développement
Créer une pull request
Fusionner d'une fonctionnalité à un développement
Après la fusion, supprimez la fonction. (Mais lorsque vous ajoutez ou modifiez de nouvelles fonctionnalités, coupez la branche de fonctionnalité. La branche de fonctionnalité reste localement, utilisez-la telle quelle.)
vingt et un. Fusion réussie
vingt-deux. De même fusionner du développement au maître
vingt trois. Ne supprimez pas la branche de développement
vingt quatre. CodePipline démarre lorsqu'il est fusionné avec le maître
vingt cinq. Assurez-vous que la page est visible
(django1) $ conda deactivate
(base) $ conda activate django2
(django2) $
dependencies common to all environments
Django==1.11.18
Après le changement
dependencies common to all environments
Django==2.2.9
(django2) $ pip install -r requirements/dev.txt
Collecting Django==2.2.9
Using cached https://files.pythonhosted.org/packages/cb/c9/ef1e25bdd092749dae74c95c2707dff892fde36e4053c4a2354b2303be10/Django-2.2.9-py3-none-any.whl
Collecting pytz
Using cached https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl
Collecting sqlparse
Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Installing collected packages: pytz, sqlparse, Django
Successfully installed Django-2.2.9 pytz-2019.3 sqlparse-0.3.0
Django == 2.2.9 est installé
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
Après le changement
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
Quatre. Modifier ec2django / urls.py
Changer avant
from django.conf import settings
from django.conf.urls.static import static
from django.conf.urls import include, url
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('helloworld.urls')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Après le changement
from django.conf import settings
from django.conf.urls.static import static
from django.conf.urls import include, url
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('helloworld.urls')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Cinq. Déplacez helloworld / templates / index.html vers helloworld / templates / helloworld / index.html
6.helloworld/urls.py
Changer avant
helloworld/urls.py
from django.conf.urls import url
from django.conf.urls.static import static
from helloworld import views
urlpatterns = [
url(r'^$', views.HomePageView.as_view()),
]
Après le changement
helloworld/urls.py
from django.urls import path
from django.conf.urls import url
from django.conf.urls.static import static
from helloworld import views
urlpatterns = [
path('', views.HomePageView.as_view(), name='index'),
]
7.helloworld/views.py
Changer avant
helloworld/views.py
from django.shortcuts import render
from django.views.generic import TemplateView
Create your views here.
class HomePageView(TemplateView):
def get(self, request, **kwargs):
return render(request, 'index.html', context=None)
Après le changement
helloworld/views.py
from django.shortcuts import render
from django.views.generic import TemplateView
from django.views import generic
Create your views here.
class HomePageView(generic.TemplateView):
template_name = 'helloworld/index.html'
(django2) $ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
December 23, 2019 - 19:27:46
Django version 2.2.9, using settings 'ec2django.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[23/Dec/2019 19:27:49] "GET / HTTP/1.1" 200 6652
[23/Dec/2019 19:27:49] "GET /static/helloworld/js/set-background.js HTTP/1.1" 200 137
[23/Dec/2019 19:27:49] "GET /static/helloworld/css/gradients.css HTTP/1.1" 200 2133
[23/Dec/2019 19:27:49] "GET /static/helloworld/css/styles.css HTTP/1.1" 200 2690
[23/Dec/2019 19:27:49] "GET /static/helloworld/img/tweet.svg HTTP/1.1" 200 1418
(django2) $ git status
On branch feature
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ec2django/settings.py
modified: ec2django/urls.py
deleted: helloworld/templates/index.html
modified: helloworld/urls.py
modified: helloworld/views.py
modified: requirements/common.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
helloworld/templates/helloworld/
no changes added to commit (use "git add" and/or "git commit -a")
(django2) $ git add .
(django2) $ git commit -m "django1.11.18 -> django2.2.9"
[feature 2226d88] django1.11.18 -> django2.2.9
6 files changed, 12 insertions(+), 12 deletions(-)
rename helloworld/templates/{ => helloworld}/index.html (100%)
(django2) $ git push origin feature
Enumerating objects: 21, done.
Counting objects: 100% (21/21), done.
Delta compression using up to 8 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (11/11), 1.27 KiB | 648.00 KiB/s, done.
Total 11 (delta 5), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/helloworld
* [new branch] feature -> feature
Dix. Vérifiez la page lorsque CodePipline est terminé
Le site n'est plus accessible
Ouvrir EC2
Connexion SSH à EC2 à l'aide de TeraTerm (pour PuTTY, utilisez PuTTY gen pour convertir la paire de clés .pem en .ppk avant de vous connecter)
Cliquez sur Continuer pour l'alerte de sécurité
Lien
Lancer Django
[ec2-user@ip-172-31-14-214 ~]$ sudo su
[root@ip-172-31-14-214 ec2-user]# source /home/ec2-user/environment/bin/activate
(environment) [root@ip-172-31-14-214 ec2-user]# /usr/local/bin/supervisord -c /home/ec2-user/supervisord.conf
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
For help, use /usr/local/bin/supervisord -h
(environment) [root@ip-172-31-14-214 ec2-user]# pkill supervisord
(environment) [root@ip-172-31-14-214 ec2-user]# /usr/local/bin/supervisord -c /home/ec2-user/supervisord.conf
(environment) [root@ip-172-31-14-214 ec2-user]# cat /var/log/django-application-stderr.log
・ ・ ・
File "/home/ec2-user/environment/local/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 63, in check_sqlite_version
raise ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version)
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
[2019-12-23 19:54:59 +0900] [25438] [INFO] Worker exiting (pid: 25438)
[2019-12-23 10:54:59 +0000] [25435] [INFO] Shutting down: Master
[2019-12-23 10:54:59 +0000] [25435] [INFO] Reason: Worker failed to boot.
Depuis que j'ai mis à jour vers Django2, j'ai besoin de mettre à jour la version de SQLite3.
Reportez-vous à l'article suivant Que faire si une erreur SQLite3 se produit lors du démarrage du serveur de développement dans Django 2.2
(environment) [root@ip-172-31-14-214 ec2-user]# wget https://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz
(environment) [root@ip-172-31-14-214 ec2-user]# tar xvfz sqlite-autoconf-3280000.tar.gz
(environment) [root@ip-172-31-14-214 ec2-user]# cd sqlite-autoconf-3280000
(environment) [root@ip-172-31-14-214 ec2-user]# ./configure --prefix=/usr/local
(environment) [root@ip-172-31-14-214 ec2-user]# make
(environment) [root@ip-172-31-14-214 ec2-user]# sudo make install
(environment) [root@ip-172-31-14-214 ec2-user]# sudo find /usr/ -name sqlite3
(environment) [root@ip-172-31-14-214 ec2-user]# cd ../
(environment) [root@ip-172-31-14-214 ec2-user]# rm sqlite-autoconf-3280000.tar.gz
(environment) [root@ip-172-31-14-214 ec2-user]# rm -rf ./sqlite-autoconf-3280000
(environment) [root@ip-172-31-14-214 ec2-user]# /usr/local/bin/sqlite3 --version
3.28.0 2019-04-16 19:49:53 884b4b7e502b4e991677b53971277adfaf0a04a284f8e483e2553d0f83156b50
(environment) [root@ip-172-31-14-214 ec2-user]# /usr/bin/sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
(environment) [root@ip-172-31-14-214 ec2-user]# sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
(environment) [root@ip-172-31-14-214 ec2-user]# sudo mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
(environment) [root@ip-172-31-14-214 ec2-user]# sudo ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
(environment) [root@ip-172-31-14-214 ec2-user]# export LD_LIBRARY_PATH="/usr/local/lib"
(environment) [root@ip-172-31-14-214 ec2-user]# python
Python 3.6.8 (default, Oct 14 2019, 21:22:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.28.0'
>>> exit()
(environment) [root@ip-172-31-14-214 ec2-user]#
OK si vous démarrez Django et voyez la page
(environment) [root@ip-172-31-14-214 ec2-user]# pkill supervisord
(environment) [root@ip-172-31-14-214 ec2-user]# /usr/local/bin/supervisord -c /home/ec2-user/supervisord.conf
[program:djangoproject]
command = environment/bin/gunicorn -b 0.0.0.0:80 ec2django.wsgi
Après le changement
[program:djangoproject]
command = /home/ec2-user/environment/bin/gunicorn -b 0.0.0.0:80 ec2django.wsgi
(environment) [root@ip-172-31-14-214 ec2-user]# vi /etc/init.d/helloworld
!/bin/sh
chkconfig: 2345 99 10
description: start helloworld
processname: helloworld
start() {
echo "start"
source /home/ec2-user/environment/bin/activate
export LD_LIBRARY_PATH="/usr/local/lib"
/usr/local/bin/supervisord -c /home/ec2-user/supervisord.conf
}
stop() {
echo "stop"
pkill supervisord
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
esac
exit 0
(environment) [root@ip-172-31-14-214 ec2-user]# chkconfig --add helloworld
(environment) [root@ip-172-31-14-214 ec2-user]# chkconfig helloworld on
(environment) [root@ip-172-31-14-214 ec2-user]# chmod u+x /etc/init.d/helloworld
(environment) [root@ip-172-31-14-214 ec2-user]# service helloworld restart
(environment) [root@ip-172-31-14-214 ec2-user]# sudo reboot
Quatre. Modifier supervisord.conf de la fonctionnalité et valider, fusionner la fonctionnalité pour développer, fusionner du développement au maître
(django2) $ git status
On branch feature
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: supervisord.conf
no changes added to commit (use "git add" and/or "git commit -a")
(django2) $ git add .
(django2) D:\Users\s-fujimoto\CodeStar\helloworld>git commit -m "modified supervisord.conf"
[feature 38c0e8c] modified supervisord.conf
1 file changed, 1 insertion(+), 1 deletion(-)
(django2) D:\Users\s-fujimoto\CodeStar\helloworld>git push origin feature
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 325 bytes | 325.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/helloworld
* [new branch] feature -> feature
Cinq. OK si CodePipline est complet et que vous pouvez voir la page
(6. Si vous ne pouvez pas le voir, redémarrez EC2 ou connectez-vous avec SSH pour vérifier le journal et redémarrer le service)
(environment) [root@ip-172-31-14-214 ec2-user]# cat /var/log/django-application-stderr.log
(environment) [root@ip-172-31-14-214 ec2-user]# cat /var/log/django-application-stdout.log
(environment) [root@ip-172-31-14-214 ec2-user]# service helloworld restart
Si vous oubliez le paramètre .gitignore et que vous fusionnez, vous serez fâché que pycache soit déjà là et le déploiement échouera.
Le déploiement a échoué lors de la fusion alors qu'EC2 était arrêté. Même si EC2 est démarré après l'échec et qu'il est retenté, il échoue.
Même si vous réessayez à partir de l'état où le déploiement a échoué une fois, il échouera à nouveau. Donc, si vous forcez le déploiement, puis fusionnez dans master, cela réussira.
db.sqlite3 est .gitignore, alors envoyez-le avec Tera Term Méthode de connexion AWS EC2 (système Linux) et méthode de transfert de fichiers
La base de données doit être mise à jour
python manage.py makemigrations helloworld
python manage.py migrate
Je pense que le développement d'applications Django est devenu beaucoup plus facile. CICD Bonne chance.
Recommended Posts