Elastic Beanstalk への Django アプリケーションのデプロイ - AWS Elastic Beanstalk

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Elastic Beanstalk への Django アプリケーションのデプロイ

このチュートリアルでは、自動生成されたデフォルトの Django ウェブサイトを、Python を実行している AWS Elastic Beanstalk 環境にデプロイする手順を説明します。このチュートリアルでは、Elastic Beanstalk 環境を使用して、クラウドで Python ウェブアプリケーションをホストする方法を示します。

このチュートリアルでは、以下の作業を行います。

前提条件

Elastic Beanstalk を含め、AWS のサービスを使用するには、AWS アカウントと認証情報が必要です。詳細を確認し、サインアップするには、https://aws.amazon.com/ にアクセスしてください。

このチュートリアルを実行するには、以下のパッケージを含む、インストールされている Python の一般的な前提条件をすべて満たす必要があります。

  • Python 3.7 以降

  • pip

  • virtualenv

  • awsebcli

チュートリアルのパートとして Django フレームワークをインストールします。

注記

EB CLI を使用して環境を作成するには、サービスロールが必要です。Elastic Beanstalk コンソールで環境を作成することで、サービスロールを作成できます。サービスロールがない場合は、eb create を実行すると EB CLI で作成されます。

Python 仮想環境のセットアップと Django のインストール

virtualenv で仮想環境を作成し、それを使用して Django とその依存関係をインストールします。仮想環境を使用することで、アプリケーションで必要なパッケージを正確に識別し、アプリケーションを実行する Amazon EC2 インスタンスにそれらの必要なパッケージをインストールすることができます。

以下のステップは、Unix ベースのシステムと Windows で入力する必要があるコマンドを、それぞれ別のタブに示しています。

開発環境を設定するには
  1. eb-virt という名前の仮想環境を作成します。

    Unix-based systems
    ~$ virtualenv ~/eb-virt
    Windows
    C:\> virtualenv %HOMEPATH%\eb-virt
  2. 仮想環境をアクティブ化します。

    Unix-based systems
    ~$ source ~/eb-virt/bin/activate (eb-virt) ~$
    Windows
    C:\>%HOMEPATH%\eb-virt\Scripts\activate (eb-virt) C:\>

    コマンドプロンプトの先頭に (eb-virt) と表示され、仮想環境を使用していることが示されます。

    注記

    残りの手順では、ホームディレクトリ ~$ での Linux のコマンドプロンプトを示しています。Windows では、C:\Users\USERNAME> であり、ユーザーネーム は Windows ログイン名です。

  3. pip を使用して Django をインストールします。

    (eb-virt)~$ pip install django==2.2
    注記

    インストールする Django のバージョンは、アプリケーションのデプロイに選択した Elastic Beanstalk の Python 設定の Python バージョンと互換性がある必要があります。デプロイの詳細については、このトピックの「EB CLI でサイトをデプロイします」を参照してください。

    現在の Python プラットフォームバージョンの詳細については、AWS Elastic Beanstalk プラットフォームドキュメントの「Python」を参照してください。

    Django のバージョンと Python との互換性については、「What Python version can I use with Django? (Django で使用可能な Python のバージョンを教えてください)」を参照してください。

  4. Django がインストールされたことを確認するには、次のように入力します。

    (eb-virt)~$ pip freeze Django==2.2 ...

    このコマンドは、仮想環境にインストールされるすべてのパッケージを一覧します。後でこのコマンドの出力を使用して、プロジェクトを Elastic Beanstalk で使用するために設定します。

Django プロジェクトを作成する

仮想環境を使用して、Django プロジェクトを作成してマシンで実行する準備ができました。

注記

このチュートリアルでは、Python に含まれているデータベースエンジン、SQLite を使用します。データベースはプロジェクトファイルでデプロイされます。本番稼働用環境では、Amazon Relational Database Service (Amazon RDS) を使用して、環境を分離することをお勧めします。詳細については、「Python アプリケーション環境に Amazon RDS DB インスタンスを追加する」を参照してください。

Django アプリケーションを作成するには
  1. 仮想環境をアクティブ化します。

    Unix-based systems
    ~$ source ~/eb-virt/bin/activate (eb-virt) ~$
    Windows
    C:\>%HOMEPATH%\eb-virt\Scripts\activate (eb-virt) C:\>

    コマンドプロンプトの先頭に (eb-virt) プレフィックスが表示され、仮想環境を使用していることが示されます。

    注記

    残りの手順では、ホームディレクトリと Linux のホームディレクトリ ~$ に Linux のコマンドプロンプト ~/ を示しています。Windows では、C:\Users\USERNAME> であり、ユーザーネーム は Windows ログイン名です。

  2. django-admin startproject コマンドを使用して、ebdjango という名前の Django のプロジェクトを作成します。

    (eb-virt)~$ django-admin startproject ebdjango

    このコマンドは、次のディレクトリ構造を持つ ebdjango というスタンダードの Django サイトを作成します。

    ~/ebdjango |-- ebdjango | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py `-- manage.py
  3. manage.py runserver で Django サイトをローカルで実行します。

    (eb-virt) ~$ cd ebdjango
    (eb-virt) ~/ebdjango$ python manage.py runserver
  4. ウェブ・ブラウザで http://127.0.0.1:8000/ を開いて、サイトを表示します。

  5. サーバーログをチェックして、リクエストからの出力を確認します。ウェブサーバーを停止して仮想環境に戻るには、 Ctrl+C を押します。

    Django version 2.2, using settings 'ebdjango.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [07/Sep/2018 20:14:09] "GET / HTTP/1.1" 200 16348 Ctrl+C

Elastic Beanstalk 用に Django アプリケーションを設定する

Django を使用してローカルシステムに作成したサイトを、Elastic Beanstalk でのデプロイ用に設定します。

デフォルトでは、Elastic Beanstalk は、アプリケーションを開始するために application.py というファイルを探します。これは作成した Django プロジェクトには存在しないため、アプリケーションの環境を調整する必要があります。また、アプリケーションのモジュールをロードできるように、環境可変数を設定する必要もあります。

Elastic Beanstalk 用にサイトを設定するには
  1. 仮想環境をアクティブ化します。

    Unix-based systems
    ~/ebdjango$ source ~/eb-virt/bin/activate
    Windows
    C:\Users\USERNAME\ebdjango>%HOMEPATH%\eb-virt\Scripts\activate
  2. pip freeze を実行して、出力を requirements.txt という名前のファイルに保存します。

    (eb-virt) ~/ebdjango$ pip freeze > requirements.txt

    Elastic Beanstalk は requirements.txt を使用して、アプリケーションを実行する EC2 インスタンスにどのパッケージをインストールするかを判断します。

  3. .ebextensions という名前のディレクトリを作成します。

    (eb-virt) ~/ebdjango$ mkdir .ebextensions
  4. .ebextensions ディレクトリ内に、次のテキストを持つ django.config という名前の 設定ファイル を追加します。

    例 ~/ebdjango/.ebextensions/django.config
    option_settings: aws:elasticbeanstalk:container:python: WSGIPath: ebdjango.wsgi:application

    この設定 WSGIPath は、アプリケーションを起動するのに Elastic Beanstalk が使用する WSGI スクリプトの場所を指定します。

    注記

    Amazon Linux AMI Python プラットフォームバージョン (Amazon Linux 2 より前の) を使用している場合は、WSGIPath の値を ebdjango/wsgi.py に置き換えます。この例の値は、Amazon Linux AMI プラットフォームバージョンでは support されていない Gunicorn WSGI サーバーで動作します。

  5. deactivate コマンドを使用して、仮想環境を非アクティブ化します。

    (eb-virt) ~/ebdjango$ deactivate

    パッケージをアプリケーションに追加するか、またはアプリケーションをローカルで実行する必要があるときは、いつでも仮想環境を再アクティブ化します。

EB CLI でサイトをデプロイします

Elastic Beanstalk でアプリケーションをデプロイするために必要な条件をすべて追加しました。プロジェクトディレクトリは次のようになります。

~/ebdjango/ |-- .ebextensions | `-- django.config |-- ebdjango | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py |-- db.sqlite3 |-- manage.py `-- requirements.txt

次に、アプリケーション環境を作成し、設定済みのアプリケーションを Elastic Beanstalk を使用してデプロイします。

デプロイの直後に、Django の設定を編集して Elastic Beanstalk からアプリケーションに割り当てられたドメイン名を Django の ALLOWED_HOSTS に追加します。次に、アプリケーションを再デプロイします。これは、HTTP Host ヘッダー攻撃を防ぐように設計された Django のセキュリティ要件です。詳細については、「Host header validation (ホスト・ヘッダーの検証)」を参照してください。

環境を作成し、Django アプリケーションをデプロイするには
注記

このチュートリアルでは、EB CLI をデプロイメントメカニズムとして使用しますが、Elastic Beanstalk コンソールを使用してプロジェクトの内容を含む .zip ファイルを展開することもできます。

  1. eb init コマンドを使用して EB CLI リポジトリを初期化します。

    ~/ebdjango$ eb init -p python-3.7 django-tutorial Application django-tutorial has been created.

    このコマンドでは、django-tutorial という名前のアプリケーションを作成します。また、ローカルリポジトリを設定し、最新の Python 3.7 プラットフォームバージョンで環境を作成します。

  2. (オプション) eb init を再度実行してデフォルトのキーペアを設定し、アプリケーションを実行している EC2 インスタンスに SSH を使用して connect できるようにします。

    ~/ebdjango$ eb init Do you want to set up SSH for your instances? (y/n): y Select a keypair. 1) my-keypair 2) [ Create new KeyPair ]

    1 つのキーペアがすでにある場合はそれを選択するか、またはプロンプトに従ってキーペアを作成します。プロンプトが表示されないか設定を後で変更する必要がない場合は、eb init -i を実行します。

  3. 環境を作成し、eb create を使用してそこにアプリケーションをデプロイします。

    ~/ebdjango$ eb create django-env
    注記

    「service role required」エラーメッセージが表示された場合は、eb create をインタラクティブに (環境名を指定せずに) 実行してください。EB CLI によってロールが作成されます。

    このコマンドは、django-env という名前のロードバランシング Elastic Beanstalk 環境を作成します。環境の作成には約 5 分かかります。Elastic Beanstalk はアプリケーションを実行するのに必要なリソースを作成し、EB CLI がターミナルに中継する情報メッセージを出力します。

  4. 環境の作成プロセスが完了したら、eb status を実行して新しい環境のドメイン名を見つけます。

    ~/ebdjango$ eb status Environment details for: django-env Application name: django-tutorial ... CNAME: eb-django-app-dev.elasticbeanstalk.com ...

    環境のドメイン名は、CNAME プロパティの値です。

  5. ebdjango ディレクトリの settings.py ファイルを開きます。ALLOWED_HOSTS 設定を見つけ、前のステップで見つけたアプリケーションのドメイン名を設定の値に追加します。この設定がファイルで見つからない場合は、それを新しい行に追加します。

    ... ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']
  6. ファイルを保存し、eb deploy を実行してアプリケーションをデプロイします。eb deploy を実行すると、EB CLI はプロジェクトディレクトリのコンテンツをバンドルアップして、ユーザーの環境にデプロイします。

    ~/ebdjango$ eb deploy
    注記

    プロジェクトで Git を使用している場合は、「Git での EB CLI の使用」を参照してください。

  7. 環境の更新プロセスが完了したら、eb open でウェブサイトを開きます。

    ~/ebdjango$ eb open

    これにより、アプリケーション用に作成されたドメイン名を使用してブラウザ・ウィンドウが開きます。ローカルで作成してテストしたのと同じ Django ウェブサイトが表示されます。

アプリケーションが実行されていることを確認できない場合や、エラーメッセージが表示される場合は、エラーの原因を判断する方法のヒントを得るためにデプロイのトラブルシューティングを参照してください。

アプリケーションが実行されていることを実際に確認できた場合は、Elastic Beanstalk での最初の Django アプリケーションのデプロイが正常に完了しています。

アプリケーションの更新

Elastic Beanstalk で実行中のアプリケーションまたはその設定を更新して再デプロイすることができます。この場合、インスタンスを更新して新しいアプリケーションバージョンを開始する作業は、Elastic Beanstalk が実行します。

この例では、Django の管理者コンソールを有効にして、他のいくつかの項目を設定します。

サイト設定を変更する

デフォルトでは、Django ウェブサイトは UTC タイムゾーンを使用して時間を表示します。settings.py でタイムゾーンを指定して、これを変更することができます。

サイトのタイムゾーンを変更するには
  1. TIME_ZONEsettings.py 設定を変更します

    例 ~/ebdjango/ebdjango/settings.py
    ... # Internationalization LANGUAGE_CODE = 'en-us' TIME_ZONE = 'US/Pacific' USE_I18N = True USE_L10N = True USE_TZ = True

    タイムゾーンのリストについては、このページを参照してください。

  2. アプリケーションを Elastic Beanstalk 環境にデプロイします。

    ~/ebdjango/$ eb deploy

サイト管理者を作成する

Django アプリケーション用のサイト管理者を作成すると、ウェブサイトから管理者コンソールに直接アクセスできます。管理者のログインの詳細は、Django が生成したデフォルトプロジェクトに含まれるローカルデータベース・イメージに安全に保存されます。

サイト管理者を作成するには
  1. Django アプリケーションのローカルデータベースを初期化します。

    (eb-virt) ~/ebdjango$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying sessions.0001_initial... OK
  2. manage.py createsuperuser を実行して、管理者を作成します。

    (eb-virt) ~/ebdjango$ python manage.py createsuperuser Username: admin Email address: me@mydomain.com Password: ******** Password (again): ******** Superuser created successfully.
  3. 静的ファイルの保存する場所を Django に渡すには、STATIC_ROOTsettings.py を定義します。

    例 ~/ebdjango/ebdjango/settings.py
    # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = '/static/' STATIC_ROOT = 'static'
  4. manage.py collectstatic を実行して、static ディレクトリに管理者サイトの静的アセット (JavaScript、CSS、イメージ) を追加します。

    (eb-virt) ~/ebdjango$ python manage.py collectstatic 119 static files copied to ~/ebdjango/static
  5. アプリケーションをデプロイします。

    ~/ebdjango$ eb deploy
  6. ブラウザでサイトを開き、次のようにサイトの URL に /admin/ を付加することで、管理者コンソールが表示されます。

    http://djang-env.p33kq46sfh.us-west-2.elasticbeanstalk.com/admin/
    
              ステップ 2 で作成したユーザーネームとパスワードを入力して管理者コンソールにログ・インします。
  7. ステップ 2 で設定したユーザーネームとパスワードでログ・インします。

    
              Elastic Beanstalk でデプロイした Django ウェブサイトの Django 管理コンソール

ローカルでの更新/テストと同様の手順を使用し、続けて eb deploy を実行することができます。実稼働サーバーの更新は Elastic Beanstalk が処理するため、ユーザーはサーバー管理ではなくアプリケーション開発に集中できます。

データベース移行設定ファイルを追加する

サイトが更新されたときに実行される .ebextensions スクリプトに、コマンドを追加することができます。これにより、データベース・マイグレーションを自動的に生成できます。

アプリケーションがデプロイされたときに移行ステップを追加するには
  1. 以下の内容を使用して、db-migrate.config と言う名前の設定ファイルを追加します。

    例 ~/ebdjango/.ebextensions/db-migrate.config
    container_commands: 01_migrate: command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate" leader_only: true option_settings: aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: ebdjango.settings

    この設定ファイルは、サーバーの仮想環境をアクティブ化し、アプリケーションがスタートする前に、デプロイプロセスの間に manage.py migrate コマンドを実行します。アプリケーションがスタートする前に実行されるため、DJANGO_SETTINGS_MODULE 環境可変数を明確に設定する必要もあります (通常は、スタートアップ中に wsgi.py がこれを行います)。コマンドで leader_only: true を指定することで、複数のインスタンスにデプロイする場合に 1 回だけ実行するようにできます。

  2. アプリケーションをデプロイします。

    ~/ebdjango$ eb deploy

クリーンアップ

開発セッション間におけるインスタンス時間や他の AWS リソースを節約するには、eb terminate を使用して Elastic Beanstalk 環境を終了します。

~/ebdjango$ eb terminate django-env

このコマンドは、環境およびその中で実行されているすべての AWS リソースを終了します。これによってアプリケーションが削除されることはありません。したがって eb create を再び実行することで、いつでも同じ設定でさらに環境を作成することができます。EB CLI コマンドの詳細については、「EB CLI を使用した Elastic Beanstalk 環境の管理」を参照してください。

サンプルアプリケーションが必要なくなった場合は、プロジェクトフォルダーと仮想環境を削除することもできます。

~$ rm -rf ~/eb-virt ~$ rm -rf ~/ebdjango

次のステップ

詳細なチュートリアルを含む Django の情報については、公式ドキュメントを参照してください。

別の Python ウェブフレームワークを試す場合は、「Elastic Beanstalk への Flask アプリケーションのデプロイ」をチェックしてください。