S3 — オブジェクトストレージ
概要
Amazon S3 (Simple Storage Service) はファイルを「オブジェクト」単位で保存する AWS のフルマネージドストレージです。 ファイルシステムではなくキーバリュー形式で、URL(パス)にファイルを置く・取り出すだけのシンプルな API。 静的サイト配信、ログ集約、データレイク、Terraform state、バックアップなど、AWS 上のほぼ全プロジェクトで何かしら使う中核サービスです。
11 ナイン(99.999999999%)の耐久性を SLA で謳っており、「データが消える」を実用上心配しなくて済むレベル。 容量無制限・従量課金・Region ごとに完全独立。
主な機能
- バケット — オブジェクトの入れ物。AWS 全体でグローバル一意な名前。
- オブジェクト — ファイル本体 + メタデータ + キー (URL パス相当)。最大 5TB。
- Public Access Block — 「公開設定そのものを構造的に禁止」する 4 つのスイッチ。事故防止の鉄則。
- Versioning — 同キー上書きで旧バージョンが残る。誤削除復旧の鍵。
- Lifecycle — 「N 日後に削除 / Glacier に移行」を自動ルール化。コスト最適化。
- Storage Class — STANDARD / IA / Intelligent-Tiering / Glacier IR / Glacier / Deep Archive。アクセス頻度とコストのトレードオフ。
- SSE — 保存時暗号化 (SSE-S3 / SSE-KMS / SSE-C)。デフォルトで AES256 が有効。
- OAC (Origin Access Control) — CloudFront からだけ S3 を読めるようにする仕組み。OAI の後継。
- presigned URL — 「この URL を持つ人だけ一時的に GET / PUT 可能」な短命 URL。
- Replication — クロスリージョン / 同一リージョン複製。バックアップ・DR・地域別配信に。
使うべきパターン
- 静的サイト配信 — Next.js export / Jekyll / Hugo など、静的 HTML/CSS/JS の置き場。CloudFront + OAC と組合わせると非公開バケットのまま全世界配信できる。
- ログ集約 — CloudFront / ALB / CloudTrail のログ受け先。Athena でそのまま SQL クエリも可能。
- Terraform state — DynamoDB Lock と組み合わせて、チーム共有の state バックエンドに。
- バックアップ — Lifecycle で 30 日後に Glacier に移すなど、データレイヤごとにコスト最適化。
- 大容量ファイル授受 — presigned URL 発行 + クライアント直接アップロードで、Lambda やサーバを介さない設計。
使わない方が良いパターン
- 低レイテンシなデータ I/O — リクエスト 1 件あたり 100ms オーダー。DynamoDB(数 ms)や ElastiCache(マイクロ秒)の方が速い。
- 頻繁にメタデータを更新する処理 — S3 はオブジェクト更新ごとにフルアップロード。差分更新ができないので、リレーショナル / NoSQL DB の方が適切。
- POSIX 風のファイルシステム要件 — ファイルロック、ディレクトリ rename、リアルタイム共有が必要なら EFS や FSx を検討。
- 強整合性が必須なリードアフターライト — 2020 年以降は Read-After-Write 強整合性をサポートするが、オブジェクト一覧の整合性などは結果整合になる場合あり。
Terraform 最小サンプル(OAC 経由の非公開バケット)
resource "aws_s3_bucket" "site" {
bucket = "my-site-${data.aws_caller_identity.current.account_id}"
}
# 1. 公開を構造的に禁止 (4 スイッチ全 true)
resource "aws_s3_bucket_public_access_block" "site" {
bucket = aws_s3_bucket.site.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
# 2. バージョニング
resource "aws_s3_bucket_versioning" "site" {
bucket = aws_s3_bucket.site.id
versioning_configuration { status = "Enabled" }
}
# 3. SSE-S3 (AES256)
resource "aws_s3_bucket_server_side_encryption_configuration" "site" {
bucket = aws_s3_bucket.site.id
rule {
apply_server_side_encryption_by_default { sse_algorithm = "AES256" }
}
}
# 4. Lifecycle: 90 日経過で Glacier
resource "aws_s3_bucket_lifecycle_configuration" "site" {
bucket = aws_s3_bucket.site.id
rule {
id = "to-glacier"
status = "Enabled"
filter { prefix = "logs/" }
transition { days = 90; storage_class = "GLACIER" }
}
}
用語集
- バケット (Bucket)
- S3 のオブジェクト群を入れる単位。AWS 全体でグローバル一意な命名が必要。
- オブジェクト
- S3 上のファイル本体 + メタデータ + キー (URL パス相当)。1 オブジェクト 5TB まで。
- Public Access Block
- バケット / アカウント単位で「公開設定そのものを構造的に禁止」する 4 つのスイッチ。
- OAC (Origin Access Control)
- CloudFront からのみ S3 を読めるように制限する仕組み。OAI の後継、KMS 暗号化バケットや S3 以外の origin にも対応。
- Storage Class
- オブジェクトのアクセス頻度に応じた料金プラン。STANDARD / IA / Intelligent-Tiering / Glacier 系など。
- SSE-S3 / SSE-KMS
- サーバ側暗号化。SSE-S3 は AWS 管理キー (AES256)、SSE-KMS は顧客管理キー。
- presigned URL
- 一時的に有効な URL を発行し、それを持つ人だけが GET / PUT できる仕組み。クライアント直接アップロードに使う。
- Lifecycle Rule
- 「N 日経過したオブジェクトを別ストレージクラスに移す / 削除する」自動ルール。コスト最適化の基本。
- 11 ナイン
- 99.999999999% の耐久性。1 兆個のオブジェクトに対して 1 個失う頻度。