AWS S3でDjangoの静的ファイル・メディア管理【Django×AWS入門4】

はじめに

Djangoで開発したWebアプリケーションを本番環境にデプロイする際、静的ファイル(CSS、JavaScript、画像)やユーザーがアップロードするメディアファイルを適切に管理することが重要です。AWSのS3(Simple Storage Service)を利用することで、拡張性と耐久性の高いストレージを確保できます。

本記事では、AWS S3を利用してDjangoの静的ファイルとメディアファイルを管理する方法を詳しく解説します。

AWS S3の準備

1. S3バケットの作成

  1. AWSマネジメントコンソールにログイン
  2. 「S3」サービスを開く
  3. 「バケットを作成」ボタンをクリック
  4. バケット名を入力(例:my-django-static-files)
  5. リージョンを選択(例:us-east-1)
  6. パブリックアクセスの設定を適切に管理(推奨は非公開)
  7. 「作成」ボタンをクリックし、バケットを作成

2. IAMユーザーの作成と権限付与

  1. AWSマネジメントコンソールで「IAM」サービスを開く
  2. 「ユーザーの作成」をクリック
  3. 「プログラムによるアクセス」を有効化
  4. 「次のステップ:アクセス許可」をクリック
  5. 「ポリシーのアタッチ」で「AmazonS3FullAccess」を選択
  6. ユーザーを作成し、アクセスキーとシークレットキーを取得

Djangoの設定変更

1. 必要なパッケージのインストール

AWS S3をDjangoで利用するために、boto3django-storagesをインストールします。

pip install boto3 django-storages

2. settings.pyの設定

Djangoの設定ファイルを編集し、S3をストレージとして利用できるように設定します。

INSTALLED_APPSstorages を追加

INSTALLED_APPS = [
    ...
    'storages',
]

AWS S3 の認証情報を設定

AWS_ACCESS_KEY_ID = 'your-access-key'
AWS_SECRET_ACCESS_KEY = 'your-secret-key'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'
AWS_S3_REGION_NAME = 'us-east-1'  # 適宜変更
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'

3. 静的ファイル(STATICFILES)をS3に保存する設定

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'

この設定により、collectstatic コマンド実行時にDjangoの静的ファイルがS3にアップロードされます。

4. メディアファイル(MEDIA)をS3に保存する設定

メディアファイル用のカスタムストレージバックエンドを作成します。

storages_backends.py ファイルの作成(myapp/storages_backends.py

from storages.backends.s3boto3 import S3Boto3Storage

class MediaStorage(S3Boto3Storage):
    location = 'media'
    file_overwrite = False

settings.py にメディアファイルの設定を追加

DEFAULT_FILE_STORAGE = 'myapp.storages_backends.MediaStorage'
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'

S3に静的ファイルをアップロード

設定が完了したら、collectstatic コマンドを実行し、静的ファイルをS3にアップロードします。

python manage.py collectstatic

S3のパーミッション設定

S3バケットのアクセス権を適切に設定し、Djangoアプリケーションがファイルを読み込めるようにします。

1. バケットポリシーの設定

S3バケットの「アクセス許可」タブから、バケットポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}

この設定により、静的ファイルの読み込みが可能になります。

2. CORSポリシーの設定

S3バケットの「CORS設定」に以下を追加し、CORS制限を適用します。

[
    {
        "AllowedHeaders": ["*"],
        "AllowedMethods": ["GET", "HEAD"],
        "AllowedOrigins": ["*"]
    }
]

動作確認

1. アップロードされた静的ファイルを確認

ブラウザで以下のURLにアクセスし、ファイルが正常に表示されるか確認します。

https://your-bucket-name.s3.amazonaws.com/static/<your-static-file>

2. メディアファイルのアップロード確認

Djangoの管理画面などからファイルをアップロードし、S3に正しく保存されているか確認します。

https://your-bucket-name.s3.amazonaws.com/media/<your-media-file>

まとめ

本記事では、AWS S3を利用してDjangoの静的ファイルとメディアファイルを管理する方法を解説しました。

  1. AWS S3バケットの作成とIAMユーザー設定
  2. django-storagesboto3 を使用したDjangoの設定
  3. 静的ファイルとメディアファイルの管理方法
  4. S3のパーミッションとCORS設定

S3を活用することで、Djangoアプリのパフォーマンスを向上させ、スケーラブルなアプリケーションの運用が可能になります。