Django内でファイル管理をする事も可能ですが、ファイルが多くなる事が想定される場合は外部のストレージと連携して管理した方が良い・・・という事で、AWSのS3 bucketを利用して、画像などその他ファイルを管理できるように連携を行ってみました。
前提情報
・AWS CLIは設定済み
・AWS IAMでユーザー作成済み、アクセスキーも作成済み
※AWS CLIとIAMユーザー・アクセスキーの作成は前回の記事を参考にどうぞ
・WindowsのOSで、Powershellを利用しています
インストールするモジュール
django-storagesは、djangoを外部ストレージに連携できるようにする為に必要なモジュールです。
boto3は、AWSとの連携に必要なモジュールです。
django-environは、Djangoプロジェクトのsettings.pyに機密情報を直接記載せず、envファイルから値を読み込めるようにするモジュールです。
※これらモジュールをインストールした後は、アプリケーションデプロイの時に必要なrequirements.txtを更新しておきましょう
pip install django-storages
pip install boto3
pip install django-environ
pip freeze > requirements.txt
Djangoのsettings.pyにenvironを組み込む
manage.pyがあるフォルダ層に.envファイルを作成。.envファイルの中に、機密情報を記入します。
(例)
# Database
DATABASE_URL=mysql:....
# AWS Login Info
AWS_ACCESS_KEY_ID=******
AWS_SECRET_ACCESS_KEY=******
# AWS S3 Bucket
AWS_STORAGE_BUCKET_NAME=***
AWS_S3_FILE_OVERWRITE=False
settings.pyの中には以下のようにenvironの設定と、値の読み込み、importを記述する必要があります。
import environ
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# environで.envファイルを読み込む
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))
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_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_FILE_OVERWRITE = env('AWS_S3_FILE_OVERWRITE')
# AWS Storage
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STORAGES = {
# Media file (image) management
"default": {
"BACKEND": "storages.backends.s3boto3.S3StaticStorage"
},
# CSS and JS file management
"staticfiles": {
"BACKEND": "storages.backends.s3boto3.S3StaticStorage"
},
}
コマンドラインでAWSのS3 bucketにファイルを連携させる
python manage.py collectstatic
# 上記コマンドを実行すると、下のようなメッセージが表示される。yesと回答する。
You have requested to collect static files at the destination
location as specified in your settings.
This will overwrite existing files!
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel: yes
# 連携されたファイルの数が表示される
* static files copied
AWSのS3 bucket画面で、ファイルが連携されているか確認
コンソールで確認すると、バケットの中にオブジェクト(ファイル)が無事に連携されている事が確認できました

Comments are closed