Amazon S3(Simple Storage Service)は、AWSが提供するスケーラブルなオブジェクトストレージサービスです。高い耐久性と可用性を備え、静的Webサイトのホスティングからデータレイク、バックアップまで幅広い用途で活用されています。この記事では、S3の基本概念からバケット作成、オブジェクト操作、バージョニング設定まで、S3を使い始めるための基礎知識を解説します。

S3の基本概念を理解する

S3を効果的に使うためには、バケット、オブジェクト、キーという3つの基本概念を正確に理解する必要があります。

オブジェクトストレージとは

S3は「オブジェクトストレージ」と呼ばれる種類のストレージです。EBSのようなブロックストレージとは異なり、ファイルを「オブジェクト」という単位で管理します。各オブジェクトはデータ本体、メタデータ、一意の識別子で構成されます。

graph TB
    subgraph "オブジェクトストレージ(S3)"
        direction TB
        O1[オブジェクト1<br/>データ + メタデータ]
        O2[オブジェクト2<br/>データ + メタデータ]
        O3[オブジェクト3<br/>データ + メタデータ]
    end
    
    subgraph "ブロックストレージ(EBS)"
        direction TB
        B1[ブロック1]
        B2[ブロック2]
        B3[ブロック3]
        B1 --- B2 --- B3
    end
    
    subgraph "ファイルストレージ(EFS)"
        direction TB
        F[ファイルシステム]
        F --> D1[ディレクトリ1]
        F --> D2[ディレクトリ2]
        D1 --> File1[ファイル1]
        D2 --> File2[ファイル2]
    end

オブジェクトストレージには以下の特徴があります。

特徴 説明
フラットな構造 階層構造を持たず、バケット内でオブジェクトを一意のキーで管理
HTTP/HTTPSアクセス REST APIを通じてアクセス可能
メタデータ 各オブジェクトに任意のメタデータを付与可能
スケーラビリティ 事実上無制限の容量を提供

バケット(Bucket)

バケットはオブジェクトを格納するコンテナです。S3にデータを保存するには、まずバケットを作成する必要があります。

バケットには以下の重要な特徴があります。

  • グローバルに一意な名前: バケット名はAWS全体で一意である必要があります
  • リージョン固有: バケットは特定のリージョンに作成されます
  • フラットな名前空間: バケット内にサブバケットは作成できません

オブジェクト(Object)

オブジェクトはS3に保存されるデータの基本単位です。画像、動画、ドキュメント、バックアップファイルなど、あらゆる種類のデータを保存できます。

graph LR
    subgraph "オブジェクトの構成要素"
        direction TB
        Key[キー<br/>reports/2026/january.pdf]
        Data[データ本体<br/>最大5TB]
        Meta[メタデータ<br/>Content-Type<br/>Last-Modified<br/>カスタムメタデータ]
        Version[バージョンID<br/>任意]
    end

オブジェクトの主な特性は以下の通りです。

項目 制限・仕様
最大サイズ 5TB
単一PUTの上限 5GB(5GB超はマルチパートアップロード必須)
メタデータ上限 2KB

キー(Key)

キーはバケット内でオブジェクトを一意に識別する文字列です。ファイルパスのような形式で記述できますが、実際にはディレクトリ構造は存在しません。

1
2
3
4
5
my-bucket/
├── images/logo.png       ← キー: images/logo.png
├── images/banner.jpg     ← キー: images/banner.jpg
├── documents/report.pdf  ← キー: documents/report.pdf
└── data.json             ← キー: data.json

S3コンソールでは/(スラッシュ)を区切り文字として認識し、フォルダのように表示しますが、これは論理的な表現であり、実際のディレクトリ構造ではありません。このため「プレフィックス」と呼ばれます。

バケットを作成する

バケット作成時には、命名規則とリージョン選択を適切に行う必要があります。

バケットの命名規則

バケット名には厳格な規則が適用されます。以下の条件を満たす必要があります。

ルール 説明
文字数 3〜63文字
使用可能文字 小文字、数字、ハイフン(-)
開始文字 小文字または数字で開始
禁止形式 IPアドレス形式(192.168.1.1など)は不可
禁止プレフィックス xn--sthree-sthree-configuratorで始まる名前は不可
禁止サフィックス -s3alias--ol-s3で終わる名前は不可

良い例と悪い例を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
良い例:
  my-application-logs
  company-backup-2026
  prod-static-assets

悪い例:
  MyBucket           ← 大文字は使用不可
  my_bucket          ← アンダースコアは使用不可
  -my-bucket         ← ハイフンで開始は不可
  192.168.1.1        ← IPアドレス形式は不可

AWS CLIでバケットを作成する

AWS CLIを使用してバケットを作成する方法を説明します。まず、AWS CLIが設定されていることを確認してください。

1
2
3
4
5
# バケットの作成(東京リージョン)
aws s3 mb s3://my-example-bucket-2026 --region ap-northeast-1

# バケット作成の確認
aws s3 ls

mbは「make bucket」の略です。リージョンを指定しない場合、デフォルトリージョンが使用されます。

AWSマネジメントコンソールでバケットを作成する

コンソールからバケットを作成する手順は以下の通りです。

  1. S3コンソールを開く
  2. 「バケットを作成」をクリック
  3. バケット名を入力(グローバルに一意な名前)
  4. リージョンを選択
  5. オブジェクト所有者の設定(通常は「ACL無効」を推奨)
  6. パブリックアクセスのブロック設定(デフォルトで有効)
  7. バージョニングの設定(任意)
  8. 暗号化の設定(デフォルトでSSE-S3が有効)
  9. 「バケットを作成」をクリック
flowchart TB
    A[S3コンソールを開く] --> B[バケットを作成]
    B --> C[バケット名を入力]
    C --> D[リージョンを選択]
    D --> E[オブジェクト所有者設定]
    E --> F[パブリックアクセスブロック設定]
    F --> G[バージョニング設定]
    G --> H[暗号化設定]
    H --> I[バケット作成完了]

オブジェクトをアップロード・ダウンロードする

バケットを作成したら、オブジェクトの操作を行います。

AWS CLIでオブジェクトを操作する

AWS CLIを使った基本的なオブジェクト操作を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 単一ファイルのアップロード
aws s3 cp local-file.txt s3://my-bucket/path/to/file.txt

# ディレクトリを再帰的にアップロード
aws s3 cp ./local-dir s3://my-bucket/remote-dir --recursive

# 同期(差分のみ転送)
aws s3 sync ./local-dir s3://my-bucket/remote-dir

# ファイルのダウンロード
aws s3 cp s3://my-bucket/path/to/file.txt ./local-file.txt

# ディレクトリを再帰的にダウンロード
aws s3 cp s3://my-bucket/remote-dir ./local-dir --recursive

# オブジェクトの一覧表示
aws s3 ls s3://my-bucket/
aws s3 ls s3://my-bucket/path/ --recursive

# オブジェクトの削除
aws s3 rm s3://my-bucket/path/to/file.txt

# ディレクトリを再帰的に削除
aws s3 rm s3://my-bucket/path/ --recursive

syncコマンドは、ローカルとS3間の差分を検出して必要なファイルのみを転送するため、大量のファイルを扱う場合に効率的です。

マルチパートアップロード

5GBを超えるファイルをアップロードする場合、マルチパートアップロードが必須です。AWS CLIのcpコマンドは、大きなファイルに対して自動的にマルチパートアップロードを使用します。

1
2
3
4
5
6
# 大きなファイルのアップロード(自動的にマルチパートが使用される)
aws s3 cp large-file.zip s3://my-bucket/backups/

# マルチパートのしきい値とチャンクサイズを指定
aws configure set default.s3.multipart_threshold 64MB
aws configure set default.s3.multipart_chunksize 16MB

マルチパートアップロードの仕組みは以下の通りです。

sequenceDiagram
    participant Client as クライアント
    participant S3 as Amazon S3
    
    Client->>S3: 1. マルチパートアップロード開始
    S3-->>Client: アップロードID返却
    
    par 並列アップロード
        Client->>S3: 2. パート1をアップロード
        Client->>S3: 2. パート2をアップロード
        Client->>S3: 2. パート3をアップロード
    end
    
    S3-->>Client: 各パートのETag返却
    
    Client->>S3: 3. マルチパートアップロード完了
    S3-->>Client: オブジェクト作成完了

オブジェクトのメタデータを設定する

オブジェクトにはシステムメタデータとユーザー定義メタデータを設定できます。

1
2
3
4
5
6
7
8
# Content-Typeを指定してアップロード
aws s3 cp index.html s3://my-bucket/ --content-type "text/html"

# カスタムメタデータを付与
aws s3 cp data.json s3://my-bucket/ --metadata '{"project":"myapp","environment":"production"}'

# キャッシュ制御ヘッダーを設定
aws s3 cp image.png s3://my-bucket/assets/ --cache-control "max-age=31536000"

主要なシステムメタデータは以下の通りです。

メタデータ 説明
Content-Type MIMEタイプ text/html, application/json
Content-Encoding エンコーディング gzip
Cache-Control キャッシュ制御 max-age=3600
Content-Disposition ダウンロード時の動作 attachment; filename=“report.pdf”

バージョニングを設定する

バージョニングは、オブジェクトの変更履歴を保持し、誤削除や上書きからデータを保護する機能です。

バージョニングの仕組み

バージョニングを有効にすると、同じキーに対する更新や削除でも以前のバージョンが保持されます。

graph TB
    subgraph "バージョニング有効時の動作"
        direction TB
        
        subgraph "初回アップロード"
            V1[report.pdf<br/>Version: abc123]
        end
        
        subgraph "2回目アップロード"
            V1a[report.pdf<br/>Version: abc123]
            V2[report.pdf<br/>Version: def456<br/>最新]
        end
        
        subgraph "削除操作後"
            V1b[report.pdf<br/>Version: abc123]
            V2b[report.pdf<br/>Version: def456]
            DM[削除マーカー<br/>Version: ghi789<br/>最新]
        end
    end

バージョニングには3つの状態があります。

状態 説明
未有効化 デフォルトの状態。バージョン管理なし
有効 すべての変更履歴を保持
一時停止 新しいバージョンは作成されないが、既存のバージョンは保持

バージョニングを有効にする

1
2
3
4
5
6
7
# バージョニングの有効化
aws s3api put-bucket-versioning \
  --bucket my-bucket \
  --versioning-configuration Status=Enabled

# バージョニング状態の確認
aws s3api get-bucket-versioning --bucket my-bucket

バージョン管理されたオブジェクトを操作する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# すべてのバージョンを一覧表示
aws s3api list-object-versions --bucket my-bucket --prefix path/to/file.txt

# 特定バージョンをダウンロード
aws s3api get-object \
  --bucket my-bucket \
  --key path/to/file.txt \
  --version-id abc123 \
  downloaded-file.txt

# 特定バージョンを削除(そのバージョンのみ完全削除)
aws s3api delete-object \
  --bucket my-bucket \
  --key path/to/file.txt \
  --version-id abc123

# 最新バージョンを削除(削除マーカーが追加される)
aws s3 rm s3://my-bucket/path/to/file.txt

削除マーカーとオブジェクトの復元

バージョニングが有効なバケットでオブジェクトを削除すると、実際のデータは削除されず「削除マーカー」が追加されます。オブジェクトを復元するには、削除マーカーを削除します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 削除マーカーのバージョンIDを確認
aws s3api list-object-versions \
  --bucket my-bucket \
  --prefix path/to/file.txt \
  --query 'DeleteMarkers[?IsLatest==`true`].VersionId' \
  --output text

# 削除マーカーを削除して復元
aws s3api delete-object \
  --bucket my-bucket \
  --key path/to/file.txt \
  --version-id <削除マーカーのVersionId>

S3の料金体系を理解する

S3の料金は複数の要素で構成されています。コストを最適化するために、料金体系を把握しておきましょう。

料金の構成要素

graph LR
    subgraph "S3料金の構成要素"
        A[ストレージ料金<br/>保存データ量/月]
        B[リクエスト料金<br/>PUT/GET/LIST等]
        C[データ転送料金<br/>アウトバウンド転送]
        D[管理機能料金<br/>インベントリ等]
    end

東京リージョン(ap-northeast-1)でのS3 Standardの主な料金は以下の通りです(2026年1月時点)。

項目 料金
ストレージ(最初の50TB/月) $0.025/GB
PUTリクエスト $0.0047/1,000リクエスト
GETリクエスト $0.00037/1,000リクエスト
インターネットへの転送(最初の10TB/月) $0.114/GB

無料利用枠

AWSの新規アカウントでは、S3の無料利用枠が提供されています。

  • ストレージ:5GB(S3 Standard)
  • リクエスト:20,000件のGETリクエスト、2,000件のPUTリクエスト
  • データ転送:100GBのデータ転送(アウトバウンド)

S3利用時のベストプラクティス

S3を安全かつ効率的に利用するためのベストプラクティスをまとめます。

命名とキー設計

  • 一貫した命名規則: プロジェクト名、環境名、用途を含めた命名(例:myapp-prod-logs
  • キープレフィックスの活用: 論理的なグループ化(例:logs/2026/01/25/
  • ランダムプレフィックスの回避: 以前は推奨されていましたが、現在のS3は自動的に最適化されるため不要

セキュリティ

  • パブリックアクセスブロックの有効化: デフォルトで有効。必要な場合のみ解除
  • バケットポリシーの最小権限: 必要最小限のアクセス権限を付与
  • 暗号化の有効化: SSE-S3(デフォルト)またはSSE-KMSを使用
  • アクセスログの有効化: セキュリティ監査のためにアクセスログを記録

コスト最適化

  • 適切なストレージクラスの選択: アクセス頻度に応じたストレージクラスを使用
  • ライフサイクルルールの設定: 古いデータの自動アーカイブまたは削除
  • 不完全なマルチパートアップロードの削除: 放置するとストレージ料金が発生
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 不完全なマルチパートアップロードを確認
aws s3api list-multipart-uploads --bucket my-bucket

# ライフサイクルルールで自動削除を設定(推奨)
aws s3api put-bucket-lifecycle-configuration \
  --bucket my-bucket \
  --lifecycle-configuration '{
    "Rules": [
      {
        "ID": "DeleteIncompleteMultipartUploads",
        "Status": "Enabled",
        "Filter": {},
        "AbortIncompleteMultipartUpload": {
          "DaysAfterInitiation": 7
        }
      }
    ]
  }'

まとめ

この記事では、Amazon S3の基本概念と操作方法について解説しました。

  • S3の基本概念: バケット、オブジェクト、キーの関係性とオブジェクトストレージの特徴
  • バケット作成: 命名規則を遵守した適切なバケット設計
  • オブジェクト操作: AWS CLIを使ったアップロード、ダウンロード、削除
  • バージョニング: 変更履歴の保持と誤削除からのデータ保護
  • 料金体系: ストレージ、リクエスト、データ転送の料金構成

S3は単なるファイル保存サービスではなく、アクセス制御、暗号化、ライフサイクル管理など多くの機能を備えています。次回の記事では、バケットポリシーや署名付きURLを使ったS3のアクセス制御とセキュリティについて詳しく解説します。

参考リンク