読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Elastic Beanstalk で、django+nginx+uWSGI+S3を設定してデプロイしてみた

概要

Elastic Beanstalk で、django+nginx+uWSGI+S3を設定してデプロイしてみた

やってみたこと

  • S3のバケットをsettings.pyに設定(mediaとstaticを分けてみる。)
  • Dockerで動くか試してみる。
  • その設定に従って、nginxのstaticと、mediaのlocationも設定

S3のバケットをsettings.pyに設定(mediaとstaticを分けてみる。)

これは自分の過去記事を参考にやってみる。

pythonskywalker.hatenablog.com

必要なモジュールをinstallする。(django-storages boto)

$ pip install django-storages boto
$ pip freeze > app/requirements.txt

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ファイルの場所
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

STATIC_URL = "https://%s/%s/" % ("[バケット名].s3-website-ap-northeast-1.amazonaws.com", "static")
STATICFILES_STORAGE = 'website.custom_storages.StaticRootS3BotoStorage'
# localのmediaの設定
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = "https://%s/%s/" % ("[バケット名].s3-website-ap-northeast-1.amazonaws.com", "media")
DEFAULT_FILE_STORAGE = 'website.custom_storages.MediaRootS3BotoStorage'
AWS_STORAGE_BUCKET_NAME = 'バケット名'

# .envなどで渡す。
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')

AWS_S3_HOST = 's3-ap-northeast-1.amazonaws.com'
AWS_PRELOAD_METADATA = True
AWS_QUERYSTRING_AUTH = False

こんな感じで設定する。あとはcollectstaticをやってみる。

$ python manage.py collectstatic 

できた!バケットに保存された!

これでローカルではとりあえず動くことが判明。あとはこれがDockerで動くかを試すのと、nginx側で処理できるように設定する。

Dockerで動かせるか試してみる。

まずはホストPCのDockerで。。。

$ docker build -t ebdjanginx10 .
$ docker run -d -p 8000:80 ebdjanginx10

OK!動いた! Elastic Beanstalkでもいけるか確認

$ eb deploy

これもいけた!とりあえず、これでS3の設定も完了

課題・疑問

  • nginx-app.confのlocation /static, location /mediaの設定の意味ってなんなんだろう。 今回この2つを設定しなくても普通に処理できた。 多分、nginxの方で、media, staticを扱う時に必要になってくる設定だと思うんだけど、よくわかってない(^ ^;)