導入
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超のオブジェクトで推奨)
具体例
有料の動画配信サービスを例に、3つの課題への答えを見てみましょう。
- 課題:会員だけに動画を見せたいが、バケットは公開したくない → 署名付きURL。バケットは非公開のまま、会員がアクセスした瞬間だけ「10分間有効なURL」を発行。期限が切れればリンクは無効になり、URLを他人に共有されても長くは使えない。バケット全体を公開する危険を冒さずに済む。
- 課題:海外の制作会社から数GBの動画素材をアップさせたい → Transfer Acceleration。CloudFrontのエッジ経由で、遠隔地からのアップロードを高速化。
- 課題:巨大ファイルのアップロードが途中で失敗するとやり直しが辛い → マルチパートアップロード。ファイルを分割して並列アップロードし、失敗してもそのパートだけ再送すればよい。
そして事故防止の鉄則として、バケットはパブリックアクセスブロックをデフォルト有効にし、アクセス制御は個別ACLでなくバケットポリシーで集中管理します。「非公開のまま一時公開=署名付きURL、遠隔地から高速アップ=Transfer Acceleration、巨大ファイル=マルチパート」と要件で選びます。
読んでみよう
「バケットは非公開のまま、期間限定で誰かに見せたい」→署名付きURL、「世界中から大きなファイルを速くアップロードしたい」→Transfer Acceleration、「巨大ファイルのアップロードを効率化・耐障害化したい」→マルチパートアップロード、という対応を押さえておきましょう。