-
Django, AWS 배포 (Deploy)Django 2024. 9. 6. 04:41
Django, AWS 배포 (Deploy)
지금까지는 테스트서버에서만 확인해본거니까 이제 배포를 해보자👀
AWS 계정 생성 (https://aws.amazon.com/ko/)
- 기본적으로 여러 자원에 대해 프리티어를 제공하여 정해진 사용량까지 무료로 체험 가능하다. (가입부터 해야함)
- 이후로는 자동으로 과금이 들어가기 때문에 사용하지 않을거라면 자원을 해지해야 한다.
가입시 해외 결제가 가능한 카드 필요하다.(체크 or 신용), 100원의 테스트 결제 후 바로 취소된다.
어려운 건 1도 없는데 주소 입력하고 카드번호 입력하고... 너무 귀찮..드디어 성공😊 → AWS Management Console로 이동
AWS EC2 인스턴스 생성
국가 서을로 바꿔주기
검색에 ec2 적고 ★ 즐겨찾기! (가운데 빈 별을 누르면 이렇게 가득찬 별이 되고 즐겨찾기 된다)
EC2 클릭하고 → 아래 Launch instance 클릭
여기 이름 지정해주고, 원하는 사양을 커스텀할 수 있다.(IaaS방식) 우리가 사용할 서버는 Ubuntu 22.04, 타입은 t2.micro
📌 키페어 는 내 EC2 인스턴스에 접근할 수 있는 일종의 암호키이다. 키페어를 공유하거나 잃어버리지 않도록 주의해야 한다.
생성하면서 우리한테 키페어 .pem 파일🗝️ 을 던져주는데 이따가 필요하니까 그것도 잘 저장해두어야 한다.
나머지는 모두 기본값으로 두고, Launch Instance 클릭
잘 됐고👌
생성된 인스턴스를 한번 확인해볼까? 🤔
휴.. 영어공부 할겸 다 영어로 보려고 했더니.. 넘 헷갈림.. 다시 한글로 바꿈🫠....ㅠㅠ 언어 설정은 좌상단 톱니바퀴 Language에 있음
AWS EC2 인스턴스 접속
macOS
- 터미널 or iTerm 이용해서 접속하면 된다.
- 일단, 아까 저장하라고 했던 키페어 파일 .pem 파일🗝️ 의 경로를 복사해야 한다. (파일을 클릭하고 cmd + option + c)
- 그리고, 퍼블릭 DNS 주소는 AWS 서버에서 복사해오면 된다.
- ssh -i [키 페어 파일 경로] [유저 이름]@[퍼블릭 DNS 주소]
ssh -i ~~/~~.pem ubuntu@ec2~~~~~.amazonaws.com
최초 연결시 yes 입력 후 진행
만약 Unprotected Private Key File 경고가 뜬다면? 🤔
파일에 대한 권한을 조정하는 명령어로 소유자에 대해 읽기 권한만 허용해주기
chmod 400 {.pem 키페어 파일 경로}
터미널에서 이렇게 보이면 AWS에서 임대한 EC2 인스턴스에 잘 접속된거다👍
Github에 내 코드올리기
우리는 지금 아마존 웹 서버에 우리 코드를 배포하려는 거다. 즉, 내 컴퓨터가 아니라 임대한 컴퓨터(EC2)에 우리 코드를 옮겨야 하기 때문에 다음 할 일은 깃 레포지토리를 생성해서 push하는거다.
1. requirements.txt 최신 버전으로 다시 한 번 freeze !
2. .gitignore 꼭 잘 설정하기 !이거 일단 복붙에서 .gitignore 파일에 넣어주자. 필요하면 추가로 넣어주면 됨
📌 config.py 올리면 안됨 !
📌 가상 환경 폴더도 꼭 제외 ! (venv , .venv 등)
# Created by https://www.toptal.com/developers/gitignore/api/windows,macos,python,venv,visualstudiocode,django,pycharm # Edit at https://www.toptal.com/developers/gitignore?templates=windows,macos,python,venv,visualstudiocode,django,pycharm ### Custom ### config.py ### Django ### *.log *.pot *.pyc __pycache__/ local_settings.py db.sqlite3 db.sqlite3-journal media # If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ # in your Git repository. Update and uncomment the following line accordingly. # <django-project-name>/staticfiles/ ### Django.Python Stack ### # Byte-compiled / optimized / DLL files *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # 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/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ cover/ # Translations *.mo # Django stuff: # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder .pybuilder/ target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv # For a library or package, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: # .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # poetry # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. # This is especially recommended for binary packages to ensure reproducibility, and is more # commonly ignored for libraries. # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control #poetry.lock # pdm # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. #pdm.lock # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it # in version control. # https://pdm.fming.dev/#use-with-ide .pdm.toml # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # pytype static type analyzer .pytype/ # Cython debug symbols cython_debug/ # PyCharm # JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ ### macOS ### # General .DS_Store .AppleDouble .LSOverride # Icon must end with two \r Icon # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk ### macOS Patch ### # iCloud generated files *.icloud ### PyCharm ### # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml .idea/**/dictionaries .idea/**/shelf # AWS User-specific .idea/**/aws.xml # Generated files .idea/**/contentModel.xml # Sensitive or high-churn files .idea/**/dataSources/ .idea/**/dataSources.ids .idea/**/dataSources.local.xml .idea/**/sqlDataSources.xml .idea/**/dynamic.xml .idea/**/uiDesigner.xml .idea/**/dbnavigator.xml # Gradle .idea/**/gradle.xml .idea/**/libraries # Gradle and Maven with auto-import # When using Gradle or Maven with auto-import, you should exclude module files, # since they will be recreated, and may cause churn. Uncomment if using # auto-import. # .idea/artifacts # .idea/compiler.xml # .idea/jarRepositories.xml # .idea/modules.xml # .idea/*.iml # .idea/modules # *.iml # *.ipr # CMake cmake-build-*/ # Mongo Explorer plugin .idea/**/mongoSettings.xml # File-based project format *.iws # IntelliJ out/ # mpeltonen/sbt-idea plugin .idea_modules/ # JIRA plugin atlassian-ide-plugin.xml # Cursive Clojure plugin .idea/replstate.xml # SonarLint plugin .idea/sonarlint/ # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties # Editor-based Rest Client .idea/httpRequests # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser ### PyCharm Patch ### # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 # *.iml # modules.xml # .idea/misc.xml # *.ipr # Sonarlint plugin # https://plugins.jetbrains.com/plugin/7973-sonarlint .idea/**/sonarlint/ # SonarQube Plugin # https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin .idea/**/sonarIssues.xml # Markdown Navigator plugin # https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced .idea/**/markdown-navigator.xml .idea/**/markdown-navigator-enh.xml .idea/**/markdown-navigator/ # Cache file creation bug # See https://youtrack.jetbrains.com/issue/JBR-2257 .idea/$CACHE_FILE$ # CodeStream plugin # https://plugins.jetbrains.com/plugin/12206-codestream .idea/codestream.xml # Azure Toolkit for IntelliJ plugin # https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij .idea/**/azureSettings.xml ### Python ### # Byte-compiled / optimized / DLL files # C extensions # Distribution / packaging # 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. # Installer logs # Unit test / coverage reports # Translations # Django stuff: # Flask stuff: # Scrapy stuff: # Sphinx documentation # PyBuilder # Jupyter Notebook # IPython # pyenv # For a library or package, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: # .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. # poetry # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. # This is especially recommended for binary packages to ensure reproducibility, and is more # commonly ignored for libraries. # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control # pdm # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it # in version control. # https://pdm.fming.dev/#use-with-ide # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm # Celery stuff # SageMath parsed files # Environments # Spyder project settings # Rope project settings # mkdocs documentation # mypy # Pyre type checker # pytype static type analyzer # Cython debug symbols # PyCharm # JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. ### Python Patch ### # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration poetry.toml # ruff .ruff_cache/ # LSP config files pyrightconfig.json ### venv ### # Virtualenv # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ [Bb]in [Ii]nclude [Ll]ib [Ll]ib64 [Ll]ocal [Ss]cripts pyvenv.cfg pip-selfcheck.json ### VisualStudioCode ### .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json !.vscode/*.code-snippets # Local History for Visual Studio Code .history/ # Built Visual Studio Code Extensions *.vsix ### VisualStudioCode Patch ### # Ignore all local history of files .history .ionide ### Windows ### # Windows thumbnail cache files Thumbs.db Thumbs.db:encryptable ehthumbs.db ehthumbs_vista.db # Dump file *.stackdump # Folder config file [Dd]esktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Windows Installer files *.cab *.msi *.msix *.msm *.msp # Windows shortcuts *.lnk # End of https://www.toptal.com/developers/gitignore/api/windows,macos,python,venv,visualstudiocode,django,pycharm
AWS EC2 기본 설정
지금 EC2는 새 컴퓨터와 다름없다. IaaS이므로 우리는 인프라를 서비스 받고 있다... 예? 😔
암튼 지금 아무것도 없어서 모든 설정을 직접 해줘야 한다.
기본 프로그램 설치 및 설정
sudo apt-get update # 패키지 정보 업데이트
패키지 정보를 업데이트 해주고
python3 install
sudo apt-get install python3-pip
Tab 하면 OK로 이동한다 → Enter
python과 pip 설치 완료!
Code Clone 및 패키지 설치하기
EC2에서 Clone 받기
git clone {repository 주소}
패키지 설치하기
- Django 프로젝트를 실행하기 위해서는 다양한 패키지가 필요하다.
- 우리에게 필요한 패키지는 requirements.txt 안에 버전과 함께 모두 명시되어 있다.
sudo apt-get install build-essential libpq-dev -y
↑ requirements 설치시 필요할 수 있는 시스템 패키지 사전 설치 (중간에 나오는 창은 모두 OK로 진행하면 된다.👌)
pip install -r requirements.txt
↑ requirements를 참고하며 모든 패키지를 버전에 맞게 설치해준다.
다 해줬으니까 일단 Django 프로젝트를 실행해보자
python3 manage.py runserver
에러메시지를 보면, apt_pjt에서 config를 import할 수 없다고 하는데 당연하다. config를 .gitignore에 숨겼기 때문이다.
직접 필요한 파일을 만들어서 설정해주자.
1. 홈 디렉토리에 config.py 파일 생성
cd ~
touch config.py
2. vi를 사용해서 편집
-
- vi 는 Shell 환경해서 문서를 편집하는 도구로 간단하게 입력 및 수정을 할 수 있다.
vi config.py
↑ vi 편집기로 config.py 열기
i 를 입력하면 INSERT 모드가 되고 이제 파일을 편집할 수 있음
원래의 config 파일에서 복사 후 붙여넣기
esc 눌러서 편집모드 종료
:wq 를 입력해서 저장 후 종료
작성한 config.py 파일 옮기기
- 지금 위치에 config.py 파일이 있으면 Django는 실행할 수 없다.
- 우리가 원래 원하는 위치인 api_pjt/config.py 로 옮겨주어야한다. 지금은 각 repository 폴더가 있으니까 (위의 경우 edu-django-test)
edu-django-test/api_pjt/config.py 이렇게 되어야한다.
cd ~ # 홈 위치에서
cp config.py edu-django-test/api_pjt # config.py 파일을 원하는 위치로 복사
이렇게 되면 config.py가 잘 복사되었다.
다시 실행해보면🤔
python3 manage.py runserver
잘 된다👌
근데 현재 db.sqlite3 파일이 .gitignore에 의해 제외되고 있어서 migration 파일은 있지만 DB에 반영은 언됐다.
migration 해주자.
python3 manage.py migrate
★★ makemigrations 명령은 배포 인스턴스에서 하지 않는다. 필요할 경우 로컬에서 모두 작업해서 migration 파일을 생성한 뒤, 해당 변경 사항을 받아와서 적용해야 한다.
superuser 하나 생성해주자
python3 manage.py createsuperuser
📌 포트 개방하고 접속해보기
python3 manage.py runserver 0:8000
- 0 : 이 서버에 접속 할 수 있도록 함
- 8000 : 8000번 포트로 접속을 허용
🤔 그리고나서 EC2 IP 주소를 이용해서 접속해보면?
각자의 AWS 인스턴스 퍼블릭 IPv4 주소 복사해서 :8000 붙여서 연결해보면
안 되는 이유는 EC2에서 8000번 포트로의 접속을 허용해주지 않았기 때문이다. 포트 열어주러 가보자👌
포트 열어주기
- EC2 인스턴스 아래의 보안 → 보안 그룹 → 인바운드 규칙 편집
- 인바운드: EC2 인스턴스로 들어오는 규칙
- 아웃바운드: EC2에서 밖으로 나가는 규칙
이렇게 규칙을 편집헤서 8000번 포트를 추가해서 저장한 다음에 다시 접속해보면? 🤔
아..
settings.py의 allowd_hosts 항목에 EC2 IP 주소를 적어줘야 한다🫠
지침..
ALLOWED_HOSTS 설정하고 재배포 하기
- Django는 프로젝트가 실행되는 호스트를 등록하는 보안기능을 제공한다.
settings.py 에 내 EC2 IP를 복붙해서 넣어준다.
코드 수정했으니까, 다시 push를 하고, EC2로 가서 다시 pull을 받는다.
다시 접속해보면?
python3 manage.py runserver 0:8000
실제로 배포가 된 걸 알 수 있다.
휴...
나머지는... 내일 정리하겠음😶🌫️
'Django' 카테고리의 다른 글
[Django] API 문서화 (2) 2024.09.10 [Django] AWS 배포 → Gunicorn, Nginx 설치 및 설정 (2) 2024.09.08 Django 외부 API 연동하기 (1) 2024.09.05 Token Auth with JWT (1) 2024.09.03 Python Django 기초 시험 오답노트 (1) 2024.09.02