Elastic BeansTalk の Django チュートリアル【初心者向け】

#はじめに
[前回ご紹介](https://qiita.com/JJ33/items/2f821b29cbabcaebd5fa)した、Elastic BeansTalkの理解をより深める為に
公式ドキュメントのチュートリアルを使ってDjangoアプリをデプロイしてみました！

[前提条件](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create-deploy-python-django.html)は長くなってしまうので割愛させていただきます。
Python 3.6と Windows 10 を使用しています。

#０.Windows で EB CLI をインストール
pip を使用して EB CLI をインストールします。コマンドプロンプトに以下を入力。

```C:\Users\ユーザー名>pip install awsebcli --upgrade --user```


Windows キーを押し、「環境変数」と入力します。[環境変数を編集] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/648f71b0-7f7e-0604-d975-abc5258f451f.png)

変数 Path を選択して、[ 編集 ]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/3914bf5e-e282-b359-7d77-0b764ed5c0c1.png)

[新規]を選択。[ %USERPROFILE%\AppData\roaming\Python\Python37\scripts ]を追加します。

[OK] を 2 回選択して、新しい設定を適用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/16895095-6233-b026-6aad-85d2b13502cd.png)

実行中のコマンドプロンプトのウィンドウを exit で閉じて、再度開きます。


EB CLI が正しくインストールされたかを確認します。以下をコマンドに入力します。

`C:\Users\ユーザー名> eb --version`

![2020-01-28_15h44_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/ddbe6eff-9bc2-80c1-2922-8ed3a6117a13.png)



#１.Python 仮想環境のセットアップと Django のインストール
１.　[ eb-virt ] という名前の仮想環境を作成します。

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

２.　仮想環境をアクティブ（実行状態）にします

`C:\> %HOMEPATH%\eb-virt\Scripts\activate`

３.　[ pip ]というコマンドを使用して Django をインストールします。

`(eb-virt)~$ pip install `

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

`(eb-virt)~$ pip freeze`


#２. Django プロジェクトを作成する
１.　仮想環境をアクティブ化します。

`C:\> %HOMEPATH%\eb-virt\Scripts\activate`

コマンドプロンプトの先頭に[ eb-virt ]が表示され、仮想環境を使用していることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/b984c90e-70df-bb38-0cb3-847bc97b6feb.png)


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

`(eb-virt) C:\Users\ユーザー名>django-admin startproject ebdjango`

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

`(eb-virt) C:\Users\ユーザー名>cd ebdjango`

`(eb-virt) C:\Users\ユーザー名>python manage.py runserver`

４.　ウェブブラウザで http://127.0.0.1:8000/ を開いて、サイトを表示します。
![2020-01-29_13h23_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/66fe4eda-e478-cfe7-d83b-cd6295279507.png)


５. ウェブサーバを停止して仮想環境に戻るには、キーボードの[ Ctrl+C ]を押します。


#３.　Elastic Beanstalk 用に Django アプリケーションを設定する
ローカルシステムに作成したサイトを、Elastic Beanstalk でのデプロイ用に設定します。
アプリケーションの環境を調整して、アプリケーションのモジュールをロードできるように、環境変数を設定します。

１.　仮想環境をアクティブ化します。
`C:\Users\ユーザー名\ebdjango>%HOMEPATH%\eb-virt\Scripts\activate`

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

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

Elastic Beanstalk は requirements.txt を使用して、アプリケーションを実行する EC2 インスタンスにどのパッケージをインストールするかを判断します。
３.　[ .ebextensions ] という名前のディレクトリを作成します。

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

４.　[ .ebextensions ]ディレクトリ内に、[ django.config ]という名前の 設定ファイルを作成します。

`C:\Users\USERNAME\ebdjango>type nul > django.config`

CLIで操作したパスの通りにファイルを開いていきます。
エクスプローラーを開いて、Windows(C:) ドライブにあるユーザーから自分のユーザー名のフォルダを開きます。
「 ～/ebdjango/.ebextensions/django.config 」
django.config を見つけたらメモ帳で開いて設定事項を書きます。


```django.config

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: ebdjango/wsgi.py
```
この設定 WSGIPath は、アプリケーションを起動するのに Elastic Beanstalk が使用する WSGI スクリプトの場所を指定します。

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

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


#４. EB CLI でサイトをデプロイする
※Elastic Beanstalk コンソールを使用して .zip ファイルをアップロードして展開することもできます。
アプリケーション環境を作成し、設定済みのアプリケーションを Elastic Beanstalk を使用してデプロイします。

１.　eb init コマンドを使用して EB CLI リポジトリを初期化します。
このコマンドでは、django-tutorial という名前のアプリケーションを作成します。
また、ローカルリポジトリ（ファイルやディレクトリの履歴を管理する場所）を設定し、最新の Python 3.6 プラットフォームバージョンで環境を作成します。

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


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

このコマンドは、django-env という名前のロードバランシング Elastic Beanstalk 環境を作成します。環境の作成には約 5 分かかります。
Elastic Beanstalk はアプリケーションを実行するのに必要なリソースを作成してくれます。

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

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

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

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

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

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

`~/ebdjango> eb deploy`

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

`~/ebdjango> eb open`

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

![2020-02-04_17h14_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/4fc3722e-ce03-c3e7-71c0-12155316cd71.png)
# クリーンアップ方法
他の AWS リソースを保存するには、eb terminate を入力。 Elastic Beanstalk 環境を終了します。

`~/ebdjango> eb terminate django-env`

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

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

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

#リソースを確認してみる
中では CloudFormation の「スタック」からアプリケーションのデプロイ環境が作られています。

**EC2**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/a1afdd4c-fcb4-6aaa-e36a-e5b807e48d45.png)
**S3**
![2020-03-06_16h05_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/518ce709-b5af-e1c7-6e20-2c9e23fbd3c7.png)
**Cloud formation**
![2020-03-06_16h08_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/1eddb07d-83d8-6c7e-5fa8-aae738e6d1c4.png)

#所感

確かにコンソールでポチポチとサービス画面を行き来しながら、環境を一から構築するよりは、一つの画面で操作できて一式リソースが用意されるこの仕組みは便利だと思いました。
ただコマンドプロンプトや CLI の操作に慣れないと、ちょっと難しい部分もありますので、サンプルアプリケーションを作成できるコンソール操作から使ってみるほうが入りやすいかもしれません。

#公式サイトリンク
[ドキュメント](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/Welcome.html)
[製品紹介](https://aws.amazon.com/jp/elasticbeanstalk/)