

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

# Elastic Beanstalk への Django アプリケーションのデプロイ
<a name="create-deploy-python-django"></a>

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

このチュートリアルでは、以下の作業を行います。
+ [Python 仮想環境のセットアップと Django のインストール](#python-django-setup-venv)
+ [Django プロジェクトを作成する](#python-django-create-app)
+ [Elastic Beanstalk 用に Django アプリケーションを設定する](#python-django-configure-for-eb) 
+ [EB CLI でサイトをデプロイします](#python-django-deploy) 
+ [アプリケーションの更新](#python-django-update-app) 
+ [クリーンアップ](#python-django-stopping)

## 前提条件
<a name="python-django-prereq"></a>

このチュートリアルを実行するには、以下のパッケージを含む、インストールされている Python の[一般的な前提条件](python-development-environment.md)をすべて満たす必要があります。
+ Python 3.7 以降
+ `pip`
+ `virtualenv`
+ `awsebcli`

チュートリアルのパートとして [Django](https://www.djangoproject.com/) フレームワークをインストールします。

**注記**  
EB CLI を使用して環境を作成するには、[サービスロール](concepts-roles-service.md)が必要です。Elastic Beanstalk コンソールで環境を作成することで、サービスロールを作成できます。サービスロールがない場合は、`eb create` を実行すると EB CLI で作成されます。

## Python 仮想環境のセットアップと Django のインストール
<a name="python-django-setup-venv"></a>

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

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

**開発環境を設定するには**

1. `eb-virt` という名前の仮想環境を作成します。

------
#### [ Unix-based systems ]

   ```
   ~$ virtualenv ~/eb-virt
   ```

------
#### [ Windows ]

   ```
   C:\> virtualenv %HOMEPATH%\eb-virt
   ```

------

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

------
#### [ 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 ログイン名です。

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

   ```
   (eb-virt)~$ pip install django==2.2
   ```
**注記**  
インストールする Django のバージョンは、アプリケーションのデプロイに選択した Elastic Beanstalk の Python 設定の Python バージョンと互換性がある必要があります。デプロイの詳細については、このトピックの「[EB CLI でサイトをデプロイします](#python-django-deploy)」を参照してください。  
現在の Python プラットフォームバージョンの詳細については、*AWS Elastic Beanstalk プラットフォーム*ドキュメントの「[Python](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)」を参照してください。  
Django のバージョンと Python との互換性については、「[What Python version can I use with Django? (Django で使用可能な Python のバージョンを教えてください)](https://docs.djangoproject.com/en/3.1/faq/install/#what-python-version-can-i-use-with-django)」を参照してください。

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

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

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

## Django プロジェクトを作成する
<a name="python-django-create-app"></a>

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

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

**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 ログイン名です。

1. `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
   ```

1. `manage.py runserver` で Django サイトをローカルで実行します。

   ```
   (eb-virt) ~$ cd ebdjango
   ```

   ```
   (eb-virt) ~/ebdjango$ python manage.py runserver
   ```

1. ウェブ・ブラウザで `http://127.0.0.1:8000/` を開いて、サイトを表示します。

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

   ```
   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 アプリケーションを設定する
<a name="python-django-configure-for-eb"></a>

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
   ```

------

1. `pip freeze` を実行して、出力を `requirements.txt` という名前のファイルに保存します。

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

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

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

   ```
   (eb-virt) ~/ebdjango$ mkdir .ebextensions
   ```

1. `.ebextensions` ディレクトリ内に、次のテキストを持つ `django.config` という名前の [設定ファイル](ebextensions.md) を追加します。  
**Example \$1/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 サーバーで動作します。

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

   ```
   (eb-virt) ~/ebdjango$ deactivate
   ```

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

## EB CLI でサイトをデプロイします
<a name="python-django-deploy"></a>

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 (ホスト・ヘッダーの検証)](https://docs.djangoproject.com/en/2.2/topics/security/#host-headers-virtual-hosting)」を参照してください。

**環境を作成し、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 プラットフォームバージョンで環境を作成します。

1. (オプション) **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** を実行します。

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

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

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

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

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

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

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

   ```
   ...
   ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']
   ```

1. ファイルを保存し、**eb deploy** を実行してアプリケーションをデプロイします。**eb deploy** を実行すると、EB CLI はプロジェクトディレクトリのコンテンツをバンドルアップして、ユーザーの環境にデプロイします。

   ```
   ~/ebdjango$ eb deploy
   ```
**注記**  
プロジェクトで Git を使用している場合は、「[Git での EB CLI の使用](eb3-cli-git.md)」を参照してください。

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

   ```
   ~/ebdjango$ eb open
   ```

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

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

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

## アプリケーションの更新
<a name="python-django-update-app"></a>

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

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

### サイト設定を変更する
<a name="python-django-modify-site"></a>

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

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

1. `settings.py` の `TIME_ZONE` 設定を変更します  
**Example \$1/ebdjango/ebdjango/settings.py**  

   ```
   ...
   # Internationalization
   LANGUAGE_CODE = 'en-us'
   TIME_ZONE = 'US/Pacific'
   USE_I18N = True
   USE_L10N = True
   USE_TZ = True
   ```

   タイムゾーンのリストについては、[このページ](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)を参照してください。

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

   ```
   ~/ebdjango/$ eb deploy
   ```

### サイト管理者を作成する
<a name="python-django-create-admin"></a>

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
   ```

1. `manage.py createsuperuser` を実行して、管理者を作成します。

   ```
   (eb-virt) ~/ebdjango$ python manage.py createsuperuser
   Username: admin
   Email address: me@mydomain.com
   Password: ********
   Password (again): ********
   Superuser created successfully.
   ```

1. 静的ファイルの保存する場所を Django に渡すには、`STATIC_ROOT` で `settings.py` を定義します。  
**Example \$1/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'
   ```

1. `manage.py collectstatic` を実行して、`static` ディレクトリに管理者サイトの静的アセット (JavaScript、CSS、イメージ) を追加します。

   ```
   (eb-virt) ~/ebdjango$ python manage.py collectstatic
   119 static files copied to ~/ebdjango/static
   ```

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

   ```
   ~/ebdjango$ eb deploy
   ```

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

   ```
   http://djang-env.p33kq46sfh.us-west-2.elasticbeanstalk.com/admin/
   ```  
![\[ステップ 2 で作成したユーザーネームとパスワードを入力して管理者コンソールにログ・インします。\]](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/images/eb_django_admin_login.png)

1. ステップ 2 で設定したユーザーネームとパスワードでログ・インします。  
![\[Elastic Beanstalk でデプロイした Django ウェブサイトの Django 管理コンソール\]](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/images/eb_django_admin_console.png)

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

### データベース移行設定ファイルを追加する
<a name="python-django-migrate-site"></a>

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

**アプリケーションがデプロイされたときに移行ステップを追加するには**

1. 以下の内容を使用して、`db-migrate.config` と言う名前の[設定ファイル](ebextensions.md)を追加します。  
**Example \$1/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 回だけ実行するようにできます。

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

   ```
   ~/ebdjango$ eb deploy
   ```

## クリーンアップ
<a name="python-django-stopping"></a>

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

```
~/ebdjango$ eb terminate django-env
```

このコマンドは、環境とその環境内で実行されるすべての AWS リソースを終了します。これによってアプリケーションが削除されることはありません。したがって **eb create** を再び実行することで、いつでも同じ設定でさらに環境を作成することができます。

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

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

## 次の手順
<a name="python-django-next-steps"></a>

詳細なチュートリアルを含む Django の情報については、[公式ドキュメント](https://docs.djangoproject.com/en/2.2/)を参照してください。

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