AWSコンソールでS3を作成
- AWSのコンソールにログイン
- S3にアクセス
-
バケットを作成
をクリック -
バケット名
を入れて、後はデフォルトの設定でバケットの作成
をします。 - 作成されたバケットをクリックして詳細画面へ
- アクセス許可のタブを開きます
- Cross-Origin Resource Sharing (CORS)の中身を以下に編集します。
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"POST",
"GET",
"PUT"
],
"AllowedOrigins": [
"*"
]
}
]
AWSコンソールでIAMユーザーの作成
次にS3を操作できる権限を持ったユーザーを作るためにIAMを使います。
ユーザー名とアクセスの種類の両方に✔して次のステップへ行きます。
既存のポリシーを直接アタッチからS3
と検索してAmazonS3FulAccess
にチェックを入れます。
後は、次のステップに進み続けてユーザーを作成します。
その際にACCESS_ID
とSECRET_KEY
(重要)が出てくるのでそれを控えておいてください。
控えておかないと新しいユーザーを作成しなおさなければなりません。
必要なパッケージをインストール
$ pip install django-storages
$ pip install boto3
settings.pyの設定
INSTALLED_APPSにstorages
を追加します。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# My apps
'blog',
'searches',
# aws
'storages', #追加します。
]
settings.py
の一番下で作成したS3バケットの設定を書きます。
# S3 BUCKETS CONFIG
"""
AWS_ACCESS_KEY_ID = '***********' # Iamのuserid
AWS_SECRET_ACCESS_KEY = '**********' # Iamのuser key
AWS_STORAGE_BUCKET_NAME = 'renren-django-blog' #S3バケットの名前
AWS_S3_FILE_OVERWRITE = False #同じ名前のファイルを上書きするか?
AWS_DEFAULT_ACL = None #
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
"""
より細かい設定についてみたい方は公式ドキュメントをみてください。
実際にS3にアップロード
表示されない場合はinspectモードを起動(windowsならF12
)し、ファイルのパスを調べる
python manage.py collectstaticで自動でAmazonに上げてくれる
AWS_ACCESS_KEY_ID
やAWS_SECRET_ACCESS_KEY
等は機密情報として.env
ファイルに書きそれを参照するのが推奨されます。以下のサイトを参考にして設定してください。
参考サイト:【Django】環境変数を効率的に管理する「django-environ」の使い方
結論だけ言うとsettings.pyファイルが以下のようになります。
AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME')
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_ACCESS_KEY_ID=***********
AWS_SECRET_ACCESS_KEY=**********
AWS_STORAGE_BUCKET_NAME=**************
S3バケットへのアップロード
python manage.py collectstatic
を実行することで、今現在ローカルのstaticフォルダにあるファイルが全てS3上にアップロードされます。
mediaフォルダに画像がある場合は最初だけ手動でアップロードする必要があります。
参考
公式ドキュメント
File Storage with AWS S3 Buckets Upload | Django (3.0) Crash Course Tutorials (pt 22)