Djangoで静的ファイルとメディアファイルをホストするためにAWS S3バケットを使用する方法

Django Webアプリケーションを構築する場合は、静的アセットとユーザーがアップロードしたメディアファイルを効率的に処理することが重要です。

開発環境では、Djangoによってこれらのファイルが管理されます。しかし、本番環境では、さらに多くのオプションを検討する必要があります。ユーザーベースが大幅に増加し、オーディオやビデオなどのはるかに大きなファイルを扱うことになる可能性があります。

Amazon Web Services (AWS) Simple Storage Service (S3) バケットは、静的ファイルとメディアファイルをホストするための選択肢の1つです。S3をDjangoと統合することで、サーバーからのファイル管理の負担を軽減し、負荷を軽減し、アセットの配信をより高速で信頼性の高いものにすることができます。

ステップ1: AWSアカウントを作成する

AWSアカウントを持っていない場合は、AWSサイトにアクセスして新しいアカウントを作成します。

新しいAWSアカウントには、1年間、毎月5GBのS3標準ストレージに無料でアクセスできます。

ステップ2: プロジェクト用のS3バケットを作成する

  1. AWSアカウントを作成したら、ログインして上部の検索バーでS3を検索し、最初のオプションを選択します。
  2. 最初のオプションを選択すると、新しいページが表示されます。バケットを作成ボタンをクリックします:
  3. 次に、S3バケットの名前を指定します。ほとんどの設定はデフォルトのままにしておくことができます。
  4. このバケットの公開アクセスをブロックする設定セクションまで下にスクロールして、すべての公開アクセスをブロックする設定のチェックを外し、表示される警告を確認します。
  5. 完了したら、バケットを作成ボタンをクリックします。作成したS3バケットのリストが表示されたページにリダイレクトされます。

ステップ3: AWSにIAMユーザーを作成する

AWSは、IAM(アイデンティティおよびアクセス管理)と呼ばれるサービスを提供しています。これにより、AWSサービスと対話する必要がある特定の人物またはアプリケーションに対して個別のアカウントを作成できます。

作成したAWSサービスと対話する個人またはアプリケーションを表すIAMユーザーに、さまざまなレベルの権限を割り当てることができます。IAMユーザーを使用すると、各ユーザーが必要なリソースにのみアクセスでき、それ以上にはアクセスできないようにすることができます。

セキュリティ上の理由から、S3バケットと対話するためにDjangoプロジェクト用のIAMユーザーを作成する必要があります。AWSでIAMユーザーを作成するには、次の手順に従います。

  1. 検索バーにIAMと入力し、最初のオプションを選択します。新しいページが表示されます。
  2. IAMページの左側で、ユーザーを選択してから、ユーザーを追加ボタンをクリックします。別のページが開き、いくつかの情報を入力する必要があります。
  3. まず、IAMユーザーの名前を入力し、下部にある次へボタンをクリックします: 次のページで、IAMユーザーの権限レベルを選択する必要があります。次の手順に従います。
    1. まず、権限オプションセクションからポリシーを直接添付オプションを選択します。
    2. 次に、IAMユーザーの権限ポリシーを定義します。これにより、IAMユーザーが何ができるか、何ができるかが決まります。Djangoアプリにファイルをダウンロードしてアップロードできるようにするには、S3バケットへのフルアクセスを許可する必要があります。
    3. 権限ポリシーセクションで、S3FullAccessを検索してオプションを選択します。完了したら、次へボタンをクリックします。
  4. 次に、IAMユーザーのポリシーを確認し、ユーザーを作成ボタンをクリックしてIAMユーザーを作成します。

ステップ4: IAMユーザーのアクセスキーを作成する

AWSでは、アクセスキーとは、プログラムでAWSリソースを認証および安全にアクセスするために使用できる資格情報を指します。Djangoプロジェクトは、S3バケットにアクセスするためにこれらの資格情報を提供する必要があります。

次の手順は、プロジェクトのアクセスキーを生成するのに役立ちます。

  1. IAMユーザーを作成すると、ユーザーを表示するように求めるアラートメッセージが表示されます。または、ユーザー名をクリックしてユーザーを表示することもできます。
  2. 次に、セキュリティ認証情報タブを選択し、下にスクロールしてアクセスキーセクションを見つけ、アクセスキーを作成を選択します。
  3. アクセスに使用する事例を選択する必要があります。そうすることで、AWSは適切な代替オプションを推奨できます。アクセスキーには影響しません。サードパーティサービスローカルコードなどのオプションを選択して、ポップアップする警告を確認してください。完了したら、次へボタンをクリックします。
  4. 次のページで、アクセスキーの説明タグを入力し、アクセスキーを作成ボタンをクリックします。
  5. アクセスキーを作成したら、資格情報をコピーするか、CSVファイルとしてダウンロードできます。いずれにしても、このデータを安全に保管してください。

ステップ5: S3バケット用にDjangoプロジェクトを設定する

DjangoプロジェクトでS3バケットを使用するには、次のパッケージをインストールします。

  • django-storages: このパッケージは、ファイルのストレージバックエンドを定義するのに役立ちます。
  • boto3: このパッケージは、PythonプロジェクトがAWSと対話するのに役立つAWSソフトウェア開発キット(SDK)です。

ターミナルでこのコマンドを入力することで、PythonのPipパッケージマネージャーを使用して、これらのパッケージをPythonの仮想環境にインストールできます。

pip install django-storages boto3

これらのパッケージを正常にインストールしたら、settings.pyファイルを開き、インストールされたアプリにboto3を追加します。

最後に行うことは、DjangoプロジェクトがAWS S3バケットを使用するように設定することです。使用する一般的な設定を次に示します。

AWS_ACCESS_KEY_ID = 'AWS_ACCESS_KEY_ID '
AWS_SECRET_ACCESS_KEY = 'AWS_SECRET_ACCESS_KEY'
AWS_STORAGE_BUCKET_NAME = 'AWS_STORAGE_BUCKET_NAME'
AWS_S3_SIGNATURE_NAME = 's3v4',
AWS_S3_REGION_NAME = 'AWS_S3_REGION_NAME'
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
AWS_S3_VERITY = True
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

上記の構成をsettings.pyファイルに貼り付け、値を適宜置き換えます。AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを、以前にコピーまたはダウンロードしたアクセスキーと秘密アクセスキーに置き換えます。また、AWS_STORAGE_BUCKET_NAMEAWS_S3_REGION_NAMEをS3バケットとリージョンの名前に変更する必要があります。

リージョン名は、S3バケットに移動してAWSリージョン列から最後の値をコピーすることで取得できます。

ステップ6: AWSの設定をテストする

上記の手順が完了したら、ファイルをアップロードしてアプリケーションをテストする準備が整います。次のコードサンプルは、管理パネルから直接ファイルをアップロードしますが、別の場所からアップロードすることもできます。

コンテキストとして、次のようなモデルを使用できます。

class Post(models.Model):
title = models.CharField(max_length=225, blank=False, null=False)
content = models.TextField('Post Body', blank=False, null=False)
author = models.CharField(max_length=225, blank=False, null=False)
date_published = models.DateTimeField(auto_now=True)
image = models.ImageField(upload_to='posts')
def __str__(self):
return self.title

マイグレーション、管理パネルへの追加、ビューの作成など、プロジェクトに必要な操作を必ず実行してください。DjangoのMVT原則を実践していることを確認してください。

完了したら、管理パネルまたはファイルのアップロード用に作成したフォームに移動して、画像ファイルをアップロードします。

メインサイトに移動して、画像があることを確認します。ある場合は、画像を右クリックして新しいタブで画像を開くオプションを選択します。画像を含む新しいタブでは、アドレスバーが以前に作成したS3バケットを参照していることがわかります。

設定が機能していることを確認するもう1つの方法は、AWSコンソールのバケットに移動することです。そこには画像があります。

ステップ7: 静的ファイルをS3バケットに収集する

これまで、メディアファイルをS3バケットにアップロードできました。今度は、静的ファイルをアップロードする必要があります。

そのためには、これらの設定をsettings.pyファイルに追加します。

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_LOCATION = 'static'

その後、コマンドラインインターフェイス(CLI)を開き、このコマンドを実行します。

python manage.py collectstatic --noinput

すべてが機能することを確認するために、AWSコンソールでS3バケットを開きます。staticという名前のフォルダが表示されます。

AWS S3バケットをもっと活用する

AWS S3バケットの可能性は無限大です。ぜひ使い慣れて、静的Webアプリケーションのホスティングなど、他の目的でS3を使用する方法を学びましょう。

S3バケットの適切な使用方法を知っていれば、多くの時間を節約し、より優れた製品やソリューションを構築するのに役立ちます。ただし、S3がすべてのケースに適しているわけではない可能性があることも認識しておく必要があります。そのため、使用する前にプロジェクトの要件を検討してください。