AWS EC2 + RDS 環境で Django, syncdbするところまで

 

AWS EC2にインスタンスAmazon Linux)を作成し、そこでDjangoアプリケーションを開発する環境を整えました。

まぁ、EC2の環境に作ろうが作るまいが、要はLinux環境に作るって事なので、分かっている人にはなんてことはない簡単すぎる内容ですが、僕と同じような初心者の誰かが、少しでも楽できればと思いメモ書きを残します。

 

MySQLを使えるようにする

EC2でつくったばかりのインスタンスにはMySQLは入っていません。RDSを使うからいいや、という分けにも実際はいかないので(mysqlコマンドはいずれ必要)、まずはMySQLそのものをインストールしたいと思います。

MySQLまだインストールされていないこと、および利用可能なパッケージをyumコマンドでチェックし、特に問題なければインストールします。

$ yum info mysql
利用可能なパッケージ 
名前       : mysql 
バージョン    : 5.5

インストールされている場合は「インストール済みのパッケージ」と表示されますが、「利用可能なパッケージ」となっているのでまだインストールされていない事がわかります。では早速インストールしましょう。

$ sudo yum install mysql
(省略)
インストール:
mysql.noarch 0:5.5-1.6.amzn1
(省略)
完了しました!

次に、DjangoMySQLを使用するには、MySQLPythonインタフェースであるMySQLdbが必要になります。 このタイミングでインストールしておきたいと思います。(別に後でも全然問題ないです)

これまでと同様に、まずはMySQLdbについてyumコマンドで念のため確認しみてみます。

利用可能なパッケージ
名前       : MySQL-python
バージョン    : 1.2.3

Djangoに必要なバージョンであることを確認できたのでインストールします。

$ sudo yum install MySQL-python
(省略)
インストール:
MySQL-python.x86_64 0:1.2.3-0.3.c1.1.9.amzn1
依存性関連をインストールしました:
mysql55-libs.x86_64 0:5.5.38-1.0.amzn1
完了しました!

RDSのMySQLをつなぐ

RDSのデータベースを利用するには、RDSでDBインスタンスを作った後に、EC2のインスタンスのポートをRDS用に開く必要があります。

(素人なので、EC2のヘルプドキュメントを何回も読み直してようやく接続ができたので誰かの検索の役に立てればいいなと思います。)

RDSのDBインスタンス起動(登録)

RDSにDBインスタンスを登録するところは、こちらのドキュメントから読み進めるとできます。

ただ、先ほども書いたように、EC2インスタンスから接続するには、DBセキュリティグループのポートを開いてあげる必要があります。
設定は、EC2コンソール画面の左のメニューの"Security Groups"から、該当するDBセキュリティグループを選択し、Inboundルールで、MySQLの"3306"を開いてあげれば完了です。

f:id:junseis:20140708001455p:plain

RDSのDBインスタンスへの接続

ここまでできたら、実際にEC2インスタンスからRDSのDBへ接続できるか、mysqlコマンドで試してみましょう。

まずは、DBインスタンスのEndpointを確認してください。これがそのDBのホスト名になります。

f:id:junseis:20140708003116p:plain

EC2のインスタンスにログインして、以下のコマンドで問題なく接続できればOKです。

$ mysql -h *****.****.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 61
Server version: 5.6.17-log 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>

Djangoをインストールする

OSがLinuxなのでPythonは入っているはずですが、PythonのWebフレームワークであるDjangoを動かすには、2014年6月現在Python2.5~2.7のバージョンが必要です。
Pythonがインストールされているということを確認すると同時にバージョンも問題ない事を一応チェックしておきたいと思います。

$ yum info python
インストール済みパッケージ
名前    : python
バージョン : 2.6

インストール済みのPythonのバージョンは問題ないようなので、Djangoをインストールします。

Python関連はpipで管理するのが簡単なのでpipコマンドを叩こうとするも、インスタンスを作った状態ではそもそもpython-pipがインストールされていません。確認してみましょう。

$ yum info python-pip
利用可能なパッケージ
名前       : python-pip
バージョン    : 1.3.1

ということで、まずpipをインストールしてから、Djangoパッケージをインストールします。

$ sudo yum install python-pip

次にDjangoをインストール。

$ sudo pip install django

できました。要はこの環境へのインストールであれば、pipとDjangoのインストールを2行のコマンドでやれば済むということになりますね。

DjangoMySQLを使うプロジェクトを立ち上げてsyncdbする

ここから先は、Djangoチュートリアルドキュメントを見ながら進めていきます。settings.pyにRDSにて起動したMySQLの情報を正しく設定すれば、syncdbできるようになるはずです。

まずは、Djangoでプロジェクトを立ち上げます。(≒「よし、Webアプリ作るぞ!」みたいなもんです)

$ django-admin.py startproject hoge
hoge:適当なプロジェクト名つけてくださいね
生成されるフォルダはこんな感じ:
hoge/
 |- manage.py
 |- hoge/
     |- __init__.py
     |- settings.py
     |- urls.py
     |- wsgi.py

いろいろ省略しますが、設定ファイルのsettings.pyで、DATABASESのところにデータベースエンジン(今回はMySQLを使用)やRDSで起動したMySQLの情報を入力します。(settings.pyの詳細はチュートリアルドキュメントをご覧ください) 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '<db_name>',
        'HOST': '****.*****.ap-northeast-1.rds.amazonaws.com',
        'USER': '<user>',
        'PASSWORD': '<password>',
    }
}
<db_name>:データベースの名前(RDSで"DB Name"の箇所)
'HOST':前述したEndpointのポート番号の部分を除いた文字列
<user>:管理ユーザ名(RDSで"Username"の箇所)
<password>:管理ユーザのパスワード

他にもsettings.pyのINSTALLED_APPSなど必要に応じて編集していただき準備が整ったら、一番上のhogeの階層でmanage.pyをたたいてください。

INSTALLED_APPSの設定にもよりますが、指定した(もしくはデフォルトの状態からコメントアウトしていない)アプリに関係するデータベーステーブルが作成されます。

いくつかCreating〜というコメントが出て、途中で場合によってはスーパーユーザの登録を聞かれつつ、データベーステーブルが自動でRDSのMySQLに作成されます。

$ python manage.py syncdb
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
(省略)

正しくsettings.pyが設定されていない場合は、いろいろエラーが出ますが、無事にsyncdbは完了しましたでしょうか?上の方でやったRDSのMySQLに接続して、テーブルができているか確認したいと思います。

$ mysql -h *****.****.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p

パスワードを入れたら、MySQLのプロンプトが出てくるので、ここから先はMySQLのコマンドをたたいていきましょう。

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| <db_name>          |
| performance_schema |
+--------------------+

<db_name>というのが自分が今回作ったデータベースなので、それに切り替えます。

mysql> use <db_name>;
Database changed

最後に、いよいよテーブルを確認しましょう。

mysql> show tables;
+----------------------------+
| Tables_in_officedb         |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
(省略)
+----------------------------+

という訳で、無事にRDSのMySQLにつながって、syncdbができました!

ここから先は、ひたすらDjangoのドキュメントにしたがっていろいろ試してみてください!

では!