S3

【VPC外リージョンサービス】

S3(Simple Storage Service) は、AWSが提供するオブジェクトストレージサービスです。高い耐久性(99.999999999%=11ナイン)を持ち、バケット と呼ばれるコンテナ単位でデータを保存します。

多様な ストレージクラス(Standard/Standard-IA/One Zone-IA/Intelligent-Tiering/Glacier など) を利用することで、データの使用頻度や重要度に応じてコストを最適化できます。

バージョニング を有効にすると、誤って上書きや削除を行った場合でも過去のデータを復元できます。
また、ライフサイクルポリシー を設定することで、一定期間後に別のストレージクラスへ自動移行したり、不要なオブジェクトを自動削除したりすることができます。

暗号化 にも対応しており、SSE-S3 や SSE-KMS を利用することで保存データを自動的に暗号化できます。さらに、バケットポリシー や IAMポリシー を用いて、ユーザー・アカウント・VPCなどの条件に基づいた厳格なアクセス制御を実現します。

レプリケーション機能 を使用すれば、他のバケットやリージョンへ自動的にデータをコピーでき、
DR(Disaster Recovery:災害対策) やデータ共有にも役立ちます。

オブジェクトロックを利用すると、指定期間中にデータを削除・上書きできないように保護でき、リーガルホールドを設定することで、特定のデータを法的保持対象として無期限に削除不可にすることも可能です。これにより、コンプライアンスや監査要件、法的証拠保全に対応することができます。

署名付きURLを利用することで、認証情報を共有せずに一時的にS3オブジェクトへのアクセスを許可することができます。これにより、特定ユーザーへの限定配布やダウンロードリンクの発行など、セキュアなアクセス制御を柔軟に実現できます。

S3は、イベント通知 や 静的ウェブサイトホスティング、サーバーアクセスログの収集 にも対応しており、
AWS Glue、Athena、EMR、Redshift Spectrum などの分析系サービスと連携することで、
データレイク基盤 として強力に活用することができます。

重要用語

関連サービス

ユースケース

静的コンテンツの保存と配信画像・CSS・JavaScript・PDFなどの静的ファイルをS3に保存し、CloudFrontと組み合わせてWebサイトのコンテンツ配信に利用する。
バックアップ・ログの集中保管アプリケーションログやRDSスナップショット、オンプレミスサーバーのバックアップデータをS3に集約し、耐久性の高いストレージとして保管する。
データレイク基盤のストレージ分析用の生データ・加工データをフォルダ分けしてS3に保存し、AthenaやEMR、Glueなどから直接参照できるデータレイクとして利用する。

ベストプラクティス

バケットポリシーの最小権限化公開不要なバケットはパブリックアクセスブロックを有効にする。
バージョニングとライフサイクル管理削除・上書きに備えてバージョニングを有効化し、古いオブジェクトは自動で低コスト階層へ移行する。
サーバーサイド暗号化SSE-S3またはSSE-KMSで保存データを暗号化する。

高可用性・バックアップ・リトライ

高可用性・バックアップ・リトライ設計のポイント
【デフォルト】AWS内部で冗長化
 ・データブロックのマルチAZ(オブジェクトの保存時、少なくとも3つ以上のAZ にコピーする)
 ・メタデータコントロールプレーン
 ・リクエスト制御プレーン
 ・内部ネットワークとレプリケーション制御
 ・モニタリング・整合性検証
 ・S3バケット命名・ルーティング層
【ストレージクラス】Standard / Standard-IA / Glacier / Deep Archive
【バージョニング】上書きや削除された場合でも旧バージョンを復元可能
【ライフサイクル】データ冗長化+コスト最適化
【Cross-Region Replication】ディザスタリカバリ要件がある場合

セキュリティ

関連サービス設定内容
KMS(データの暗号化と鍵の安全管理)【保存先がS3(SSE-S3)の場合】
 独自KMSキー不要(鍵操作、監査ができない)
Secrets Manager(機密情報の安全管理)-
SSM Parameter Store(設定情報の一元管理)-
CloudTrail(操作履歴の記録・監査・追跡)【自動記録】
作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI)
【記録有効化を推奨】
データ操作(Put/Get/Delete)(データプレーンAPI)
Config(リソースの構成状態・設定変更を記録)【Configが有効な場合】
バケット設定変更履歴・公開設定/暗号化/バージョニング/ログ記録等の準拠評価
GuardDuty(脅威を自動検出)【GuardDutyが有効な場合】
バケット削除/ACL変更のAPI異常検知

【追加オプション】
S3 Protection導入を推奨
S3 バケットへの API 呼び出しを監視し、不正アクセス・異常転送を検出

リソースベースポリシーによる補完

実行ロールで不足する権限をS3 のリソースベースポリシーで補うパターン
リソースベースポリシーのPrincipalリソースベースポリシーのAction
【CloudFront】
cloudfront.amazonaws.com
s3:GetObject
【ELB(アクセスログ)】
elasticloadbalancing.amazonaws.com
s3:PutObject
【CloudTrail】
cloudtrail.amazonaws.com
s3:PutObject
s3:GetBucketAcl
【VPC Flow Logs】
delivery.logs.amazonaws.com
s3:PutObject
【Config】
config.amazonaws.com
s3:GetBucketAcl
s3:PutObject
【RDS(スナップショットエクスポート)】
export.rds.amazonaws.com
s3:PutObject
【CloudWatch Logs(エクスポート)】
logs.amazonaws.com
s3:PutObject
s3:GetBucketAcl
※)権限設計の原則

ログ・監視

ログ出力先ログの種類
S3サーバーアクセスログ
CloudWatch Logs優先の原則
標準メトリクス
メトリクス名説明
ReplicationLatencyレプリケーション遅延
NumberOfObjectsオブジェクト数(日次)
BucketSizeBytesバケットサイズ(バイト)(日次)
カスタムメトリクス(S3 Request Metrics)
メトリクス名説明
AllRequests全リクエスト数
BytesDownloadedダウンロードバイト数
BytesUploadedアップロードバイト数
DeleteRequestsDELETEリクエスト数
FirstByteLatency最初のバイトまでのレイテンシ
GetRequestsGETリクエスト数
HeadRequestsHEADリクエスト数
ListRequestsLISTリクエスト数
PostRequestsPOSTリクエスト数
PutRequestsPUTリクエスト数
TotalRequestLatency全体リクエストレイテンシ
4xxErrors4xxエラー数
5xxErrors5xxエラー数

制限値(固定値/ハードリミット/ソフトリミット)

固定値制限値
バケット内オブジェクト数無制限
イベント通知の設定数100/バケット

ハードリミット制限値
オブジェクトサイズ最小0 Byte、最大5 TB
PUT 1回のアップロード最大5 GB
マルチパートアップロードのパート数10,000パーツ
マルチパートアップロードの各パートサイズ5 MB - 5 GB
バケットポリシーサイズ20 KB

ソフトリミット制限値
バケット数/アカウント10,000(デフォルト100から増加)
リクエストレート(GET/HEAD)5,500リクエスト/秒/プレフィックス
リクエストレート(PUT/COPY/POST/DELETE)3,500リクエスト/秒/プレフィックス

AWS CLIのサンプルコード

S3 バケットを作成する
aws s3 mb s3://bucket-name
S3 バケットの一覧を表示する
aws s3 ls s3://bucket-name
S3 バケットを削除する
aws s3 rb s3://bucket-name --force

ファイルをアップロードする
aws s3 cp file.txt s3://bucket-name
ファイルをダウンロードする
aws s3 cp s3://bucket-name/file.txt .
ファイルを削除する
aws s3 rm s3://bucket-name/file.txt

ローカルからS3へ同期する
aws s3 sync ./local-dir/ s3://my-bucket/remote-dir/            # 追加する、削除しない

aws s3 sync ./local-dir/ s3://my-bucket/remote-dir/ --delete   # 追加する、削除する
S3からローカルへ同期する
aws s3 sync s3://my-bucket/remote-dir/ ./local-dir/            # 追加する、削除しない

aws s3 sync s3://my-bucket/remote-dir/ ./local-dir/ --delete   # 追加する、削除する
S3間で同期する
aws s3 sync s3://source-bucket/ s3://dest-bucket/              # 追加する、削除しない

aws s3 sync s3://source-bucket/ s3://dest-bucket/ --delete     # 追加する、削除する

バージョニングを有効化する
aws s3api put-bucket-versioning \
 --bucket my-bucket \
 --versioning-configuration Status=Enabled
バージョニングを確認する
aws s3api get-bucket-versioning \
  --bucket my-bucket
バージョニングを無効化する
aws s3api put-bucket-versioning \
  --bucket my-bucket \
  --versioning-configuration Status=Suspended

暗号化を設定する(SSE-S3)
aws s3api put-bucket-encryption \
  --bucket my-bucket \
  --server-side-encryption-configuration '{
    "Rules": [{
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
      },
      "BucketKeyEnabled": true
    }]
  }'
暗号化の設定を確認する
aws s3api get-bucket-encryption \
  --bucket my-bucket
暗号化を解除する(既存データは暗号化のまま)
aws s3api delete-bucket-encryption \
  --bucket my-bucket

ライフサイクルポリシーを設定する(削除)
aws s3api put-bucket-lifecycle-configuration \
  --bucket my-bucket \
  --lifecycle-configuration '{
    "Rules": [{
      "Id": "Delete old files after 90 days",
      "Status": "Enabled",
      "Filter": {"Prefix": ""},
      "Expiration": {"Days": 90}
    }]
  }'
ライフサイクルポリシーを設定する(Glacierへ移行)
aws s3api put-bucket-lifecycle-configuration \
  --bucket my-bucket \
  --lifecycle-configuration '{
    "Rules": [{
      "Id": "Move old files to Glacier after 90 days",
      "Status": "Enabled",
      "Filter": {"Prefix": ""},
      "Transitions": [{
        "Days": 90,
        "StorageClass": "GLACIER"
      }]
    }]
  }
ライフサイクルポリシーを確認
aws s3api get-bucket-lifecycle-configuration \
  --bucket my-bucket
ライフサイクルポリシーを無効化する
aws s3api put-bucket-lifecycle-configuration \
  --bucket my-bucket \
  --lifecycle-configuration '{
    "Rules": [{
      "Id": "Delete old files",
      "Status": "Disabled",
      "Filter": {"Prefix": ""},
      "Expiration": {"Days": 90}
    }]
  }'
ライフサイクルポリシーを解除する
aws s3api delete-bucket-lifecycle \
  --bucket my-bucket

CloudFormationのサンプルコード

Terraformのサンプルコード

料金計算

課金項目説明
ストレージ容量保存するデータ量に基づく課金
(Standard、Intelligent-Tiering、Glacierなど)
リクエスト数PUT、GET、POST、LISTなどの
APIリクエスト数に基づく課金
データ転送インターネットへのデータ転送量(アウトバウンド)
レプリケーションクロスリージョンレプリケーション(CRR)の転送量
データ取得Glacier系ストレージからのデータ取得料金
管理と分析S3 Inventory、Analytics、Object Taggingの使用料
料金計算ツール

公式ページ

AWSドキュメント S3