環境
Django 4.2.18
Python 3.8.10
はじめに
AWS利用のための事前準備をします。
- AWSにサインアップする(ルートユーザーの作成)
- IAMユーザーを作成する
- (ルートユーザーで)グループを作りポリシーに AdministratorAccess を設定する
AWSの1年間無料枠を使用しました。
Amazon S3のバケットを準備する
AWSにIAMユーザーでログインします。
S3>バケットを作成>アプリ名など任意の名前(ただし一意の値)>他はデフォルトのまま>作成
バケット名(BUCKET_NAME) は一意の値。ここでは'issue-management0'とします。
DjangoからAmazon S3に接続する
require.txtに以下を追記して保存
django-storages==1.14.6
boto3==1.26.0
最新バージョンはここで調べます。
https://pypi.org/project/django-storages/
インストール実行
pip install -r requirements.txt
最新バージョンでインストールに失敗する場合は、古いバージョンで試します。
Django settings.pyの変更
""" 添付ファイルの設定 """
MEDIA_URL = '/media/'
# DEBUG = Trueの時はローカルに保存する
if DEBUG:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
# AWS S3の設定
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_STORAGE_BUCKET_NAME = 'issue-management0'
AWS_S3_REGION_NAME = 'ap-northeast-1'
AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY')
フォルダ構成はこうです。
(mediaフォルダも.gitignoreに入れています。)
AWSのアクセスキーID、シークレットアクセスキーを発行する
IAMユーザーでログインします。
IAM>ユーザー>(あなたのユーザー名)>アクセスキーを作成>ローカルコードを選択>次へ>説明タグを設定(英語のみ)>アクセスキーを作成
これでアクセスキーID、シークレットアクセスキーが作成できました。
環境変数に書く
アプリに設定します。
重要な情報なので、直接コードに書かず環境変数に入れます。
# AWSの設定
AWS_ACCESS_KEY_ID=****** # あなたのID
AWS_SECRET_ACCESS_KEY=****** # あなたのアクセスキー
Amazon S3にファイルを登録する
まずローカルでrunserver して画像アップロードを試します。
試すときは、一時的に settings.py で if → if not にして試します。(True/False を反対にしています)
""" 添付ファイルの設定 """
MEDIA_URL = '/media/'
# DEBUG = Trueの時はローカルに保存する
- if DEBUG:
+ if not DEBUG:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
# AWS S3の設定
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_STORAGE_BUCKET_NAME = 'issue-management0'
AWS_S3_REGION_NAME = 'ap-northeast-1'
AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY')
アップロードファイルのアドレス欄にawsが表示されます。
また、Amazon S3>バケット>(バケット名)を見ると画像が登録されています。
テスト後、本番環境にアップする前、
if → if not にして試したコードを元に戻しておきましょう。
本番環境にデプロイ
render にデプロイして本番環境で登録しました。
下記の種類を試し、アップロードできました。
[".txt", ".pdf", ".docx", ".xlsx", ".png", ".jpg", ".jpeg"]
".docx", ".xlsx" はPCにダウンロードされました。※ブラウザ(Chrome)の仕様かもしれません。
注意
アプリ上で画像を削除すると、バケットの中身も削除されます。
参考
こちらを参考にさせていただきました。