AWS For Newbies: S3, Deduplication, and Presigned URLs
おもちゃのようなアプリを作るのはもうやめましょう。本番環境向けのシステムを作り始めましょう。
サーバーが使い捨て(disposable)であるなら、ファイルはそのディスク内に保存してはいけません。AWS S3が必要です。S3はオブジェクトストレージです。サーバーとは独立して存在します。これにより、サーバーがクラッシュしたり消失したりしても、ファイルが失われないことが保証されます。
プロフェッショナルなファイルアップロードフローの構築方法は以下の通りです:
S3 BucketsとKeysを使用する バケットはコンテナです。キーはファイルへのフルパスです。S3には実際の「フォルダ」は存在しません。フラットな構造の中でプレフィックス(prefix)を使用します。
images/やdocuments/のように、ファイルの種類ごとに整理して管理を分かりやすくできます。コンテンツの重複排除(Deduplication)を実装する 同じファイルに対して二重に料金を支払わないようにしましょう。SHA-256アルゴリズムを使用して、すべてのファイルに対して一意の指紋(fingerprint)を作成します。2人のユーザーが全く同じ画像をアップロードした場合、ハッシュ値は同一になります。S3にアップロードする前に、データベースでこのハッシュを確認してください。もしハッシュが存在する場合は、既存のファイルを再利用します。
大容量ファイルをストリーム処理する ハッシュ値を計算するためだけに、200MBのビデオをサーバーのRAMにロードしてはいけません。Node.jsのストリームを使用して、ファイルを小さなチャンク(chunk)ごとに処理します。これにより、サーバーの速度を維持し、クラッシュを防ぐことができます。
ファイルサイズ制限を強制する フロントエンドでのチェックは、あくまでユーザー体験(UX)のためであり、セキュリティ対策ではありません。サイズ制限は以下の3つのレイヤーで強制する必要があります: • UXのためのクライアントサイドでのチェック • 不適切なリクエストを早期に拒否するためのバックエンドでのバリデーション • アップロード元でサイズ超過を阻止するための、署名付きURLによるS3の条件設定
セキュリティのために署名付きURLを使用する バケットを公開(public)にしてはいけません。「Block all public access」をオンにしたままにしてください。代わりに、署名付きURLを生成します。これにより、ユーザーに対して特定の1つのファイルをアップロードするための、一時的な権限を付与できます。有効期限を設定することも可能です。小さなファイルには短い有効期限を、大容量のビデオアップロードには長い有効期限を設定しましょう。
アップロードを検証する クライアントを決して信用してはいけません。アップロード後、
HeadObjectコマンドを使用して、ファイルが実際にS3に存在するか、およびサイズが記録と一致するかを確認してください。
本番環境のフロー:
- クライアントがアップロード用URLをリクエストする。
- バックエンドがサイズ、タイプを検証し、重複がないか確認する。
- バックエンドがスコープを限定した署名付きURLを生成する。
- クライアントがS3に直接ファイルをアップロードする。
- バックエンドが
HeadObject経由でファイルの存在を確認する。
デフォルトで安全なシステムを構築しましょう。
出典: https://dev.to/surajrkhonde/aws-for-newbies-episode-2-3jg5
