この記事について
前回「基本設定編」に続き Django のファイルアップロード機能(FileField、ImageField)の使い方の解説です。今回は django-storages の使い方を Amazon S3 を例に説明します。
参考
django-storages について
django-storages
はクラウドストレージをメディアファイルの保存先に使うためのパッケージです。
django-storages 公式:github/gitdocs
対応するストレージサービス等は以下の通りです
- Amazon S3
- Azure Storage
- DropBox
- Google Cloud Storage
- Apache Libcloud
- FTP/SFTP
Amazon S3 での動作
django-storagesを利用するとメディアファイルのURLと保存先は以下の様になります。URLはAmazon S3より直接参照するものになります。
ファイルの保存先の基点 | ファイルのURLの基点 | |
---|---|---|
非利用時 | MEDIA_ROOT | MEDIA_URL |
利用時 | Amazon S3 バケット | Amazon S3 バケットのURL |
※django-storages利用時、MEDIA_ROOTとMEDIA_URLの設定は動作に影響を与えません。
セキュリティ対応
デフォルトの動作では、メディアファイルのURLはAmazon S3 の「署名付きURL発行機能(Pre-Signed URL)」を使って有効期限を付けたものになります。一定時間後(※)にアクセス不能になるURLなので、URL流出の心配はありません。
逆にURLをパーマリンクとして使いたい場合は、バケットをパブリックアクセス可能にしたうえで設定「AWS_S3_CUSTOM_DOMAIN」にバケットのURL(もしくはRoute53で取得した独自ドメイン)を指定してください。署名付きURLではなくパーマリンクになります。
※有効期限はデフォルトで1時間(3600)。AWS_QUERYSTRING_EXPIREで変更可能。
設定手順
1.Amazon上の設定
クラウド上で以下の設定を終えてください。
- Amazon S3にバケットを作成する。
- Amazon IAMでユーザーを作成する。
- Amazon IAMでグループを作成し「AmazonS3FullAccess」またはカスタムポリシーを作ってグループに割り当てる。
- 作成したユーザーをグループに所属させる。
英語ですがこちらのサイトに詳しい作業手順があります。
Djangoの接続設定として以下の情報を使います。
- ユーザーのアクセスキー
- ユーザーのシークレットキー
- バケット名
2.django-storagesのインストール
プロジェクトに「django-storages」と「boto3(Python用 Amazon SDK)」をインストールします。
pip install django-storages
pip install boto3
3.django-storagesの設定
設定ファイルにdjango-storagesを利用するための設定と1で控えておいたアクセスキー等を設定します。
INSTALLED_APPS = (
...
'storages',
...
)
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_ACCESS_KEY_ID = 'Your Access Key ID'
AWS_SECRET_ACCESS_KEY = 'Your Secret Key'
AWS_STORAGE_BUCKET_NAME = 'bucket name'
これで設定完了です。
ファイルアップロードを試すと、ファイルがAmazon S3上に保存されることが確認できると思います。django-storagesではさらにキャッシュやファイル圧縮、同名ファイルアップロード時の動作の設定が可能です。詳しくは公式ドキュメントを参考にしてください。