App Engine スタンダード環境での Django の実行

App Engine スタンダード環境で実行される Django アプリは、トラフィックに応じて動的に拡張されます。

このチュートリアルは、Django ウェブ開発の知識があることを前提としています。Django 開発を初めて使用する場合は、続行する前に最初の Django アプリを作成するを実施することをおすすめします。このチュートリアルでは、アプリのモデルは質問からなるアンケートで、Django 管理コンソールを使用してモデルを操作できます。

このチュートリアルには Python 3.7 が必要です。

準備

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google 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 Proxy を使用して Cloud SQL インスタンスと通信します。ただし、アプリをローカルでテストするには、プロキシのローカルコピーを開発環境にインストールして使用する必要があります。

詳しくは Cloud SQL Proxy をご覧ください。

Cloud SQL インスタンスに対する基本的な管理タスクを行うには、MySQL クライアントを使用します。

Cloud SQL Admin API の有効化

Cloud SQL を使用する前に、Cloud SQL Admin API を有効にする必要があります。

gcloud services enable sqladmin

Cloud SQL Proxy のインストール

Cloud SQL Proxy をダウンロードしてインストールします。Cloud SQL Proxy は、ローカルで実行中の Cloud SQL インスタンスに接続します。

Linux 64 ビット

  1. プロキシをダウンロードします。
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

Linux 32 ビット

  1. プロキシをダウンロードします。
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

macOS 64 ビット

  1. プロキシをダウンロードします。
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

macOS 32 ビット

  1. プロキシをダウンロードします。
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

Windows 64 ビット

https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe を右クリックして [名前を付けてリンク先を保存] を選択し、プロキシをダウンロードします。ファイル名を cloud_sql_proxy.exe に変更します。

Windows 32 ビット

https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe を右クリックして [名前を付けてリンク先を保存] を選択し、プロキシをダウンロードします。ファイル名を cloud_sql_proxy.exe に変更します。
お使いのオペレーティング システムがここに記載されていない場合は、ソースからプロキシをコンパイルすることもできます。

Cloud SQL インスタンスの作成

  1. Cloud SQL for MySQL 第 2 世代のインスタンスを作成します。

    インスタンスに 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 Proxy を起動します。

    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 Proxy を実行したままにしてください。

  2. Cloud SQL のユーザーとデータベースを作成します。

    Cloud Console

    1. Cloud SQL インスタンス polls-instanceCloud Console を使用して新しいデータベースを作成します。たとえば、名前 polls を使用できます。
    2. Cloud SQL インスタンス polls-instanceCloud 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、pipvirtualenv などの 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 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.pySTATIC_ROOTで指定されたフォルダに移動して、すべての静的コンテンツを 1 つのフォルダに集約します。

    python manage.py collectstatic
    
  2. app.yaml ファイルが置かれている、アプリの python-docs-samples/appengine/standard/django ディレクトリ内から次のコマンドを実行して、アプリをアップロードします。

    gcloud app deploy
    

    更新が完了したことを通知するメッセージが表示されるまで待ちます。

Google Cloud でアプリが動作することを確認する

次のコマンドは、app.yamlで説明されているようにアプリをデプロイし、新しくデプロイされたバージョンをデフォルトバージョンとして設定して、すべての新しいトラフィックがこのバージョンで処理されるようにします。

リクエストは、App Engine スタンダード環境で実行されているウェブサーバーによって処理されます。

アプリを更新する場合は、アプリをデプロイしたときと同じコマンドを入力して、更新バージョンをデプロイします。デプロイするとアプリの新しいバージョンが作成され、それがデフォルトバージョンに設定されます。アプリの古いバージョンはそのまま残ります。これらのアプリ バージョンはすべて課金対象のリソースとなります。コストを抑えるには、アプリのデフォルト以外のバージョンを削除します。

アプリのデフォルト以外のバージョンを削除する方法については、クリーンアップを参照してください。

本番

本番環境でコンテンツを提供する準備が整ったら、mysite/settings.pyDEBUG 変数を 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 ホストに接続され、ユーザー名とパスワードが要求されます。
    if os.getenv('GAE_APPLICATION', None):
        # Running on production App Engine, so connect to Google Cloud SQL using
        # the unix socket at /cloudsql/<your-cloudsql-connection string>
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'HOST': '/cloudsql/[YOUR-CONNECTION-NAME]',
                'USER': '[YOUR-USERNAME]',
                'PASSWORD': '[YOUR-PASSWORD]',
                'NAME': '[YOUR-DATABASE]',
            }
        }
    else:
        # Running locally so connect to either a local MySQL instance or connect to
        # Cloud SQL via the proxy. To start the proxy via command line:
        #
        #     $ cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME]=tcp:3306
        #
        # See https://cloud.google.com/sql/docs/mysql-connect-proxy
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'HOST': '127.0.0.1',
                'PORT': '3306',
                'NAME': '[YOUR-DATABASE]',
                'USER': '[YOUR-USERNAME]',
                'PASSWORD': '[YOUR-PASSWORD]',
            }
        }
  • app.yamlファイルには、App Engine にデプロイするための構成情報が含まれています。 この app.yaml ファイルは、App Engine が static/ ディレクトリから静的ファイルを提供することを示します。

    runtime: python38
    
    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