DjangoのstaticをS3へ

2022/03 の作業


前回、S3のバケットを設定したので、static をそっちにする。


1.boto3 インストール

S3 と連携する為に、boto3 をインストール。

(work_venv) $ pip install boto3


2.Django の S3 の設定

base.py のアプリケーションに storages を追加。

prod.py に S3 へアクセスする情報や、Django が出す画面の URL 等の設定。

(work_venv) $ vi worksite/worksite/settings/base.py 
・・・・
INSTALLED_APPS = [ 
・・・・
    # boto3 
   'storages',
]
・・・・

(work_venv) $ vi worksite/worksite/settings/prod.py 
・・・・
# バケット名
AWS_STORAGE_BUCKET_NAME = 'work-bucket'
AWS_ACCESS_KEY_ID = 'アクセスキーID'
AWS_SECRET_ACCESS_KEY = 'シークレットアクセスキー'
# パブリックアクセス時のバケットのドメイン
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

# static
# バケット直下のディレクトリ
AWS_LOCATION = 'static'
# パブリックアクセス時のURL
STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
・・・・



3.static ファイルの S3 への配置

collectstatic すると、S3 のバケットの下に static ファイルがコピーされる。

prod.py の AWS_LOCATION の下にコピーされる。

(work_venv) $ python manage.py collectstatic --settings worksite.settings.prod


4.NGINX の設定

NGINX の static を無効化して、EC2 側の static へのアクセスは不要なので、アクセスできない様にしておく。

それと、CSP の設定にバケットの URL を追加する。

$ sudo vi /etc/nginx/sites-available/worksite_nginx.conf
・・・・
    add_header Content-Security-Policy "・・・・ script-src ・・・・ https://work-bucket.s3.amazonaws.com; img-src ・・・・ https://work-bucket.s3.amazonaws.com; style-src ・・・・ https://work-bucket.s3.amazonaws.com; font-src https://work-bucket.s3.amazonaws.com; ・・・・";
・・・・
    location /static {  
    # alias /home/wagtail_user/worksite/static; 
    return 444;
    }
・・・・


スタイルシートの編集等するんで、static は S3 にしておかなくて良かった様な気がする。