App Engine 표준 환경에서 Django 실행

App Engine 표준 환경에서 실행되는 Django 앱은 트래픽에 따라 동적으로 확장됩니다.

이 가이드에서는 사용자가 Django 웹 개발에 익숙하다고 가정합니다. Django 개발이 처음이면 계속하기 전에 첫 번째 Django 앱 작성 연습을 진행하는 것이 좋습니다. 이 가이드에서 앱 모델은 질문이 포함된 설문조사를 나타내고, Django 관리 콘솔을 사용해서 모델과 상호작용할 수 있습니다.

이 가이드에는 Python 3.7이 필요합니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Cloud SQL Admin API를 사용 설정합니다.

    API 사용 설정

  5. Cloud SDK 설치 및 초기화

gcloud에 로그인

Cloud SQL Admin API를 사용하기 위해 새 사용자 인증 정보를 얻습니다.

gcloud auth application-default login

앱 다운로드 및 실행

기본 요건을 완료한 후 Django 샘플 앱을 다운로드하고 배포합니다. 다음 섹션에서는 앱 구성, 실행, 배포를 안내합니다.

Django 앱 복제

Django 샘플 앱용 코드는 GitHub의 GoogleCloudPlatform/python-docs-samples 저장소에 있습니다.

  1. ZIP 파일로 샘플을 다운로드하고 이를 추출하거나 저장소를 로컬 머신에 클론할 수 있습니다.

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

  2. 샘플 코드가 있는 디렉토리로 이동합니다.

Linux/macOS

  cd python-docs-samples/appengine/standard_python3/django

Windows

  cd python-docs-samples\appengine\standard_python3\django

로컬 환경 설정

배포된 앱은 App Engine 환경에 기본 제공되는 Cloud SQL 프록시를 사용하여 Cloud SQL 인스턴스와 통신합니다. 하지만 앱을 로컬에서 테스트하려면 프록시의 로컬 사본을 개발 환경에 설치하여 사용해야 합니다.

Cloud SQL 프록시 자세히 알아보기

Cloud SQL 인스턴스에서 기본 관리 작업을 수행하려면 PostgreSQL 클라이언트를 사용하면 됩니다.

Cloud SQL 프록시 설치

Cloud SQL 프록시를 다운로드하고 설치합니다. Cloud SQL 프록시는 로컬에서 실행되는 Cloud SQL 인스턴스에 연결됩니다.

Linux 64비트

  1. Cloud SQL 인증 프록시를 다운로드합니다.
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. Cloud SQL 인증 프록시 실행 파일을 만듭니다.
    chmod +x cloud_sql_proxy
    

Linux 32비트

  1. Cloud SQL 인증 프록시를 다운로드합니다.
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. Cloud SQL 인증 프록시 실행 파일을 만듭니다.
    chmod +x cloud_sql_proxy
    

macOS 64비트

  1. Cloud SQL 인증 프록시를 다운로드합니다.
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. Cloud SQL 인증 프록시 실행 파일을 만듭니다.
    chmod +x cloud_sql_proxy
    

macOS 32비트

  1. Cloud SQL 인증 프록시를 다운로드합니다.
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. Cloud SQL 인증 프록시 실행 파일을 만듭니다.
    chmod +x cloud_sql_proxy
    

Windows 64비트

https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe를 마우스 오른쪽 버튼으로 클릭하고 다른 이름으로 링크 저장을 선택하여 Cloud SQL 인증 프록시를 다운로드합니다. 파일 이름을 cloud_sql_proxy.exe로 바꿉니다.

Windows 32비트

https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe를 마우스 오른쪽 버튼으로 클릭하고 다른 이름으로 링크 저장을 선택하여 Cloud SQL 인증 프록시를 다운로드합니다. 파일 이름을 cloud_sql_proxy.exe로 바꿉니다.

Cloud SQL 인증 프록시 Docker 이미지

편의를 위해 Cloud SQL팀은 고객이 사용할 Cloud SQL 인증 프록시가 포함된 컨테이너 이미지 여러 개를 유지보수합니다. 이러한 이미지에 대한 자세한 내용은 GitHub의 Cloud SQL 인증 프록시 저장소를 참조하세요. 다음 명령어로 Docker를 사용하여 최신 이미지를 로컬 머신으로 가져올 수 있습니다.
docker pull gcr.io/cloudsql-docker/gce-proxy:1.19.1

기타 OS

여기에 포함되지 않은 다른 운영체제의 경우 소스에서 Cloud SQL 인증 프록시를 컴파일하면 됩니다.

Cloud SQL 인스턴스 만들기

  1. MySQL 2세대용 Cloud SQL 인스턴스를 만듭니다.

    인스턴스 이름을 polls-instance 또는 유사하게 지정합니다. 인스턴스가 준비되는 데 몇 분 정도 걸릴 수 있습니다. 인스턴스가 준비되면 인스턴스 목록에 표시됩니다.

  2. Cloud SDK를 사용하여 다음 명령어를 실행합니다. 여기서 [YOUR_INSTANCE_NAME]은 Cloud SQL 인스턴스 이름을 나타냅니다.
    gcloud sql instances describe [YOUR_INSTANCE_NAME]

    표시되는 [CONNECTION_NAME] 값을 기록해 둡니다.

    [CONNECTION_NAME] 값의 형식은 [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME]과 같습니다.

Cloud SQL 인스턴스 초기화

  1. 이전 단계의 [CONNECTION_NAME] 값을 사용하여 Cloud SQL 프록시를 시작합니다.

    Linux/macOS

    ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

    Windows

    cloud_sql_proxy.exe -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

    [YOUR_INSTANCE_CONNECTION_NAME]을 이전 단계에서 기록한 [CONNECTION_NAME] 값으로 바꿉니다.

    이 단계에서는 로컬 테스트를 위해 로컬 컴퓨터에서 Cloud SQL 인스턴스로 연결을 설정합니다. 앱을 로컬에서 테스트하는 동안 Cloud SQL 프록시를 계속 실행합니다.

  2. Cloud SQL 사용자 및 데이터베이스를 만듭니다.

    Cloud Console

    1. Cloud SQL 인스턴스 polls-instanceCloud Console을 사용하여 새 데이터베이스를 만듭니다. 예를 들어 polls라는 이름을 사용할 수 있습니다.
    2. Cloud SQL 인스턴스 polls-instance에 대해 Cloud Console을 사용하여 새 사용자를 만듭니다.

    MySQL 클라이언트

    1. 별도의 명령줄 탭에서 MySQL 클라이언트 또는 비슷한 프로그램을 사용하여 인스턴스에 연결합니다. 메시지가 표시되면 구성된 루트 비밀번호를 사용합니다.
      mysql --host 127.0.0.1 --user root --password
    2. 다음 명령어를 사용하여 Cloud SQL 데이터베이스에서 필수 데이터베이스, 사용자, 액세스 권한을 만듭니다. [MYSQL_USER][MYSQL_PASSWORD]를 사용할 사용자 이름과 비밀번호로 바꿉니다.
      CREATE DATABASE polls;
      CREATE USER '[MYSQL_USER]' IDENTIFIED BY '[MYSQL_PASSWORD]';
      GRANT ALL ON . TO '[MYSQL_USER]';

데이터베이스 설정 구성

  1. 수정할 mysite/settings.py을 엽니다.

    1. App Engine 배포 및 로컬 테스트를 위해 데이터베이스에 대한 연결을 설정하려면 <your-database-user><your-database-password>Cloud SQL 인스턴스 만들기 단계에서 이전에 만든 사용자 이름과 비밀번호에 설정합니다.

    2. 인스턴스의 값을 가져옵니다.

      gcloud sql instances describe [YOUR_INSTANCE_NAME]
      
    3. 출력에서 다음 단계에 사용할 connectionName 값을 복사합니다.

    4. <your-cloudsql-connection-string>을 이전 단계의 connectionName으로 설정합니다.

    5. [YOUR-DATABASE]Cloud SQL 인스턴스 초기화 단계 중에 선택한 이름으로 설정합니다.

  2. settings.py를 닫고 저장합니다.

로컬 컴퓨터에서 앱 실행

  1. Django 앱을 로컬 컴퓨터에서 실행하려면 Python, pip, virtualenv를 포함한 Python 개발 환경을 설정합니다.

  2. 격리된 Python 환경을 만들고 종속 항목을 설치합니다.

    Linux/macOS

    virtualenv env
    source env/bin/activate
    pip install -r requirements.txt
    

    Windows

    virtualenv env
    env\scripts\activate
    pip install -r requirements.txt
    

  3. Django 마이그레이션을 실행하여 모델을 설정합니다.

    python manage.py makemigrations
    python manage.py makemigrations polls
    python manage.py migrate
    
  4. 로컬 웹 서버를 시작합니다.

    python manage.py runserver
    
  5. 브라우저에서 http://localhost:8000으로 이동합니다.

    http://localhost:8000
    

    페이지에 'No polls are available.' 텍스트가 표시됩니다. 컴퓨터에서 실행되는 Django 웹 서버는 샘플 앱 페이지를 전송합니다.

  6. Control+C를 눌러서 로컬 웹 서버를 중지합니다.

Django 관리 콘솔 사용

  1. 수퍼유저를 만듭니다. 사용자 이름과 비밀번호를 정의해야 합니다.

    python manage.py createsuperuser
    
  2. 로컬 웹 서버를 시작합니다.

    python manage.py runserver
    
  3. 브라우저에서 http://localhost:8000/admin으로 이동합니다.

    http://localhost:8000/admin
    
  4. createsuperuser를 실행할 때 사용한 사용자 이름과 비밀번호를 사용하여 관리 사이트에 로그인합니다.

App Engine 표준 환경에 앱 배포

  1. 앱의 모든 정적 파일을 settings.py에서 STATIC_ROOT로 지정된 폴더로 이동하여 모든 정적 콘텐츠를 하나의 폴더에 수집합니다.

    python manage.py collectstatic
    
  2. app.yaml 파일이 있는 앱의 python-docs-samples/appengine/standard_python3/django 디렉터리 내에서 다음 명령어를 실행하여 앱을 업로드합니다.

    gcloud app deploy
    

    업데이트가 완료되었다는 메시지가 표시될 때까지 기다립니다.

Google Cloud에서 앱 실행 확인

다음 명령어는 app.yaml에 설명된 대로 앱을 배포하고 새로 배포된 버전을 기본 버전으로 설정하여 모든 새 트래픽을 제공합니다.

  • 브라우저에 다음 URL을 입력합니다.

    https://PROJECT_ID.REGION_ID.r.appspot.com

    다음을 바꿉니다.

요청은 App Engine 표준 환경에서 실행되는 웹 서버에서 처리됩니다.

앱을 업데이트하는 경우, 앱을 배포하는 데 사용된 동일한 명령어를 입력하여 업데이트된 버전을 배포합니다. 배포하면 앱의 새 버전이 생성되고 기본 버전으로 승격됩니다. 앱의 이전 버전은 유지됩니다. 이러한 모든 앱 버전은 청구 가능한 리소스입니다. 비용을 줄이기 위해서는 기본이 아닌 앱 버전을 삭제합니다.

기본 버전이 아닌 앱 버전 삭제에 대한 자세한 내용은 삭제를 참조하세요.

프로덕션

프로덕션 환경에서 콘텐츠를 제공할 준비가 되면 mysite/settings.py에서 DEBUG 변수를 False로 변경합니다.

코드 이해하기

Django 샘플 앱은 표준 Django 도구를 사용하여 생성되었습니다.

  • 다음 명령어는 프로젝트와 설문조사 앱을 만듭니다.

    django-admin startproject mysite
    
    python manage.py startapp polls
    
  • settings.py 파일에는 SQL 데이터베이스에 대한 구성이 포함되어 있습니다. settings.py의 코드는 GAE_APPLICATION 환경 변수를 사용하여 앱이 App Engine에서 실행되는지 아니면 로컬 컴퓨터에서 실행되는지 확인할 수 있습니다.

    • 앱이 App Engine에서 실행되는 경우 /cloudsql Unix 소켓을 사용하여 MySQL 호스트에 연결됩니다.
    • 앱이 로컬 컴퓨터에서 실행되면 사용자 이름과 비밀번호가 필요한 TCP를 사용하여 MySQL 호스트에 연결합니다.
    # Use django-environ to parse the connection string
    DATABASES = {"default": env.db()}
    
    # If the flag as been set, configure to use proxy
    if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
        DATABASES["default"]["HOST"] = "127.0.0.1"
        DATABASES["default"]["PORT"] = 5432
    
  • app.yaml 파일에는 App Engine 배포를 위한 구성 정보가 포함되어 있습니다. 이 app.yaml 파일은 App Engine이 static/ 디렉터리에서 정적 파일을 제공하도록 지정합니다.

    runtime: python39
    
    handlers:
    # This configures Google App Engine to serve the files in the app's static
    # directory.
    - url: /static
      static_dir: static/
    
    # This handler routes all requests not caught above to your main app. It is
    # required when static routes are defined, but can be omitted (along with
    # the entire handlers section) when there are no static files defined.
    - url: /.*
      script: auto