AWS S3 を使用して静的アセットとファイルアップロードを格納する
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年03月08日(水)
Amazon Simple Storage Service (S3) は、メディアファイル、静的アセット、ユーザーアップロードなどのアプリケーションコンテンツの保存に最適な、耐久性と可用性に優れたストアです。
dyno は一時的なファイルシステムを備えているため、静的ファイルを他の場所に保存することは Heroku アプリにとって重要です。dyno を置き換えるか、または dyno を再起動するたびに (これは毎日発生します)、アプリケーションの slug に含まれていないファイルはすべて失われます。静的ファイルの保存をアプリからオフロードするには、S3 などのストレージソリューションを使用します。
AWS アカウントを作成することなくアプリに S3 を追加するには、Bucketeer アドオンを参照してください。
概要
S3 に送信されたファイルはすべて、バケットに保存されます。バケットは (ディレクトリと同様に) トップレベルのコンテナとして機能するため、その名前はすべての S3 にわたって一意である必要があります。通常、アプリケーションのファイル、アセット、アップロードが 1 つのバケットに格納されます。アクセスキー ID とシークレットアクセスキーによって S3 API へのアクセスが管理されます。
Heroku アプリ用の S3 の設定
アプリケーションで S3 を使用できるようにするには、そのアプリケーションが AWS 資格情報と、ファイルを保存するバケットの名前にアクセスできる必要があります。
IAM ユーザーを作成して、Heroku アプリでその資格情報を使用することをお勧めします。ルート AWS 資格情報を使用することは避けてください。
資格情報を設定する
S3 資格情報は、AWS の [My Security Credentials] (マイセキュリティ資格情報) セクションで確認できます。
S3 資格情報をバージョン管理にコミットしないでください。 代わりに、環境設定で設定します。
heroku config:set
を使用して両方のキーを設定します。
$ heroku config:set AWS_ACCESS_KEY_ID=MY-ACCESS-ID AWS_SECRET_ACCESS_KEY=MY-ACCESS-KEY
Adding config vars and restarting app... done, v21
AWS_ACCESS_KEY_ID => MY-ACCESS-ID
AWS_SECRET_ACCESS_KEY => MY-ACCESS-KEY
バケットに名前を付ける
バケットを作成するには、AWS マネジメントコンソールの S3 セクションにアクセスし、米国スタンダードリージョンに新しいバケットを作成します。
最大の相互運用性を確保するために、AWS のバケット名前付け規則に従います。
バケット名を環境設定に保存して、アプリケーションがその値にアクセスできるようにします。
$ heroku config:set S3_BUCKET_NAME=example-app-assets
Adding config vars and restarting app... done, v22
S3_BUCKET_NAME => example-app-assets
静的アセットの手動でのアップロード
ビデオ、PDF、Javascript、CSS、画像ファイルなどの静的アセットは、コマンドラインまたは Amazon S3 コンソールを使用して手動で追加できます。
Heroku アプリからのファイルのアップロード
Heroku アプリから S3 へのファイルアップロードを処理および保存する方法には、直接とパススルーの 2 つがあります。具体的な手順については、言語ガイドを参照してください。
直接アップロード
直接アップロードでは、まずアプリを経由することなく、ファイルがユーザーのブラウザから S3 バケットにアップロードされます。この方法では、アプリケーションで実行する必要がある処理の量は減りますが、実装が複雑になる可能性があります。また、S3 に保存する前にファイルを変更する機能も制限されます。
パススルーアップロード
パススルーアップロードでは、ファイルがアプリにアップロードされ、次にアプリがそれを S3 にアップロードします。この方法では、S3 にプッシュする前のユーザーアップロードに対して前処理を実行できます。選択した言語やフレームワークによっては、この方法では、アップロードの実行中に他のリクエストでレイテンシーの問題が発生する場合があります。アプリを解放するようにアップロードを処理するには、バックグラウンドワーカーを使用します。
ファイルをアップロードするためのバックグラウンドワーカーを使用することをお勧めします。シングルスレッドの非イベント型環境 (Rails など) で大きなファイルをアップロードすると、アプリケーションの Web dyno がブロックされるため、リクエストタイムアウトが発生する場合があります。EventMachine、Node.js、および JVM ベースの言語は、このような問題の影響をあまり受けません。
言語固有のガイド
S3 へのアップロードを処理するための言語固有のガイドは以下のとおりです。
言語/フレームワーク | チュートリアル |
---|---|
Ruby/Rails | |
Node.js | |
Python | |
PHP |
アセットの参照
アプリケーションのコードでアセットのパブリック URL (http://s3.amazonaws.com/bucketname/filename
など) を使用できます。S3 では、これらのファイルを直接処理し、動的なリクエストのみを処理するようにアプリケーションを解放します。
ページロードを高速化するには、コンテンツ配信サービス (Amazon Cloudfront など) を使用して、代わりに静的アセットを処理することを検討してください。