AWS Elastic Beanstalk Django アプリケーション環境を CentOS6.5 上に PyDevを使って構築する(1) Django起動まで

基本的にチュートリアル、AWS Elastic Beanstalk への Django アプリケーションのデプロイ に従うが、CentOS6.5 に、Eclipse+PyDev を利用した環境を作成する。

チュートリアル で、Djangoの動作確認(It worked! のページが表示)が出来るところまで。

1.CentOS環境の構築

1.1.CentOS6.5 にPython2.7 をインストールする

まず、Elastic Beanstalk を使用する条件として、Python のバージョンが、2.7 もしくは 3.0 と指定されているため、Python2.7 を CentOS6.5 にインストールする。CentOS7 だと、Python2.7 が最初からインストールされているが、CentOS6.5では、Python2.6がデフォルト。

Python2.7 をインストールして、PIPが利用出来るようにする手順

を実施し、ソースコードからコンパイル、インストールする。インストールするときには

、altinstall を行い、2.6と2.7 を共存させる。2.6を2.7で置き換えてしまうと、システム管理

ツールなど、Pythonを利用しているツールが動かなくなってしまう。

# make && make altinstall

あとは、コンパイル時にエラーになったら、不足しているライブラリなどを適宜インストールする。

Django のインストールはこの時点では不要。

1.2.Virtualenv のインストールと起動

https://virtualenv.pypa.io/en/latest/index.html

Pythonの複数バージョンを隔離することで、同一環境にインストール出来るVirtualenvをインストールする。

ホームディレクトリにvirtualenv ディレクトリ(名称任意)を作成し、python2.7の環境を作成する。

[piroto@localhost ~]$ mkdir virtualenv
[piroto@localhost ~]$ virtualenv -p python2.7 ~/virtualenv
Already using interpreter /usr/local/bin/python2.7
New python executable in /home/piroto/virtualenv/bin/python2.7
Also creating executable in /home/piroto/virtualenv/bin/python
Installing setuptools, pip...done.

Virtualenv を起動(activate)する。(終了するときは、deactivate)

[piroto@localhost ~]$ . ~/virtualenv/bin/activate

1.3.Djangoとmysql-pythonのインストール

1.3.1 Djangoのインストール

Virtualenv 環境に、pip を使ってDjango1.7.1をインストール

(virtualenv)[piroto@localhost ~]$ pip install django==1.7.1
Collecting django==1.7.1
  Using cached Django-1.7.1-py2.py3-none-any.whl
Installing collected packages: django
Successfully installed django-1.7.1

1.3.2 mysql-python のインストール

同様に、mysql-python1.2.5 をインストール

(virtualenv)[piroto@localhost ~]$ pip install mysql-python==1.2.5
Collecting mysql-python==1.2.5
  Downloading MySQL-python-1.2.5.zip (108kB)
    100% |################################| 110kB 2.8MB/s 
Installing collected packages: mysql-python
 :(略)
Successfully installed mysql-python-1.2.5

1.3.3 MySQLをローカル環境に導入

チュートリアルにはないが、ローカル環境で実行させたいので、Elastic Beanstalk の MySQL バージョンに合わせて5.5 をローカルにインストールする。

http://dev.mysql.com/downloads/mysql/

Linux - Generic を選択し、Looking for previous GA versions? リンクをクリック

mysql_install01

一式必要なものがバンドルされた、Linux - Generic 2.6 (x86, 32-bit), RPM Bundle のダウンロードボタンを押下

mysql_install02

この画面で、No thanks, just start my download. のリンクに直接ダウンロードするパスがかかれているので、それを使って、wget する。上のボタンはサインインが必要で面倒。

mysql_install03

解凍とインストール

# tar -xvf MySQL-5.5.41-1.linux2.6.i386.rpm-bundle.tar 
rpm -ivh MySQL-shared-5.5.41-1.linux2.6.i386.rpm
rpm -ivh MySQL-shared-compat-5.5.41-1.linux2.6.i386.rpm
rpm -ivh MySQL-server-5.5.41-1.linux2.6.i386.rpm
rpm -ivh MySQL-client-5.5.41-1.linux2.6.i386.rpm
rpm -ivh MySQL-devel-5.5.41-1.linux2.6.i386.rpm

root のパスワードを設定

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'

以下を実行

  • root でログイン
  • "phrase" という名前のデータベースを作成
  • "phrase_app" というユーザーを作成
  • "phrase_app" にDB管理権限を与える
$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.41 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database phrase default character set utf8;
Query OK, 1 row affected (0.03 sec)

mysql> create user phrase_app@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on *.* to phrase_app@'%' identified by '*****' with grant option;

1.4 AWS Elastic Beanstalk ツールのインストールと設定

1.4.1 AWS Elastic Beanstalk Command Line Tool のダウンロード

以下からダウンロードし、適当なディレクトリに解凍する

http://aws.amazon.com/code/6752709412171743

1.4.2 PATHを通し、エイリアスを設定

(virtualenv)[piroto@localhost phrase]$ export PATH=$PATH:/opt/AWS-ElasticBeanstalk-CLI-2.6.4/eb/linux/python2.7/
(virtualenv)[piroto@localhost phrase]$ alias eb="python2.7 /opt/AWS-ElasticBeanstalk-CLI-2.6.4/eb/linux/python2.7/eb"

1.4.3 bashrc に設定を記述しておく

/etc/bashrc の末尾に以下を追記し、次回ログイン時にも再設定されるようにしておく

export PATH=$PATH:/opt/AWS-ElasticBeanstalk-CLI-2.6.4/eb/linux/python2.7/
alias eb="python2.7 /opt/AWS-ElasticBeanstalk-CLI-2.6.4/eb/linux/python2.7/eb"

2.Eclipse + PyDevのインストール

2.1 Eclipse をダウンロードして適当なディレクトリに展開

http://www.eclipse.org/downloads/?osType=linux&release=undefined

http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/luna/SR1/eclipse-java-luna-SR1-linux-gtk.tar.gz

2.2 PyDevのインストール

http://pydev.org/download.html

help > Install new Software > Add ボタン押下

以下を入力し、OK、PyDevにチェックし、ウィザードに従いインストールを完了する。

Name: PyDev

Location : http://pydev.org/updates

pydev_install

3.プロジェクトの作成

3.1 Virtualenvをインタープリタとして設定

http://okdtsk.hateblo.jp/entry/20111221/1324415529
Widow > Preference で設定ウィンドウをひらき、PyDev > Interpreters > Python Interpreter で New ボタンを押下。

venv_interpreter_creation01

Interpreter Executeble のパスに、上記でインストールした Virtualenv のパス以下のpython2.7を指定する。

venv_interpreter_creation02

OKで、必要なライブラリのパスが自動で設定される。

venv_interpreter_creation03

3.2 PyDev Django プロジェクトの作成

Eclipse パッケージエクスプローラーの右クリック New > Other から ダイアログを開き、Pydev Django Projectを選択

create_django_project00

プロジェクト名を入力。今回の例では、"phrase" とする。

以下、さまざまな設定で、"phrase" というキーワードが出てくるが、それぞれのアプリケーション名に読み替える。

create_django_project01

以降、ウィザードに従い完了させる。

3.3 Git の設定

作成したプロジェクトの右クリックからTeam > Shre Project

git_setting01

Git を選択し次へ

git_setting02

「Use or create repository in parent folder of project」にチェックをいれ、下段の Create Repository ボタンを押下したのち、プロジェクトにチェックを入れて完了する。

プロジェクトを削除すると、リポジトリも併せて削除されてしまうためか、リポジトリをEclipseのワークスペースに作成するのは、非推奨とメッセ-が出るが、続行する。

git_setting03

3.4 プロジェクトの編集

最低限のプロジェクト編集を行う。

3.4.1 settings.py を編集する

チュートリアルの記述では、if 'RDS_DB_NAME' ... ブロックの中だけだが、ローカルで実行したときには

、上記でインストールしたローカルのMySQLを参照するような記述にDATABASESを置き換える。

if 'RDS_DB_NAME' in os.environ:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.environ['RDS_DB_NAME'],
            'USER': os.environ['RDS_USERNAME'],
            'PASSWORD': os.environ['RDS_PASSWORD'],
            'HOST': os.environ['RDS_HOSTNAME'],
            'PORT': os.environ['RDS_PORT'],
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'phrase',
            'USER': 'phrase_app',
            'PASSWORD': '*****',
            'HOST': '127.0.0.1',
            'PORT': '3306',
        }
    }

以下の記述を追記する

STATIC_ROOT = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'static')

3.4.2 .ebextentions/config ファイルの作成

ルートディレクトリに.ebextentions ディレクトリを作成し、その中に、.config 拡張子 のファイルを作成する。config 拡張子であれば、名前は任意で、アルファベット順に実行される。

(virtualenv)[piroto@localhost phrase]$ ls -a
.  ..  .git  .project  .pydevproject  manage.py  phrase  phrase.config
(virtualenv)[piroto@localhost phrase]$ mkdir .ebextensions
(virtualenv)[piroto@localhost phrase]$ vi phrase.config

内容はチュートリアル通り。

チュートリアルでは、2回に分けて編集されるが、admin ユーザー作成のスクリプトなどを設定する2回目はうまく動かないので、1回目の状態で確認する。

container_commands:
  01_syncdb:    
    command: "django-admin.py syncdb --noinput"
    leader_only: true

option_settings:
  - namespace: aws:elasticbeanstalk:container:python
    option_name: WSGIPath
    value: phrase/wsgi.py
  - option_name: DJANGO_SETTINGS_MODULE
    value: phrase.settings

3.4.3 requirements.txt の作成

ルートディレクトリに、requrements.txt を作成する。この記述にもとづいて、EC2のサーバが構成される。

pip freeze を使用すると以下のようなファイルが作成される。

(virtualenv)[piroto@localhost phrase]$ pip freeze > requirements.txt
(virtualenv)[piroto@localhost phrase]$ cat requirements.txt 
boto==2.34.0
Django==1.7.1
MySQL-python==1.2.5

3.5 構成の全体とGit コミット

プロジェクトの右クリック から Team > Commt を実行

commit_project01

コミットすると、全体で以下の様な構成になる。

commit_project02

4. Elastic Beanstalk の初期化と開始

4.1 初期化

Virtualenv が開始された状態で、上記プロジェクトのルートフォルダから、eb init を実行する。

設定内容は、チュートリアル「AWS Elastic Beanstalk を構成するには」を参照

(virtualenv)[piroto@localhost phrase]$ eb init
To get your AWS Access Key ID and Secret Access Key, 
  visit "https://aws-portal.amazon.com/gp/aws/securityCredentials".
Enter your AWS Access Key ID (current value is "AKIAJ*****DC3CQ"): **************************
Enter your AWS Secret Access Key (current value is "7StGV*****emLaR"): **************************
Select an AWS Elastic Beanstalk service region.
Available service regions are:
1) US East (Virginia)
2) US West (Oregon)
3) US West (North California)
4) EU West (Ireland)
5) EU Central (Frankfurt)
6) Asia Pacific (Singapore)
7) Asia Pacific (Tokyo)
8) Asia Pacific (Sydney)
9) South America (Sao Paulo)
Select (1 to 9): 7
Enter an AWS Elastic Beanstalk application name (auto-generated value is "phrase"): 
Enter an AWS Elastic Beanstalk environment name (auto-generated value is "phrase-env"): 
Select an environment tier.
Available environment tiers are:
1) WebServer::Standard::1.0
2) Worker::SQS/HTTP::1.0
Select (1 to 2): 1
Select a solution stack.
Available solution stacks are:
1) 64bit Amazon Linux 2014.09 v1.0.9 running PHP 5.5
2) 64bit Amazon Linux 2014.09 v1.0.9 running PHP 5.4
3) 64bit Amazon Linux 2014.03 v1.0.9 running PHP 5.5
4) 64bit Amazon Linux 2014.03 v1.0.9 running PHP 5.4
5) 32bit Amazon Linux 2014.03 v1.0.9 running PHP 5.5
6) 32bit Amazon Linux 2014.03 v1.0.9 running PHP 5.4
7) 32bit Amazon Linux running PHP 5.3
8) 64bit Amazon Linux running PHP 5.3
9) 64bit Amazon Linux 2014.09 v1.0.9 running Node.js
10) 64bit Amazon Linux 2014.03 v1.0.9 running Node.js
11) 32bit Amazon Linux 2014.03 v1.0.9 running Node.js
12) 64bit Windows Server 2008 R2 running IIS 7.5
13) 64bit Windows Server 2012 running IIS 8
14) 64bit Windows Server 2012 R2 running IIS 8.5
15) 64bit Windows Server Core 2012 R2 running IIS 8.5
16) 64bit Amazon Linux 2014.09 v1.0.0 running Tomcat 8 Java 8
17) 64bit Amazon Linux 2014.09 v1.0.9 running Tomcat 7 Java 7
18) 64bit Amazon Linux 2014.03 v1.0.9 running Tomcat 7 Java 7
19) 64bit Amazon Linux 2014.09 v1.0.9 running Tomcat 7 Java 6
20) 64bit Amazon Linux 2014.03 v1.0.9 running Tomcat 7 Java 6
21) 32bit Amazon Linux 2014.03 v1.0.9 running Tomcat 7 Java 7
22) 32bit Amazon Linux 2014.03 v1.0.9 running Tomcat 7 Java 6
23) 32bit Amazon Linux running Tomcat 7
24) 64bit Amazon Linux running Tomcat 7
25) 32bit Amazon Linux running Tomcat 6
26) 64bit Amazon Linux running Tomcat 6
27) 64bit Amazon Linux 2014.09 v1.0.9 running Python 2.7
28) 64bit Amazon Linux 2014.09 v1.0.9 running Python
29) 64bit Amazon Linux 2014.03 v1.0.9 running Python 2.7
30) 64bit Amazon Linux 2014.03 v1.0.9 running Python
31) 32bit Amazon Linux 2014.03 v1.0.9 running Python 2.7
32) 32bit Amazon Linux 2014.03 v1.0.9 running Python
33) 32bit Amazon Linux running Python
34) 64bit Amazon Linux running Python
35) 64bit Amazon Linux 2014.09 v1.0.9 running Ruby 2.1 (Puma)
36) 64bit Amazon Linux 2014.09 v1.0.9 running Ruby 2.1 (Passenger Standalone)
37) 64bit Amazon Linux 2014.09 v1.0.9 running Ruby 2.0 (Puma)
38) 64bit Amazon Linux 2014.09 v1.0.9 running Ruby 2.0 (Passenger Standalone)
39) 64bit Amazon Linux 2014.09 v1.0.9 running Ruby 1.9.3
40) 64bit Amazon Linux 2014.03 v1.0.9 running Ruby 2.1 (Puma)
41) 64bit Amazon Linux 2014.03 v1.0.9 running Ruby 2.1 (Passenger Standalone)
42) 64bit Amazon Linux 2014.03 v1.0.9 running Ruby 2.0 (Passenger Standalone)
43) 64bit Amazon Linux 2014.03 v1.0.9 running Ruby 2.0 (Puma)
44) 64bit Amazon Linux 2014.03 v1.0.9 running Ruby 1.9.3
45) 32bit Amazon Linux 2014.03 v1.0.9 running Ruby 1.9.3
46) 64bit Amazon Linux 2014.09 v1.0.11 running Docker 1.3.3
47) 64bit Debian jessie v1.0.2 running GlassFish 4.1 Java 8 (Preconfigured - Docker)
48) 64bit Debian jessie v1.0.2 running GlassFish 4.0 Java 7 (Preconfigured - Docker)
49) 64bit Debian jessie v1.0.2 running Python 3.4 (Preconfigured - Docker)
Select (1 to 49): 27
Select an environment type.
Available environment types are:
1) LoadBalanced
2) SingleInstance
Select (1 to 2): 1
Create an RDS DB Instance? [y/n]: y
Create an RDS BD Instance from (current value is "[No snapshot]"):
1) [No snapshot]
2) awseb-e-ptkmnhm3xx-stack-snapshot-awsebrdsdatabase-k9uebzidtrci
3) awseb-e-v93jmffmci-stack-snapshot-awsebrdsdatabase-19su3ax11n8uy
4) awseb-e-pzpnjjgrdb-stack-snapshot-awsebrdsdatabase-1ubni5tyda5lv
5) [Other snapshot]
Select (1 to 5): 1
Enter an RDS DB master password: 
Retype password to confirm: 
If you terminate your environment, your RDS DB Instance will be deleted and you will lose your data.
Create snapshot? [y/n]: y
Attach an instance profile (current value is "[Create a default instance profile]"):
1) [Create a default instance profile]
2) aws-elasticbeanstalk-ec2-role
3) [Other instance profile]
Select (1 to 3): 1
Updated AWS Credential file at "/home/piroto/.elasticbeanstalk/aws_credential_file".

4.2 開始

eb start でアプリケーションを開始する。上記でコミットしたプロジェクトも同時にデプロイする。

(virtualenv)[piroto@localhost phrase]$ eb start
Starting application "phrase".
Would you like to deploy the latest Git commit to your environment? [y/n]: y

Waiting for environment "phrase-env" to launch.
2015-01-05 12:35:24	INFO	createEnvironment is starting.
2015-01-05 12:35:26	INFO	Using elasticbeanstalk-ap-northeast-1-964880067324 as Amazon S3 storage bucket for environment data.
2015-01-05 12:35:44	INFO	Created load balancer named: awseb-e-t-AWSEBLoa-1HJDEDPG7Q729
2015-01-05 12:36:04	INFO	Created security group named: awseb-e-t4mprz5myi-stack-AWSEBSecurityGroup-1XW8NESWTZ1JD
2015-01-05 12:36:08	INFO	Created Auto Scaling launch configuration named: awseb-e-t4mprz5myi-stack-AWSEBAutoScalingLaunchConfiguration-KZQJAZH1APPM
2015-01-05 12:36:10	INFO	Created RDS database security group named: awseb-e-t4mprz5myi-stack-awsebrdsdbsecuritygroup-1u0608gzw5cmf
2015-01-05 12:36:15	INFO	Creating RDS database named: aammgm7f5g4f9w. This may take a few minutes.
2015-01-05 12:42:12	INFO	Created RDS database named: aammgm7f5g4f9w
2015-01-05 12:43:10	INFO	Waiting for EC2 instances to launch. This may take a few minutes.
2015-01-05 12:43:10	INFO	Created Auto Scaling group named: awseb-e-t4mprz5myi-stack-AWSEBAutoScalingGroup-8DBFI9BK8XCZ
2015-01-05 12:43:14	INFO	Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:964880067324:scalingPolicy:89b46226-0606-4ad5-ba8f-90a8ebb002cf:autoScalingGroupName/awseb-e-t4mprz5myi-stack-AWSEBAutoScalingGroup-8DBFI9BK8XCZ:policyName/awseb-e-t4mprz5myi-stack-AWSEBAutoScalingScaleUpPolicy-48SJ365D1WCH
2015-01-05 12:43:14	INFO	Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:964880067324:scalingPolicy:e8e10fc4-0ae7-4b97-b82a-36a81d6762b7:autoScalingGroupName/awseb-e-t4mprz5myi-stack-AWSEBAutoScalingGroup-8DBFI9BK8XCZ:policyName/awseb-e-t4mprz5myi-stack-AWSEBAutoScalingScaleDownPolicy-11DKPNV04CMC3
2015-01-05 12:43:17	INFO	Created CloudWatch alarm named: awseb-e-t4mprz5myi-stack-AWSEBCloudwatchAlarmLow-1QEX0DMHPZ6V1
2015-01-05 12:43:18	INFO	Created CloudWatch alarm named: awseb-e-t4mprz5myi-stack-AWSEBCloudwatchAlarmHigh-Z7ZBL62RLUAN
2015-01-05 12:45:21	INFO	Application available at phrase-env-33msmgzjpp.elasticbeanstalk.com.
2015-01-05 12:45:21	INFO	Successfully launched environment: phrase-env
Application is available at "phrase-env-33msmgzjpp.elasticbeanstalk.com".

開始中

eb_start01

開始完了

eb_start02

4.3 ステータスの確認

Health が Green になっていることを確認し、URLへアクセス

(virtualenv)[piroto@localhost phrase]$ eb status --verbose
Retrieving status of environment "phrase-env".
URL		: phrase-env-33msmgzjpp.elasticbeanstalk.com
Status		: Ready
Health		: Green
Environment Name: phrase-env
Environment ID	: e-t4mprz5myi
Environment Tier: WebServer::Standard::1.0
Solution Stack	: 64bit Amazon Linux 2014.09 v1.0.9 running Python 2.7
Version Label	: git-5eaefd29ad55d349898717035dfb9dfdbd911363-1420428920184
Date Created	: 2015-01-05 12:35:26
Date Updated	: 2015-01-05 12:59:22
Description	: 

RDS Database: AWSEBRDSDatabase | aammgm7f5g4f9w.cg2osea7qez8.ap-northeast-1.rds.amazonaws.com:3306
Database Engine:	mysql 5.5.40
Allocated Storage:	5
Instance Class:		db.t1.micro
Multi AZ:		False
Master Username:	ebroot
Creation Time:		2015-01-05 12:39:30
DB Instance Status:	available

4.4 Djangoが起動していることを確認

eb_start03

Elastic Beanstalk の操作には、その他に以下の様なコマンドがある

http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-aws-elastic-beanstalk

コマンド 内容
eb init 環境の初期設定
eb start 環境の作成を開始
eb status 環境のステータスを確認
eb update 環境の設定更新
eb stop 環境の停止
eb delete 環境の削除
eb logs 環境のログを表示
eb events 環境に関連するイベントを表示
eb branch git branchに環境をひも付け
eb push 新しいバージョンをデプロイ

5.継続デプロイ

5.1 ローカル環境での実行

プロジェクトの右クリック Run As > PyDev Django を実行

local_django01

コンソールにURLが表示されるので、ブラウザでLocal環境で起動していることを確認。

local_django02

5.2 コミットとプッシュ

ローカルで変更し、プロジェクトの右クリックから、 Team > Commit を実行した後、git aws.push を実行することで、コミットされたリポジトリの内容をEC2のサーバーに反映出来る。

(virtualenv)[piroto@localhost phrase]$ git aws.push
Updating the AWS Elastic Beanstalk environment phrase-env...
Environment update initiated successfully.

... と、一応動くようにはなったが、結構大変かつ、まだ、Adminユーザーを作成するスクリプト部分のエラー(チュートリアルではオプションとなっている) が解決出来ない。

もっと、簡単にできると思っていたのだが...

結局冬休みの自由時間をこの設定に費やすことになってしまった。

はまりながら、いくつかのトラブルシュートや知見があるので、別途まとめることとする。