ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.