導入
S3は「事実上無制限にスケールするストレージ」ですが、設計次第で性能もアクセス制御も大きく変わります。ここでは性能を引き出す工夫と、安全に公開・共有する方法を見ます。
説明
プレフィックスとリクエスト性能:S3は現在、プレフィックス(images/のようなキーの先頭部分)ごとに自動でリクエストを分散するため、以前のような「プレフィックスを分散させる」チューニングは基本的に不要になっています。ただし、非常に高いリクエストレート(1プレフィックスあたり秒間数千〜)が想定される場合は、プレフィックスを複数に分けることで並列度を上げられます。
署名付きURL(Pre-signed URL) は、バケットを非公開のまま、特定のオブジェクトに期限付きの一時アクセス権を発行する仕組みです。会員限定コンテンツの一時配布などに使います。
sequenceDiagram
participant App as アプリケーション
participant S3 as S3(非公開バケット)
participant User as エンドユーザー
App->>S3: 署名付きURLを発行依頼
S3-->>App: 期限付きURL
App-->>User: URLを渡す
User->>S3: URLで直接アクセス(期限内のみ)
アクセス制御は、原則としてバケットポリシー(IAMポリシーに準じたJSON)で管理し、事故で公開しないようパブリックアクセスブロックをデフォルトで有効にしておきます。個別オブジェクトのACLは基本的に非推奨で、バケットポリシーによる集中管理が推奨されます。
- S3 Transfer Acceleration:CloudFrontのエッジロケーションを経由して、遠隔地からのアップロードを高速化する
- マルチパートアップロード:大きなファイルを複数パートに分割して並列アップロードし、失敗時も該当パートだけ再送できる(一般に100MB超のオブジェクトで推奨)
読んでみよう
「バケットは非公開のまま、期間限定で誰かに見せたい」→署名付きURL、「世界中から大きなファイルを速くアップロードしたい」→Transfer Acceleration、「巨大ファイルのアップロードを効率化・耐障害化したい」→マルチパートアップロード、という対応を押さえておきましょう。