EB CLI + git + Djangoで簡単webサーバ構築 & デプロイ

サーバ環境構築やデプロイツールをつくるのってすごくめんどくさいと思いませんか？
今回、そんな悩みを解決してくれる、AWSのサービス「Elastic Beans Talk」（以下EB）を利用して、簡単にサーバ構築とデプロイしてみたいと思います。
また、AWSマネージコンソールを利用せず、コマンドラインでEBを操作出来るEB CLIを利用したいと思います。

![aeb-architecture2.png](https://qiita-image-store.s3.amazonaws.com/0/98305/66152379-c7e9-74f1-f77f-871508dcfab3.png)

Django環境は最小構成Djangoを利用したいと思います。
http://qiita.com/yu-sa/items/26e413987efa0debc9d7

AWS環境をお持ちでない方は、qwikLabsを利用して環境構築を無料で試してみるのも良いと思います。
https://qwiklabs.com/focuses/2356

# 前提環境
mac os x 10.9.5
EB CLI 3.7.6
AWS CLI 1.10.26

# Django & python
python 2.7.10
Django 1.9

# Django環境
Django環境をcloneしてきます。

```
# git clone https://github.com/yu-sa/my_site.git
```

フォルダ構成は

```
my_site(ワークフォルダ)
├─my_site
│　├─ __init__.py
│　├─settings.py
│　├─templates
│　│　└─index.html
│　├─urls.py
│　├─views
│　│　├─__init__.py
│　│　├─index.py
│　│　└─urls.py
│　└─wsgi.py
├─requirements.txt
└─manage.py
```

上記、ワークフォルダに移動して以降の作業を行って下さい。

# AWS CLIの設定
AWS CLIの設定を行います。
EB CLIでコマンドを実行するためにどのアカウントでアクセスしてサービスを利用するのかの設定を行います。

```
# aws configure
AWS Access Key ID [********************]: xxxxxxxxxxxx # アクセスキー ID
AWS Secret Access Key [********************]: xxxxxxxxxxxxxxxxxxxxxxxxx # シークレットアクセスキー
Default region name [ap-northeast-1]: ap-northeast-1 # 東京リージョン
Default output format [json]: json
```

# EB CLIの設定
EB CLIの設定も行います。

```
# eb init -i
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-southeast-1 : Asia Pacific (Singapore)
7) ap-southeast-2 : Asia Pacific (Sydney)
8) ap-northeast-1 : Asia Pacific (Tokyo)
9) ap-northeast-2 : Asia Pacific (Seoul)
10) sa-east-1 : South America (Sao Paulo)
11) cn-north-1 : China (Beijing)
(default is 3): 8

Select an application to use
1) my_site
2) [ Create new Application ]
(default is 1): 1

It appears you are using Python. Is this correct?
(y/n): y

Select a platform version.
1) Python 3.4
2) Python
3) Python 2.7
4) Python 3.4 (Preconfigured - Docker)
(default is 1): 3

Do you want to set up SSH for your instances?
(y/n): y

Select a keypair.
1) qwikLABS-L98-469340
2) [ Create new KeyPair ]
(default is 2): 2

Type a keypair name.
(Default is aws-eb): aws-eb

Generating public/private rsa key pair.
/Users/xxxxxxxxx/.ssh/aws-eb already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): (何も記入しないでEnter)
Enter same passphrase again: (何も記入しないでEnter)
```

# .ebextensionsの作成と設定
AWS Elastic Beanstalk 設定ファイルの.ebextensionsを追加する事で、設定をカスタマイズする事が出来ます。
今回使用するDjango環境を使用するためにも追加変更を行います。

設定ファイルは.configの拡張しで作成します。

```
# mkdir .ebextensions
# vi .ebextensions/django.config
```

[.ebextensions/django.conf]に下記の内容を記入して下さい。

```
option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "my_site.settings"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: "my_site/wsgi.py"
```

# EB作成
設定等は全て完了下のでEBの環境を作成して自動でwebサーバ環境を構築してみましょう。

```
# eb create my-site-dev --timeout ９０００
```

こちらのコマンドを叩くと、そのまま環境構築が開始します。
環境構築は完了するまで１０分以上かかる場合もあるのである程度放置して下さい。

環境が構築されたかを確認したい場合は、AWSマネージコンソールのElastic Beanstalk内に作成した環境があるのでそちらを確認してみて下さい。

<img width="1599" alt="スクリーンショット 2016-05-25 11.10.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/98305/07f18b0d-cdd5-e8c0-64ff-3dd84d0867bb.png">

# 確認
環境が構築されたら、該当ページを確認してみたいと思います。

```
# eb open my-site-dev
```

このコマンドを叩くと、ブラウザが開き下記のようなページが表示されます。

<img width="1185" alt="スクリーンショット 2016-05-25 11.13.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/98305/600915ae-2d55-5c1e-1a97-34a695468b29.png">

上記URLに/views/を追加すると下記のページが表示されます。
<img width="640" alt="スクリーンショット 2016-05-25 11.18.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/98305/6c4b6f25-546e-30c3-f715-2babe9b353eb.png">

これで、環境構築完了です。

# 後記
上記はwebサーバの環境を構築しただけで、DB環境は構築していません。
RDS等を利用してmysql環境を利用するようにするのはまた、今度書いて行きたいと思います。

後、eb環境設定等の環境も構築されているモジュールもgithubにあげておきますので利用したい場合はcloneしてみて下さい。
https://github.com/yu-sa/my_site/tree/elasticbeanstalk

また、ソースを更新した場合はgitでcommitまで行った上で `eb deploy my-site-dev` でdeployも出来ます。
大体、５分ぐらいかかります。