Django project 설정 복습

  • 프로젝트 만들기
  • 가상 환경 만들기
  • 데이터베이스 설정하기
  • S3 파일서버 설정하기
  • S3에 도메인 연결하기
  1. PyCharm을 실행하여 새로운 프로젝트를 생성한다.

    • “sample_project”로 생성
    • django 설치

      1
      $ pip install django
    • django 프로젝트 생성

      1
      $ django-admin startproject config .
    • 의존성 리스트 생성

      1
      $ pip freeze > requirements.txt
  2. 가상 환경을 만든다.

    • 프로젝트 생성 시, 가상환경을 자동으로 생성해준다.
    • 자동으로 생성되지 않았을 때를 가정한다.
    • 가상 환경 생성

      1
      $ python3 -m virtualenv venv
    • 가상 환경 활성화

      1
      2
      3
      4
      $ source venv/bin/activate

      # 가상 환경 비활성화
      $ deactivate
    • 의존성 리스트를 이용한 패키지 설치

      1
      $ pip install -r requirements.txt
    • 소스에서 모듈 명령어에 빨간줄이 있다면 File/Settings/Project:[현재 프로젝트]/Project Interpreter로 이동

    • 오른쪽 끝 톱니바퀴 버튼을 누름
    • Show All을 선택하고 “+”를 눌러서 Virtualenv Environment/Existing environment 선택
      • 자동으로 현재 프로젝트 폴더에 있는 가상 환경을 찾아줌
    • 추가된 가상 환경을 선택하고 OK 버튼을 누름
    • 선택한 인터프리터 이름과 설치된 모듈 목록들이 올바른지 확인
  3. 데이터베이스를 설정한다.

    • 아마존 AWS 홈페이지로 접속해 [콘솔에 로그인]한다.
    • [서비스] 메뉴에서 데이터베이스/RDS를 누른다.
    • RDS에서 데이터베이스 생성을 누른다.
      • PostgreSQL 선택 및 화면 하단의 RDS 프리티어에 적용되는 옵션만 사용에 체크
      • DB 엔진 버전은 PostgreSQL 10.6-R1 선택
      • DB 인스턴스 식별자와 사용자 계정 설정
        • 마스터 사용자 이름은 추후 확인할 방법이 없으므로 꼭 기억해야함
      • 퍼블릭 엑세스 가능성은 [예]로 선택
        • 실습 환경에서는 [예]를 선택하고, 프로덕션 환경에서는 꼭 [아니오]로 변경
      • 데이터베이스 이름 설정 및 백업 보존 기간 0일 설정
        • 실습 환경에서는 백업 비용을 없애기 위해 0일로 설정
        • 대부분의 경우 1~2일 정도를 보관
      • 실수로 인스턴스가 삭제되는 것을 막기 위해 삭제 방지 활성화 체크
      • 데이터베이스 생성
    • DB 인스턴스 세부 정보 보기/VPC 보안 그룹으로 이동하여 인바운드를 설정한다.
      • 인바운드 : 외부에서 들어오는 접속에 대한 설정
      • 아웃바운드 - 해당 인스턴스가 외부 어디에 접근할 수 있는지에 대한 설정
      • 인바운드에서 편집/규칙 추가하여 포트 번호 입력 및 위치 무관 선택 후 저장
        • 프로덕션 환경에서는 절대 위치 무관을 선택해서는 안된다.
        • 네트워크는 폐쇄적일수록 안전하다.
    • PyCharm 프로젝트에서 settings.py에 DATABASE 항목을 수정한다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      # Database
      # https://docs.djangoproject.com/en/2.2/ref/settings/#databases
      # backends는 장고와 데이터베이스 어답터 사이를 연결해주는 역할
      # psycopg2-binary : 어답터 - 드라이버 -> 실제로 데이터베이스에 접속해서 명령을 수행하는 모듈

      DATABASES = {
      'default': {
      'ENGINE': 'django.db.backends.postgresql_psycopg2',
      'NAME': '데이터베이스 이름',
      'USER':'마스터 사용자 이름',
      'PASSWORD':'마스터 사용자 비밀번호',
      'HOST':'아마존 RDS의 엔드포인트',
      'POST':'데이터베이스 접속 포트번호',
      },
      }
      # web service에서 가장 병목이 데이터베이스. 데이터베이스에서 가장 시간을 많이 사용한다.
    • 어답터 모듈 설치

      1
      $ pip install psycopg2-binary
    • 데이터베이스 초기화

      1
      $ python manage.py migrate
    • 관리자 계정 생성

      1
      $ python manage.py createsuperuser
  4. S3 파일서버를 설정한다.

    • 아마존 AWS 홈페이지에서 [서비스] 메뉴에서 스토리지/S3를 누른다.
    • S3에서 버킷 만들기를 누른다.

      • 버킷 이름을 입력하는데 도메인과 연결할 것이기 때문에 다음과 같이 설정한다.

        1
        2
        3
        [저장할 대상 이름].[프로젝트 이름].[도메인 이름]
        ex) static.sample.jinukk.me
        ex) media.sample.jinukk.me
      • 리전은 [아시아 태평양(서울)] 선택

      • 퍼블릭 엑세스 차단 부분에서는 모든 퍼블릭 엑세스 차단의 체크를 해제
        • 클라이언트가 S3에 직접 접속해 파일을 받아가도록 할 것이기 때문
        • 퍼블릭 엑세스가 가능한 상태이어야 함
      • 버킷을 만들고 생성된 버킷 확인
    • django 프로젝트에서 S3를 이용하려면 아마존 사용 권한이 있어야 함
      • [서비스] 메뉴에서 보안, 자격 증명 및 규정 준수/IAM을 누른다.
      • 왼쪽 사용자 메뉴에서 사용자 추가를 눌러서 사용자 이름을 입력한다.
      • AWS 액세스 유형은 프로그래밍 방식 액세스를 선택한다.
      • 권한 설정 부분에서는 그룹 생성을 누른 후, 그룹 이름을 입력한다.
      • 정책 필더에는 AmazonS3FullAccess를 검색하여 체크하고 그룹을 생성한다.
      • 태그와 검토 부분은 생략하고 사용자 만든다.
      • 사용자 추가가 끝난 뒤 나오는 액세스 키는 다시 확인할 수 없다.
        • 반드시 [.csv 다운로드]를 눌러서 액세스 키를 다운받아 놓는다.
    • PyCharm 프로젝트에서 settings.py에 설정을 추가한다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      AWS_ACCESS_KEY_ID = '아마존 AWS 액세스 키'
      AWS_SECRET_ACCESS_KEY = '아마존 AWS 비밀 액세스 키'

      AWS_REGION = 'ap-northeast-2'
      AWS_STORAGE_BUCKET_NAME = 'static.sample.jinukk.me'

      AWS_S3_CUSTOM_DOMAIN = 's3.%s.amazonaws.com/%s' % (AWS_REGION, AWS_STORAGE_BUCKET_NAME)

      AWS_S3_FILE_OVERWRITE = False
      # True일 경우 같은 파일을 올렸을 때 덮어씌워진다.
      # False를 하면 같은 파일이 올라와도 덮어씌워지지 않게 파일 이름을 자동으로 바꿔줌

      # 브라우저가 해당 파일에 접속 했을 때 나타나는 파라미터 값
      AWS_S3_OBJECT_PARAMETERS = {
      'CacheControl': 'max-age=86400',
      }

      # 지금올리는 파일의 권한을 지정해줌
      AWS_DEFAULT_ACL = 'public-read'

      AWS_LOCATION = ''

      STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
      STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
      # S3Boto와 S3Boto3는 지금 같이 사용할 수 있지만 S3Boto는 곧 사라지기 떄문에 S3Boto3를 사용
      # 쓰던 방식을 계속 쓰는 것이 문제 - 의존성 패키지 목록 관리
      # Django 1.8이 LTS
      # Django 2.2 -> LTS -> Long Tern Service
      # 로거를 사용해서 로그를 s3에 있는 파일에 업로드
    • 장고 프로젝트에서 S3를 사용하기 위해 모듈 설치

      1
      2
      3
      $ pip install django-storages

      $ pip install boto3
    • 프로젝트에 포함된 스테틱 파일들을 S3에 업로드

      1
      $ python manage.py collectstatic
    • AWS 홈페이지의 S3에서 static 파일이 업로드되었는지 해당 버킷에서 확인

    • 미디어 파일도 설정하기 위해 settings.py에 설정 추가

      1
      2
      3
      # storages.backends.s3boto3.S3Boto3Storage를 사용할 수 있지만
      # static 파일과 같은 경로에서 관리되기 때문에 미디어 파일을 별도로 분리하고 싶다면 스토리지 모듈을 별도로 상속받아 변경한다.
      DEFAULT_FILE_STORAGE = 'config.s3media.MediaStorage'
    • config/s3media.py를 생성

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      from storages.backends.s3boto3 import S3Boto3Storage

      # 기본 설정값을 오버라이드 하기 위해서 S3Boto3Storage를 상속한다.
      class MediaStorage(S3Boto3Storage):
      # 업로드될 버킷
      bucket_name = 'media.sample.jinukk.me'

      # 업로드될 버킷 하위의 폴더이름
      location = ''

      # 버킷이 존재하는 리전
      region_name = 'ap-northeast-2'

      # 실제로 파일에 접속할 때 사용할 주소
      # 직접 파일을 올려보고 주소를 확인하자.
      custom_domain = 'https://%s/%s/' % (region_name, bucket_name)
      file_overwrite = False
    • 미디어 파일 테스트를 위해 간단한 모델을 만들고 관리자 페이지에서 이미지 업로드

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      # models.py
      from django.db import models

      class Sample(models.Model):
      image = models.ImageField(upload_to='sample/%Y/%m/%d', blank=True)



      # admin.py
      from django.contrib import admin

      # Register your models here.
      from .models import Sample

      admin.site.register(Sample)
    • 관리자 페이지에서 이미지를 업로드해보고 AWS에서 해당 버킷에 업로드되었는지 확인

  5. S3에 도메인을 연결한다.

    • 파일 주소에 S3임이 노출되기 때문에 도메인을 연결하여 사용한다.
    • 반드시 버킷 이름과 도메인이 동일해야 한다.
    • 버킷을 처음 만들 때부터 도메인을 염두에 두고 만들자.
    • [서비스] 메뉴에서 스토리지/S3로 이동하여 설정할 버킷 이름을 누른다.
      • 속성 탭을 클릭하여 정적 웹 사이트 호스팅을 활성화 상태로 변경한다.
      • [이 버킷을 사용하여 웹 사이트를 호스팅합니다.]를 누름
      • index.html과 error.html을 입력하고 저장을 누름
      • 버킷 호스팅이 활성화되었는지 확인
    • [서비스] 메뉴에서 네트워크 및 콘텐츠 전송/Route 53으로 이동한다.
      • DNS 관리에서 호스팅 영역을 누른다.
      • S3에서 사용할 도메인을 누르고 레코드 세트 생성을 누른다.
      • 레코드 세트 생성 창에서 S3 버킷과 동일한 이름으로 설정한다.
      • 유형은 [A - IPv4] 주소를 선택한다.
      • 별칭은 [예]를 선택하고 별칭 대상 목록에 나타난 S3 버킷을 선택하고 생성한다.
        • static과 media 모두 생성하도록 한다.
      • 레코드 목록에 잘 나타나는지 확인한다.
    • PyCharm 프로젝트에서 settings.py에 설정을 변경한다.

      • 주소 자체가 버킷 이름과 같아지기 때문에 버킷 이름을 변경한다.
      • S3 단독으로는 https를 사용할 수 없기 때문에 http로 변강하는 설정값을 추가한다.
        1
        2
        3
        AWS_S3_CUSTOM_DOMAIN = AWS_STORAGE_BUCKET_NAME
        # https가 아니라 http로 주소를 노출하기 위해 사용
        AWS_S3_SECURE_URLS = False
    • config/s3media.py도 수정

      1
      custom_domain = bucket_name
    • 이미지 주소를 입력하여 잘 나오는지 확인

Share