2009-10-05

EC2 で Django を動かした その2

前回のつづき。



開発サーバと本番サーバの設定



IBM developerWorks の記事のリスト9にあるように、settings.py を開発サーバと本番サーバを if 文で分けておきます。



import socket
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

if socket.gethostname().startswith('mylocalhost'):
    DEBUG = True
    DATABASE_ENGINE = 'sqlite3'
    DATABASE_NAME = 'data.sqlite'
    ...
else:
    DEBUG = FALSE
    DATABASE_ENGINE = 'mysql'
    DATABASE_NAME = 'myappdata'
    DATABSEE_USER = 'myname'
    DATABASE_PASSWORD = 'mypassword'
    ...




のように書きます。私の場合は、データベースの設定くらいしか違いはありません。



デプロイするスクリプト



(生の Django ではなく)Goole App Engine のいいところは、開発コードをそのままデプロイするツールがついていることです。で、まあ、あそこまでデキはよくなくていいので、似たようなコードが欲しいなぁと思って、簡単なシェルスクリプトを書きました。



#!/bin/bash

HOST=$1
IDENTITY_FILE="/path/to/key.pem"
SRC=`dirname $(dirname $0)`
DST=root@${HOST}:/srv/django

if [ $# -eq 1 ]
then
  rsync -auvz --delete --exclude "tools" --exclude ".hg" --exclude "*~" --exclude ".DS_Store"  -e "ssh -i ${IDENTITY_FILE}" ${SRC} ${DST}
  ssh -i $IDENTITY_FILE root@${HOST} apachectl restart

else
  echo $0 host
fi


これを Django project のディレクトリと兄弟になるディレクトリ tools の中に、deploy という名前で保存しておきます。



  • /path/to/djangoproject


  • /path/to/tools/deploy


ですね。で path/to ディレクトリ内で、tools/deploy hostname で呼び出します。



まず rsync を使って、サーバ側のファイルを更新します。手元のPCは Mac なので .DS_Store ファイルを除外したり、mercurial を使っているので .hg フォルダを除外したり、Emacs を使っているのでバックアップファイル *~ を除外したりしています。



続いて本番サーバのアパッチを再起動するところまで、deploy スクリプトに任せています。



ホスト名を明示的に入力するようにしているのは、きっと将来、テスト用にサーバを作るだろうなぁと考えてのことです。EC2 を使っているので、バージョンアップをする前に、まったく同じ環境のインスタンスを立ち上げてテストするのに、ほとんどお金がかからないので。



今はまだ固定IPを取っていないのですが、人に見せられるようになったら、ドメイン取って公開する予定です。