AWS入門ブログリレー2024〜Amazon S3編〜

2024.03.28

あしざわです。

当エントリは弊社AWS事業本部による『AWS 入門ブログリレー 2024』の4日目のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2024 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。今回のテーマは『Amazon S3』です。

Amazon S3とは

Amazon S3はインターネット経由で利用できるAWSのストレージサービスです。AWSサービスの中でも歴史は古く2006年に登場しました。安価で高可用・高耐久、各種セキュリティ設定、多くのAWSサービスとの連携が充実している、まさにAWSの中核をなすサービスです。

参考:AWS-Black-Belt_2022_Amazon_S3_for_Beginner_1231_v1.pdf

特徴

S3のサービスとしての特徴を説明します。ここでは以下の4つの観点からS3を説明します。

  • 高耐久性・高可用性
  • 事実上無限のスケーラビリティ
  • 低コスト
  • インターネット経由でのアクセス

高耐久性・高可用性

S3は独自のアーキテクチャに基づいて99.999999999%(通称イレブンナイン)を超える耐久性を持つように設計されています。例えば、データを最低3つのアベイラビリティゾーンに冗長化する、などです。このイレブンナインを超える耐久性は「1000万のオブジェクトが格納されているバケットで1つのオブジェクトが損失するケースが平均1万年に一度である」という確率になるそうです。

またオブジェクトの可用性は99.99%とイレブンナインほどではないですが、こちらもかなり高いです。

可用性についてはS3標準と呼ばれる一般的なストレージクラスの場合に当てはまる性能です。後述するストレージクラスによっては性能が変化しますのでご注意ください。

事実上無限のスケーラビリティ

S3には保存するオブジェクトの個数に関する制限はないため、容量無制限のストレージとして利用できます。保存した容量に応じて従量課金されるため、サイジングが不要でとても便利です。

ただし、1つのオブジェクトサイズは5TBまでと制限がありこの制限は調整できないため、大容量のファイルを保存する用途で使用する場合は注意が必要です。

参考:Amazon Simple Storage Service エンドポイントとクォータ - AWS 全般のリファレンス

低コスト

S3の主な料金体系は以下です。(2024年3月28日時点の東京リージョン、S3標準ストレージクラスの場合)

項目 料金 備考
ストレージ料金 0.025USD/GB 月ごとに最初の50TBまで
インターネットからのデータ受信料金 0.00USD/GB インターネットから Amazon S3 へのデータ転送受信 (イン)
インターネットへのデータ送信料金 0.114USD/GB Amazon S3 からインターネットへのデータ転送送信 (アウト)、月ごとに最初の 10 TBまで
他のAWSリージョンへのデータ転送料金 0.09USD/GB 大阪リージョンなどの場合

ストレージ利用料金は1ヶ月に1TB(1000GB)のストレージ領域を利用したとしても25USD(¥3786程度、1ドル151円で計算)とかなり安価です。

データ転送料金もインターネットからのインバウンド通信は無料、同一リージョンのアウトバウンド通信は無料と、費用が発生しないパターンの通信経路があり、費用が発生するものについてもすべて従量課金なのでお安く始められます。

インターネット経由でのアクセス

S3はHTTP/HTTPSのプロトコルを利用してインターネット経由でアクセスできるストレージです。

GET、PUT、POSTのようなREST APIを利用してリソースにアクセスします。

基本的にAWSの認証情報を利用してアクセスする必要がありますが、S3の用途やセキュリティ設定によっては認証なしでのアクセス方法も実装可能です。

用語

S3について理解するための前提として、サービス独自の用語について説明します。

  • バケット
  • オブジェクト
  • フォルダ
  • プレフィックス
  • バケットタイプ
  • 整合性モデル

バケット

バケットとは、S3にオブジェクトを保存するためのコンテナ(入れ物)です。

バケットは指定されたリージョンに作成されます。低レイテンシー・コストの最小化・地理的な規制要件を満たすために、拠点に近いリージョンで作成することがベーシックです。日本の場合、特に理由がなければ東京リージョンや大阪リージョンにバケットを作成することがおすすめです。

バケットには、バケット名というすべてのリージョンで一意の名称をつけます。バケット名は一意なのでそのバケットが完全に削除されるまで同じバケット名を使用することはできません。

参考:バケットの概要 - Amazon Simple Storage Service

オブジェクト

バケットの保存しているファイルとそのファイルを説明するメタデータのまとまりをオブジェクトと呼びます。

メタデータはオブジェクトのアップロード時のみ設定可能で、最終更新日のタイムスタンプ、オブジェクトサイズ、ヘッダー情報などが含まれます。

参考:オブジェクトメタデータの使用 - Amazon Simple Storage Service

オブジェクトはオブジェクトキーによってバケット内で一意に識別されます。

sample-bucketというバケットにtest.txtというオブジェクトを保存している場合、オブジェクトキーはsample-bucket/text.txtです、

フォルダ

S3は原則フラットな構造にファイルを保存するため、一般的なファイルストレージでいうフォルダを用いた階層構造を作りません。ただし、グループ化の手段としてフォルダーの概念があり、フォルダ機能を使えば階層構造のように見せることができます。

S3でフォルダーを作成すると指定されたフォルダー名に設定されたキーを持つ0バイトのオブジェクトが作成されます。sample-bucket というバケットにhogeフォルダを作成すると、hoge/ という0バイトのオブジェクトが作成されます。

古い記事ですがS3におけるフォルダの考え方についてこちらのブログが参考になります。

プレフィックス

プレフィックスとは、オブジェクトキー名の先頭から始めた任意の長さの文字列のことを指します。

sample-bucket/hoge/fuga/text.txt というオブジェクトキーのプレフィックスは以下のいずれでも指定できます。

  • sample-bu
  • sample-bucket/hog
  • sample-bucket/hoge/fuga/text.txt

参考:プレフィックスを使用してオブジェクトを整理する - Amazon Simple Storage Service

任意のプレフィックスを指定することでパーティションを作成でき、オブジェクトの検索時に役立てられます。

フォルダとプレフィックスの違いは/ の文字列の意味合いにあり、前者ではフォルダやオブジェクト名の区切りを表しますが、後者では単なる文字であり区切りを表すものではありません。

2つの違いについてはこちらの記事も参考にしてください。

バケットタイプ

S3バケットには2種類のバケットタイプがあります。

  • 汎用バケット
  • ディレクトリバケット

汎用バケットは旧来からある多くのワークロードで使用される標準的なS3バケットです。データ構造がフラットで階層化はされず、後述するストレージクラスというオブジェクトへのアクセス頻度に応じたコスト最適化機能がすべて利用できます。バケットの場所はリージョンのみで指定し、アクセス管理周りの設定も自由に変更できます。

対してディレクトリバケットは比較的最近登場した概念で、1 桁のミリ秒単位で一貫したデータアクセスを提供することを目的として構築された高いパフォーマンスを持つ特殊なストレージです。このタイプは、アプリケーションからS3へのアクセスについて低いレイテンシーが求められるユースケースでマッチし、ディレクトリというフォルダとはまた別の概念でデータ構造を階層化できます。ストレージクラスはS3 Express One Zoneという1桁ミリ秒で一貫したデータアクセスが実現できるがシングルAZと可用性を落としたクラスのみで利用できます。またアクセス管理に関する設定変更に制限があります。

その他それぞれのバケットタイプの差をまとめると以下です。

汎用バケット ディレクトリバケット
ユースケース 一般的なもの 低レイテンシーが求められる
データの階層化 できない ディレクトリで階層化可能
ストレージクラス すべてのストレージクラスを選択できる S3 Express One Zoneのみ
バケットの配置場所指定 リージョン リージョン + AZ
アクセス管理の制限 設定の変更可能 ブロックパブリックアクセス有効化およびACL無効化がデフォルトで、この設定は変更できない

参考:ディレクトリバケット - Amazon Simple Storage Service

整合性モデル

整合性とは、ストレージへ新しいオブジェクトを書き込んだり既存のオブジェクトに対する上書きを行った直後の読み取りリクエストに対する一貫性のことを指します。

書き込みリクエスト後の読み込みに対する一貫性が高いと、書き込み直後に読み取りを行ってもすべての読み取りで更新後の最新版の結果が確実に読み取れます。この一貫性の高さを「強力な整合性」と呼びます。

現在のAmazon S3では、オブジェクト新規作成・更新・削除についての強力な整合性がデフォルトで提供されています。

強力な整合性と対になる整合性は「結果整合性」と呼ばれ、新規作成・更新・削除を行なった後も古いバージョンのオブジェクトを行う可能性があることを指します。

2020年12月より前のS3の整合性は結果整合性でしたが、それ以降は現在の仕様と同じ強力な整合性に変更されました。

代表的なユースケース

そんなS3のユースケースについて3つまとめました。

  • AWSサービスのログの保存先
  • データの保護・バックアップ
  • Webサービスのコンテンツオフロード

AWSサービスのログの保存先

S3は様々なAWSサービスとの連携機能が充実しているため、各サービスのログを簡単にシームレスにS3バケットへ出力できます。

例えば、AWS WAFのようなAWSマネージドサービスでは以下のようにマネジメントコンソール上からS3へのログ出力が簡単に設定できます。

その他、Configログ、CloudTrailイベントログ、ALBアクセスログ、S3アクセスログなど、S3はよく使われるサービスのログ出力先として第一想起(もしくは唯一)の存在です。

同様の用途でCloudWatch Logsをログ保存先に指定できるケースもありますが、CloudWatchはS3と比べるとログの取り込み料金が高いため、無闇にCloudWatch Logsを選ぶとコストが嵩む場合があります(保存料金はS3と同等です)

参考: 料金 - Amazon CloudWatch | AWS

データの保護・バックアップ

S3をオンプレミスのストレージの移行先やBCP/DRのようなバックアップ用途で利用するケースです。

参考:AWS-Black-Belt_2023_Amazon-S3-Usecases_0131_v1.pdf

S3の高耐久性・高可用性・低コストという特徴から大規模なオンプレミスストレージの移行先にも適していますし、異なるリージョンにバケットを作成すれば地理的に異なる場所へファイルを保存できるため、BCP/DR用途のバックアップとしても利用できます。

Webサービスのコンテンツオフロード

S3はストレージとしてだけでなく、Webサービスの静的コンテンツのオフロードの用途で使用できます。

画像、動画、HTML/CSSのような静的コンテンツが多いWebサービスを運用している環境においてコンテンツ量の増加が課題となった際、S3の静的Webサイトホスティングという機能を利用してWebサービスの静的コンテンツをオフロードすることでバックエンドのWebサービスの負荷軽減対策になります。

参考:AWS-Black-Belt_2023_Amazon-S3-Usecases_0131_v1.pdf

こちらの構成にCloudFront、AWS WAFのようなサービスを追加することで、DDoS対策・CDNによるキャッシュの利用・WAFによるアプリケーションレイヤー保護の追加のセキュリティ・可用性対策が可能になります。

代表的なユースケースの紹介は以上です。

ここからはS3の詳細の機能にフォーカスして説明していきます。

コスト最適化機能

コスト最適化に関連した代表的な3つの機能について説明します。

  • ストレージクラス
  • ライフサイクルルール
  • ストレージ分析機能群

ストレージクラス

S3にはワークロードやアクセスパターンに応じて選択できる様々なストレージクラスがあります。

ストレージクラスには「汎用」「不明なアクセス」「高性能」「低頻度アクセス」「アーカイブ」といった用途・目的に応じた種類で分かれています。

各ストレージクラスと特性をまとめると以下です。

  • 汎用
    • S3標準(S3 Standard)
  • 不明なアクセス
    • S3 Intelligent-Tiering
  • 高性能
    • S3 Express One Zone
  • 低頻度アクセス
    • S3 標準 – IA、S3 One Zone-IA
  • アーカイブ
    • S3 Glacier Instant Retrieval
    • S3 Glacier Flexible Retrieval
    • S3 Glacier Deep Archive

汎用

S3標準(S3 Standard)が該当します。

このクラスはS3デフォルトのストレージで、動的ウェブサイト、コンテンツ配信、ビックデータ分析など幅広いユースケースに適しています。アクセス頻度が高く、高耐久性・高可用性・高パフォーマンスのストレージが利用できます。

不明なアクセス

S3 Intelligent-Tieringというストレージクラスのみが該当します。

ストレージクラスはアクセスパターンや可用性、レイテンシーに応じた複数の種類がありますが保存するオブジェクトがどのアクセス頻度になるのか、事前に予測できないケースがあります。

Intelligent-Tieringは各オブジェクトのアクセス頻度をモニタリングし、指定された期間アクセスがなければ低頻度のアクセス階層に自動で移動し、アクセスが発生したら高頻度アクセス階層に戻ります。オブジェクトの監視やオートメーションには追加のコストが発生しますが、それを許容できればとても便利なクラスです。

以下のブログが参考になりますので、合わせてご確認ください。

高性能

S3 Express One Zoneというクラスが該当します。

S3標準と比較してよりアクセス頻度が高く高性能が求められるユースケースで利用します。一貫した1桁ミリ秒のレイテンシーが提供され、S3標準と比較するとアクセス速度が10倍、リクエストコストが50%削減できます。

バケットタイプの用語の章で解説したディレクトリバケットとして唯一利用できるストレージクラスです。

詳しくは以下ブログをご覧ください。

低頻度アクセス

S3標準 – IAS3 One Zone-IAの2つのクラスが該当します。

それぞれの末尾についているIAは「Infrequent Access(低頻度アクセス)」を表します。

S3標準–IAは、S3標準と比較するとストレージ料金は安いですが、取り出し時の料金が追加で発生します。そのため、アクセス頻度が低くコストを抑えたいがアクセスがあったときにすぐ取り出したいオブジェクトを配置するのに適したストレージクラスです。

S3 One Zone-IAは、標準-IAと比べるとデータの可用性が劣るため、重要度が低い再作成可能なデータのコピーを配置するのに適しています。

アーカイブ

「S3 Glacier」と名のつくストレージクラスが該当します。

現在は以下の3つです。

  • S3 Glacier Instant Retrieval
  • S3 Glacier Flexible Retrieval
  • S3 Glacier Deep Archive

アーカイブと言っているように、他のストレージクラスと比べるとストレージ料金はかなり安価ですがデータの取り出し料金が発生し、データ取り出し時に数分から数時間単位の時間がかかります。

Instant Retrievalはミリ秒単位のアクセス、Flexible Retrievalは数分〜数時間でアクセス、Deep Archiveは12時間以内でアクセスできます。必要になった時にどれくらいのリードタイムが許容できるかで選択できそうです。

ストレージクラスについては以上とします。

どのストレージクラスを選んだら良いか悩む方は以下のブログをご覧ください。

ライフサイクルルール

S3には、オブジェクトが作成されてから経過した日数に応じてストレージクラスの移動やオブジェクトの削除を自動化できるライフサイクルルールという機能があります。

例えば、S3-標準でオブジェクトを作成し30日後にS3標準–IAに移動、1年後にS3 Glacier Flexible Retrievalに移動させる、3年後にオブジェクトを削除するといったものです。

この設定はS3バケット単位で設定し、複数ルールを設定することもできます。ストレージクラスと合わせてS3では是非とも使いたい必須の機能になります。

詳しくは以下のブログをご覧ください。

ストレージ分析機能群

S3にはアカウント上のS3バケットやオブジェクトを分析する機能として、以下の2つを紹介します。

  • S3 Storage Lens
  • S3 ストレージクラス分析

S3 Storage Lens

S3オブジェクトの利用状況を可視化し、コスト最適化の役に立つ分析サービスです。

無料のメトリクスと追加コストが必要な高度なメトリクスという大きく分けて2種類のメトリクスが用意されています。

デフォルトで利用できる無料のメトリクスだけであれば、14日分の分析結果のみの確認になりますが無料なのでまずはここから確認しましょう。

無料・有料でそれぞれどのようなメトリクスが確認できるのか、以下記事も参考にしてください。

S3 ストレージクラス分析

ストレージのアクセスパターンを分析し、いつ低頻度アクセス階層に移動すべきなのかをレコメンドしてくれるサービスです。

対応しているストレージクラスはS3標準、S3標準-IAのみなので、アクセスパターンがわからずひとまずS3標準においてあるオブジェクトをどうするか?という最初の段階で役に立ちそうです。

料金は「監視対象100万件あたり0.10USD/月」とお安く利用できます。

運用のイメージをつけたい方は以下のブログをご覧ください。

セキュリティ機能

S3のセキュリティ機能を以下2カテゴリを紹介します!

  • データの暗号化
  • アクセス制御(バケットポリシー、アクセスコントロールリスト、ブロックパブリックアクセス)

データの暗号化

S3に保存されたデータを暗号化する場合、サーバー側の暗号化・クライアント側の暗号化の2パターンがあります。

まずはサーバー側の暗号化についてです。サーバー側の暗号化を利用すると、S3にオブジェクトをアップロードする際ディスクに保存する前にオブジェクトが暗号化され、データをダウンロードする際に複合化されます。つまりユーザー側はデータの暗号化・複合化を意識しないままで運用できます。

現時点ではS3バケットを作成するとS3マネージドキー(SSE-S3)と呼ばれるAWSが管理する暗号化キーによって暗号化されてる設定がデフォルトで設定されています。KMSを使ったキーによる暗号化(SSE-KMS)など他のキーを利用して暗号化する場合は設定変更する必要があります。

クライアント側の暗号化はAWSではなくユーザー側で暗号化を行う設定です。Go,Java,.NETなどプログラミング言語で利用できるAWS SDKのS3暗号化クライアントを利用して暗号化します。

各暗号化方式の違いについては以下のブログが参考になります。

アクセス制御(バケットポリシー、アクセスコントロールリスト、ブロックパブリックアクセス)

S3のアクセス制御方法は歴史的経緯から複数あります。

中心となる以下3つのフォーカスして解説します。

  • バケットポリシー
  • アクセスコントロールリスト(ACL)
  • ブロックパブリックアクセス

バケットポリシー

S3バケットとその中のオブジェクトへのアクセス許可を付与できるリソースベースポリシーの一種です。

バケットポリシーを設定するとバケットないのオブジェクトへのアクセスを保護して、適切な権限を持つユーザーのみがアクセスできるように制限できます。

以下のようなJSON形式のIAMポリシーと同じ言語で記載します。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Principal":{
            "AWS":"arn:aws:iam::111122223333:role/JohnDoe"
         },
         "Effect":"Allow",
         "Action":[
            "s3:GetObject",
            "s3:GetObjectVersion"
         ],
         "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
         "Condition":{
            "StringEquals":{
               "s3:ExistingObjectTag/environment":"production"
            }
         }
      }
   ]
}

ちなみにこのバケットポリシーは、以下のような許可を表しています。

  • 111122223333のアカウントIDにあるJohnDoeというIAMロールから実行された
  • DOC-EXAMPLE-BUCKETというS3バケットに対する「s3:GetObject」か「s3:GetObjectVersion」のAPIアクションであり
  • かつ APIアクションが「environment:production」というタグが付与されたオブジェクトに対して実行されていた場合はOK

後述するACLと似た概念ですが、現在はACLは無効化しバケットポリシーのみを利用することがベストプラクティスです。

アクセスコントロールリスト(ACL)

S3の初期からあるアクセス制御の手段です。

S3バケットは元々プライベートなりソースであったので他アカウントからのアクセスやパブリックアクセスを許可するためにACLで実現していました。

その後IAMが追加されアクセス手段としてバケットポリシーなどのIAMが追加されました。

現在のS3ではACL、ポリシーどちらも考慮する必要があるので、両方有効化しているとポリシーではパブリックにしていないがACLではパブリックになっていた、というケースが出てきていました。また、ポリシーの方が柔軟な粒度でアクセス制御できるのでACLは無効化できるようになっています。

現在、ACLの無効化はS3バケットのデフォルト設定となっているので、そのまま無効化しておきポリシーのみでアクセス制御を行えばOKです。

ブロックパブリックアクセス

S3が誤ってパブリックに公開されてしまい、機密データが公開されてしまうことを防ぐための機能です。

ここでいう「パブリックに公開」と言っているのは、AWSの認証情報なしでインターネット上の誰もがS3バケットを読み書きできる状態を指します。

Amazon S3 のセキュリティのベストプラクティス的にこれはよろしくない状態です。

S3はバケットポリシー、ACLなどさまざまな設定によってパブリックアクセスを許可できてしまうので、この機能によって誤ったパブリック公開を防止できます。

この設定はバケット単位、アカウント単位の2パターンがあり、アカウントレベルのブロックパブリックアクセス設定を行うとすべてのAWSリージョンに設定されます。既存のバケットに対するバブリックアクセス設定が上書かれる場合もあるので注意して設定してください。

ちなみに新規バケットのブロックパブリックアクセス設定は2023年4月からデフォルトで有効化されています。

データ保護機能

最後にS3のデータ保護機能から以下の3つを紹介して締めようと思います。

  • バージョニング
  • オブジェクトロック
  • レプリケーション

バージョニング

同じバケット内部で複数のオブジェクトのバージョンを保持する機能です。

バケットレベルで設定し、設定されて以降に作成・上書きされたオブジェクトにはバージョンIDが付与されます。

誤って削除、誤って設定変更してしまった場合でも復元ができる点がメリットです。

ただし、オブジェクトのバージョン分がそのまま課金されるので注意が必要です。例えば3つのバージョンを保持していると同じオブジェクトを3つ持っているのと同じことになるのでストレージサイズは3倍分課金されることになります。

またバージョニングを利用すると場合、ライフサイクルルールにバージョンの概念が追加され少し複雑になります。少し設定箇所が増えるので概念を整理して覚えておくようにしましょう。

参考:絵で見て 3分でおさらいする Amazon S3 のバージョニングとライフサイクル | DevelopersIO

オブジェクトロック

S3バケットに保存するオブジェクトに対してWORM(Write Once Read Many)モデルを提供する機能で、オブジェクトが削除および上書きされるのを一定期間または無期限に防止できます。オブジェクトロックを有効化すると自動的にバージョニングが有効化されます。

オブジェクトロックは「保持期間」と「リーガルホールド」の片方、または両方で削除する期間を設定します。

保持期間は文字通りオブジェクトがロックされる期間を指定し、リーガルホールドはも同じくオブジェクトをロックしますが明示的に解除されるまで有効期限はありません。

またリテンションモードで保護のレベルを指定します。

コンプライアンスモードはrootユーザーであっても設定の上書き・削除ができず、ガバナンスモードは特定のユーザー以外のオブジェクトの上書き・削除、ロック設定の変更を禁止します。

オブジェクトロックは過去新規バケットでしか使えない機能でしたが、現在は既存バケットに対しても利用できるようになっています。

以下ブログも参考にしてください。

レプリケーション

S3バケット間でオブジェクトを非同期にコピーする機能です。

オブジェクトのコピー元のバケットとコピー先のバケットはアカウント、リージョンそれぞれ異なっても問題ないため、クロスアカウントのレプリケーション、クロスリージョンのレプリケーションのどちらも可能です。クロスリージョンレプリケーションはBCP/DRの用途でよく使われます。

設定手順については以下ブログが参考になります

終わりに

以上、『AWS 入門ブログリレー 2024』の4日目のエントリ『Amazon S3』編でした。 次回、3/29は弊社Takuya Shibataによる『Amazon WorkSpaces Family』編の予定です!

参考資料