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

Djangoroidの奮闘記

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

Elastic Bean stalk で、django+s3+postgresqlをデプロイする。 中編

概要

Elastic Bean stalk で、django+s3+postgresqlをデプロイする。中編

参考サイト

realpython.com

S3の設定

orangain.hatenablog.com

やってみたこと

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と同じ要領で設定できたな。