S3・ストレージ
Amazon S3(Simple Storage Service)は、業界をリードするスケーラビリティ、データ可用性、セキュリティ、パフォーマンスを提供するオブジェクトストレージサービスです。ここではS3を中心に、EBS、EFSなどAWSの主要ストレージサービスの特徴と使い分けを学びます。
所要時間
約40分
学べること
- AWSストレージサービスの全体像と使い分け
- S3の基本概念(バケット、オブジェクト、キー)
- ストレージクラスによるコスト最適化
- バケットポリシーとアクセス制御
- S3暗号化の種類と選択基準
- EBS、EFSの特徴 とユースケース
- IDサービスにおけるストレージ活用パターン
前提知識
- AWSの基本概念(リージョン、アベイラビリティゾーン)
- IAMの基礎知識(ポリシー、ロール)
- HTTPプロトコルの基礎
目次
- AWSストレージサービスの全体像
- S3の基本概念
- S3ストレージクラス
- バケットポリシーとアクセス制御
- S3暗号化
- バージョニングとライフサイクルルール
- S3 Object Lock(改ざん防止)
- S3イベント通知
- Athena(S3データ分析)
- Glue(データカタログ・ETL)
- EBS(ブロックストレージ)
- EFS(マネージドNFS)
- IDサービスでの活用
- まとめ
1. AWSストレージサービスの全体像
AWSは3つのカテゴリのストレージサービスを提供しています。
| カテゴリ | サービス | タイプ | アクセス方法 | ユースケース |
|---|---|---|---|---|
| オブジェクト | Amazon S3 | オブジェクト | HTTP API | ファイル保存、バックアップ、静的サイト |
| ブロック | Amazon EBS | ブロック | EC2にアタッチ | データベース、OS |
| ファイル | Amazon EFS | ファイル(NFS) | NFSマウント | 共有ファイルシステム |
| ファイル | Amazon FSx | ファイル | SMB/NFS/Lustre | Windows共有、HPC |
ストレージタイプの違い
オブジェクトストレージ(S3):
┌──────────────────────────────┐
│ Key: logs/2026/03/audit.json │
│ Value: {オブジェクトデータ} │
│ Metadata: Content-Type, ... │
│ │
│ → フラットな名前空間 │
│ → HTTPでアクセス │
│ → 変更は全体の上書き │
└──────────────────────────────┘
ブロックストレージ(EBS):
┌───┬───┬───┬───┬───┬───┬───┐
│ B1│ B2│ B3│ B4│ B5│ B6│...│
└───┴───┴───┴───┴───┴───┴───┘
→ 固定サイズのブロック単位
→ ファイルシステムを構築
→ ブロック単位で更新可能
ファイルストレージ(EFS):
/
├── config/
│ └── app.conf
├── data/
│ └── users.dat
→ 階層的なディレクトリ構造
→ 複数EC2から同時マウント可能
2. S3の基本概念
バケットとオブジェクト
S3はバケット(コンテナ)にオブジェクト(ファイル)を格納するシンプルなモデルです。
S3の構造:
バケット: idp-production-config
┌─────────────────────────────────────┐
│ │
│ オブジェクト: │
│ ├── tenants/tenant-001/config.json │
│ ├── tenants/tenant-002/config.json │
│ ├── keys/signing-key.pem │
│ └── templates/email/welcome.html │
│ │
│ バケット名: グローバルに一意 │
│ リージョン: ap-northeast-1 │
│ オブジェクト最大サイズ: 5TB │
└─────────────────────────────────────┘
オブジェクトの構成要素
| 要素 | 説明 | 例 |
|---|---|---|
| キー | オブジェクトの識別子(パス) | tenants/001/config.json |
| 値 | オブジェクトのデータ本体 | JSONファイルの内容 |
| バージョンID | バージョニング有効時の識別子 | 3sL4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY |
| メタデータ | オブジェクトに付与する属性 | Content-Type: application/json |
| アクセス制御 | 所有者、権限設定 | バケットポリシー、ACL |
S3の操作例
# バケット作成
aws s3 mb s3://idp-production-config --region ap-northeast-1
# オブジェクトのアップロード
aws s3 cp tenant-config.json s3://idp-production-config/tenants/001/config.json
# オブジェクトの一覧
aws s3 ls s3://idp-production-config/tenants/ --recursive
# オブジェクトのダウンロード
aws s3 cp s3://idp-production-config/tenants/001/config.json ./local-config.json
# プレフィックスでの一括同期
aws s3 sync ./config/ s3://idp-production-config/tenants/ --delete
S3の整合性モデル
S3は2020年12月以降、全てのオペレーションで強い整合性(strong consistency)を提供しています。
| オペレーション | 整合性 |
|---|---|
| PUT(新規) | 即時の強い整合性 |
| PUT(上書き) | 即時の強い整合性 |
| DELETE | 即時の強い整合性 |
| LIST | 即時の強い整合性 |
3. S3ストレージクラス
S3はアクセス頻度とコスト要件に応じた複数のストレージクラスを提供しています。
| ストレージクラス | 可用性 | 最小保存期間 | 取り出し時間 | GB/月コスト | ユースケース |
|---|---|---|---|---|---|
| Standard | 99.99% | なし | 即時 | $0.025 | 頻繁にアクセスするデータ |
| Intelligent-Tiering | 99.9% | なし | 即時 | $0.025〜 | アクセスパターン不明 |
| Standard-IA | 99.9% | 30日 | 即時 | $0.0138 | 低頻度アクセス |
| One Zone-IA | 99.5% | 30日 | 即時 | $0.011 | 再作成可能なデータ |
| Glacier Instant | 99.9% | 90日 | 即時 | $0.005 | 即時取り出し必要なアーカイブ |
| Glacier Flexible | 99.99% | 90日 | 分〜12時間 | $0.0045 | バックアップ、アーカイブ |
| Glacier Deep Archive | 99.99% | 180日 | 12〜48時間 | $0.002 | 長期保存、コンプライアンス |
最小保存期間とは
最小保存期間は「そのストレージクラスに置いた時点で、最低この日数分の保存料金が発生する」という課金ルールです。実際にデータを保存し続ける義務ではなく、早期削除しても課金されるという意味です。
例: Standard-IA(最小保存期間 30日)に置いたファイルを5日で削除した場合
実際の保存: ████░░░░░░░░░░░░░░░ ░░░░░░░░░░░ 5日間
課金される: ██████████████████████████████ 30日間分
↑ 残り25日分は「早期削除料金」として請求
例: S3 Standard(最小保存期間なし)なら5日で削除すれば5日分の課金のみ
| シナリオ | 結果 |
|---|---|
| Glacier Flexible(90日)に置いて30日で削除 | 90日分の保存料金が発生 |
| Standard-IA(30日)に置いて60日で削除 | 60日分の保存料金(最小保存期間を超えているため通常課金) |
| Standard(なし)に置いて1日で削除 | 1日分の保存料金のみ |
注意: ライフサイクルルールで自動遷移する場合も同様です。Standard → Standard-IA への遷移を「作成後7日」に設定すると、Standard-IAの最小保存期間30日を満たす前に次のクラスに遷移してしまい、想定外のコストが発生します。
推奨: ライフサイクル遷移は最小保存期間以上の間隔で設定する
Standard ──30日以上──▶ Standard-IA ──90日以上──▶ Glacier Flexible ──180日以上──▶ Deep Archive
ストレージクラスの選定フロー
データのアクセス頻度は?
├── 頻繁(日次以上)
│ └── S3 Standard
├── 不明・変動する
│ └── S3 Intelligent-Tiering(自動最適化)
├── 低頻度(月次程度)
│ └── 複数AZの耐久性が必要?
│ ├── Yes → S3 Standard-IA
│ └── No → S3 One Zone-IA
├── アーカイブ(年次以下)
│ └── 即時取り出しが必要?
│ ├── Yes → Glacier Instant Retrieval
│ └── No → Glacier Flexible Retrieval
└── 長期保存(コンプライアンス)
└── Glacier Deep Archive
4. バケットポリシーとアクセス制御
アクセス制御の方式
S3のアクセス制御は複数のメカニズムを組み合わせて実現します。
| 方式 | 適用レベル | 制御対象 | 推奨度 |
|---|---|---|---|
| バケットポリシー | バケット | 誰がアクセスできるか | 推奨 |
| IAMポリシー | ユーザー/ロール | 何にアクセスできるか | 推奨 |
| ACL | バケット/オブジェクト | レガシーな権限設定 | 非推奨 |
| パブリックアクセスブロック | アカウント/バケット | 公開アクセスの一括制御 | 必須 |
バケットポリシーの例
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowIdpServerAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/idp-server-role"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::idp-production-config",
"arn:aws:s3:::idp-production-config/tenants/*"
]
},
{
"Sid": "DenyUnencryptedTransport",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::idp-production-config",
"arn:aws:s3:::idp-production-config/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
パブリックアクセスブロック
セキュリティのベストプラクティスとして、全てのバケットでパブリックアクセスブロックを有効にします。
# アカウントレベルでパブリックアクセスをブロック
aws s3control put-public-access-block \
--account-id 123456789012 \
--public-access-block-configuration \
BlockPublicAcls=true,\
IgnorePublicAcls=true,\
BlockPublicPolicy=true,\
RestrictPublicBuckets=true
5. S3暗号化
サーバーサイド暗号化の種類
| 暗号化方式 | 鍵の管理 | コスト | ユースケース |
|---|---|---|---|
| SSE-S3 | AWSが管理 | 無料 | 基本的な暗号化要件 |
| SSE-KMS | KMSで管理 | KMS料金 | 監査ログ、アクセス制御が必要 |
| SSE-C | 顧客が提供 | 無料 | 独自鍵管理が必須 |
| CSE | クライアント側 | 無料 | エンドツーエンド暗号化 |
暗号化の処理フロー
SSE-KMS の場合:
アップロード時:
┌────────┐ PUT + データ ┌──────┐ 鍵要求 ┌──────┐
│ Client │ ──────────────→ │ S3 │ ────────→ │ KMS │
│ │ │ │ ←──────── │ │
│ │ │ │ データキー │ │
│ │ │ │ └──────┘
│ │ │ │
│ │ │ データキーで暗号化 │
│ │ │ 暗号化データ + 暗号化されたデータキーを保存
└────────┘ └──────┘
ダウンロード時:
┌────────┐ GET ┌──────┐ 復号要求 ┌──────┐
│ Client │ ──────────────→ │ S3 │ ────────→ │ KMS │
│ │ │ │ ←──────── │ │
│ │ ←────────────── │ │ データキー │ │
│ │ 復号データ │ │ └──────┘
└────────┘ └──────┘