0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Django】AWS S3 ファイルアップロード

Posted at

環境

Django 4.2.18
Python 3.8.10

はじめに

AWS利用のための事前準備をします。

  • AWSにサインアップする(ルートユーザーの作成)
  • IAMユーザーを作成する
  • (ルートユーザーで)グループを作りポリシーに AdministratorAccess を設定する

AWSの1年間無料枠を使用しました。

Amazon S3のバケットを準備する

AWSにIAMユーザーでログインします。

S3>バケットを作成>アプリ名など任意の名前(ただし一意の値)>他はデフォルトのまま>作成

image.png
バケットとは、Amazon 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の変更

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に入れています。)
image.png

AWSのアクセスキーID、シークレットアクセスキーを発行する

IAMユーザーでログインします。
IAM>ユーザー>(あなたのユーザー名)>アクセスキーを作成>ローカルコードを選択>次へ>説明タグを設定(英語のみ)>アクセスキーを作成

これでアクセスキーID、シークレットアクセスキーが作成できました。

環境変数に書く

アプリに設定します。
重要な情報なので、直接コードに書かず環境変数に入れます。

.env
# AWSの設定
AWS_ACCESS_KEY_ID=****** # あなたのID
AWS_SECRET_ACCESS_KEY=****** # あなたのアクセスキー

Amazon S3にファイルを登録する

まずローカルでrunserver して画像アップロードを試します。
試すときは、一時的に settings.py で if → if not にして試します。(True/False を反対にしています)

settings.py
""" 添付ファイルの設定 """
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)の仕様かもしれません。

注意
アプリ上で画像を削除すると、バケットの中身も削除されます。

参考

こちらを参考にさせていただきました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?