Django最新バージョンでAWS S3に画像を保存する方法2025年版(備忘録)
初投稿です
勉強がてらにDjangoでPWAアプリを作る中で、画像をAWS S3に保存してみようと思い挑戦しますが、日本語での情報が少ないことと、ChetGPTが今回のトピックで使い物にならず(古い情報ばかり)、かなりの時間を費やしたのでやり方を共有しておきたいと思います!
最後のほうに参考にしたページを張っておきます!(結局公式ドキュメント見れば一発)
Django4.2以降は書き方が変わったらしい
以前の書き方
# settings.py
AWS_STORAGE_BUCKET_NAME = S3のバケット名
AWS_S3_REGION_NAME = バケットのリージョン
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
"""ここが問題!!!!"""
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
"""!!!!!!"""
[重要]新しいバージョンのDjangoでの書き方
STORAGES = {
"default": {
"BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
"OPTIONS": {
"bucket_name": "your-bucket-name",
"access_key": "your-access-key",
"secret_key": "your-secret-key",
"location": "media/images", # ここでディレクトリを指定
},
},
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
},
}
前までDEFAULT_FILE_STORAGEで指定していたストレージエンジンをSTORAGESに書きます
実際に動いたコードです↓2025/1/20現在
import os
from dotenv import load_dotenv
load_dotenv()
"""AWS S3の設定"""
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME = os.getenv('AWS_S3_REGION_NAME')
AWS_S3_SIGNATURE_VERSION = 's3v4'
STORAGES = {
# メディアファイルはS3ストレージ
"default": {
"BACKEND": "storages.backends.s3.S3Storage",
"OPTIONS": {
"location": "media/images",
},
},
# 静的ファイルはローカルストレージ
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
},
}
MEDIA_URL = f"https://{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com/media/"
# """古のMedia設定 Django ver.4.2以降からはSTORAGESでないと動かない"""
# MEDIA_URL = "/media/"
# MEDIA_ROOT = os.path.join(BASE_DIR, "media")
#DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
"""Staticの設定"""
STATIC_URL = "/static/"
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'frontend', 'static'),
]
今回やりたかったこと
画像だけS3に保存して、Static(cssやjs、PWAで使用するjsonなど)はローカルで管理したいと思っていました。
参考にしたサイト
↓公式ドキュメント
https://docs.djangoproject.com/en/4.2/ref/settings/#std-setting-STORAGES
↓STORAGESをきれいに書くには?的な議論
https://forum.djangoproject.com/t/storage-4-2-how-to-subclass-default/29190/3