Elastic Bean stalk で、django+s3+postgresqlをデプロイする。 中編
概要
Elastic Bean stalk で、django+s3+postgresqlをデプロイする。中編
参考サイト
S3の設定
やってみたこと
S3の設定をする。
staticfileを設定するために、S3の設定をする。
S3で、bucket を作成・設定する
S3でbucketを作成したら、バケットポリシーの追加と、Static Website Hostingを有効にする。
バケットポリシー例
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::[バケット名]", "arn:aws:s3:::[バケット名]*" ] } ] }
Static Website Hostingを有効 のインデックスドキュメント
index.html
django-storageと、botoをinstallする
$ pip install django-storages boto
また、django-storageは、storage
としてsettings.INSTALLED_APPに追加しておく。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ... 'storages', ]
settings.pyにS3の情報をセットする。
STATIC_URL = 'https://[s3のエンドポイントのurl]/' # collectstaic時にS3を使う STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage' # 作成したS3バケットの名前 AWS_STORAGE_BUCKET_NAME = 'S3のバケット名' AWS_S3_HOST = 's3-ap-northeast-1.amazonaws.com'(←S3のバケットのホスト(リージョンにより変わる)) # これをTrueにしたほうがファイル変更のチェックが速くなる AWS_PRELOAD_METADATA = True
以下は環境変数の.envにセットする
AWS_ACCESS_KEY_ID = '***************' AWS_SECRET_ACCESS_KEY = '**************'
localでまずは試してみる。
$ python manage.py collectstatic
無事collectされた!
eb deployしてみる。
一応$ pip freeze > requirements.txt
でrequirements.txtを更新しておく。
$ git add . $ git commit -m "S3追加" $ eb deploy
無事できた!
最終的なsettings.pyのS3周りのコードの例
今回は、こんな感じでlocalとeb環境を分けて設定してみた。
if 'RDS_DB_NAME' in os.environ: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', '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'], } } STATIC_URL = 'https://eb用のバケット名.s3-website-ap-northeast-1.amazonaws.com/' STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage' AWS_STORAGE_BUCKET_NAME = 'eb用のバケット名' else: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': '*****', 'USER': '****', 'PASSWORD': '*******', 'HOST': 'localhost', 'PORT': '5432', } } STATIC_URL = 'https://localのバケット名.s3-website-ap-northeast-1.amazonaws.com/' STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage' AWS_STORAGE_BUCKET_NAME = 'localのバケット名' #以下は共通の設定 AWS_S3_HOST = 's3-ap-northeast-1.amazonaws.com' AWS_PRELOAD_METADATA = True
この辺りはherokuと全く同じだったから、herokuと同じ要領で設定できたな。