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.6

  • 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 SystemsWindows
    Unix-based Systems
    ~$ virtualenv ~/eb-virt
    Windows
    C:\> virtualenv %HOMEPATH%\eb-virt
  2. 仮想環境をアクティブ化します。

    Unix-based SystemsWindows
    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> であり、USERNAME は Windows ログイン名です。

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

    (eb-virt)~$ pip install django==2.1.1

    注記

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

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

    Django のバージョンと Python との互換性については、「What Python version can I use with Django?」を参照してください。 Django 2.2 は Elastic Beanstalk Python 3.6 プラットフォームと互換性がありません。互換性のある最新のバージョンは Django 2.1 です。

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

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

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

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

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

注記

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

Django アプリケーションを作成するには

  1. 仮想環境をアクティブ化します。

    Unix-based SystemsWindows
    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> であり、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/ を開いて、サイトを表示します。

    
            ローカルで実行中の Django アプリのウェルカムページ
  5. サーバーログをチェックして、リクエストからの出力を確認します。ウェブサーバーを停止して仮想環境に戻るには、 Ctrl+C を押します。

    Django version 2.1.1, 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 SystemsWindows
    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.py

    この設定 WSGIPath は、アプリケーションを起動するのに Elastic Beanstalk が使用する 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 のセキュリティ要件です。詳細については、「ホストヘッダーの検証」を参照してください。

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

注記

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

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

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

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

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

    ~/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. settings.py ディレクトリの ebdjango ファイルを開きます。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 での最初の Django アプリケーションのデプロイが正常に完了しています。

アプリケーションの更新

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

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

サイト設定を変更する

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

サイトのタイムゾーンを変更するには

  1. settings.pyTIME_ZONE 設定を変更します

    例 ~/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 に渡すには、settings.pySTATIC_ROOT を定義します。

    例 ~/ebdjango/ebdjango/settings.py

    # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.1/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: "django-admin.py migrate" leader_only: true option_settings: aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: ebdjango.settings

    この設定ファイルは、アプリケーションが起動する前に、デプロイプロセスの間に django-admin.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 アプリケーションのデプロイ」を確認してください。