AWS ストレージサービス「S3」

Pocket

今週もまた台風が近づいておりますね。 初めまして、今年新卒で入社した技術開発部の程です。 週末は同僚と登山に行く予定なのに台風直撃の知らせを聞いて下がり気分です。 自然ばかりはITの技術だけではどうにもならないので仕方ないですね。

さて、私、現在は自社DSP、Bypassの開発に携わっているのですが 弊社広告配信システムはAWSを利用して構築されております。 今回は、AWSの中でも特に 弊社広告配信システムにおいても実際に活用している S3というストレージサービスについて 簡単に概要や特徴などについてまとめたいと思います。

S3

S3では、バケットと呼ばれる仮想的なオブジェクト置き場に 様々なファイルやメディアコンテンツ(=オブジェクト)を格納し AWSクラウドサーバ上に保存することができます。 保存したオブジェクトはいつでもどこからでも参照したり 新規オブジェクトを追加することができます。

S3の特徴

  • 容量無制限
  • スケーラブル
    容量は無制限となっており、大量のデータを扱う場合にも、上限を心配することなく使用できます。
  • 冗長化されている
    保存したオブジェクトは異なるアベイラビリティゾーン(AWSによる場所の区分け) にある複数のサーバーに複製保存されるので 障害発生時にデータロストの危険性が低く安心です。 また、自前で冗長化する手間が省けるという利点もあります。
  • 高い堅牢性
    99.999999999%(イレブンナイン)の堅牢性(aws公式サイトより)

S3の操作

S3上でオブジェクトは次のような形式で表現され、管理されます。

調べたところ、S3内部ではフォルダという概念はなく、S3上では単純にKey-Value方式でオブジェクトが格納されているのだそうです。 とはいえ、実際に使ってる時はあんまり意識する必要はなく、通常のファイルと同じような感覚で操作できるのがいいですね。

AWSではS3を操作するための方法をいくつか用意しており、目的に応じて使い分けも可能です。 具体的には以下のようなものが挙げられます。

  • ブラウザ上のコンソールから操作
  • コマンドラインから操作
  • AWS提供のSDKより各種アプリケーションから操作
  • 3rd party製のツールで操作

コマンドラインから操作できるのは便利ですね。 以下のように、基本的なバケットやファイルの作成、削除、コピーなどの操作は一通りCLIで実行可能です。

S3操作用のコマンドとしては上記のものの他に、aws s3apiというものがあり、前者はAPIとコマンドが1:1で対応する形の低レベルなコマンド群であるのに対し、後者は複数のリクエストにまたがる様な処理などが実装された高レベルなコマンド群である、という違いがあります。

もちろん、ローカル->S3だけではなく, S3->ローカルやS3->S3間のファイル移動を行うこともできます。

コンソールから操作する場合は以下のような画面上で、バケット作成やファイルのアップロードを行います。

ログインしたら最初に表示されるバケット管理画面のイメージです。

バケット新規作成の後は、そのバケット内に格納されるファイルを管理する画面に遷移します。 この画面上では、バケットへのファイルのアップロードや、フォルダの作成などができます。

適当に1個ファイルをアップロードしてみるとこのようにファイルが追加されます。

コンソール上で操作する場合は、クリック操作だけで非常に簡単に、バケットの作成からファイルのアップロードまで実行することができました。

S3のユースケース

AWS公式サイトやWebサイト上の記事を調べると、次の3つが主なユースケースとしてよく取り上げられています。

  • データのバックアップ
    前述の通り、高い堅牢性を備えていることから、消失すると困る様々なデータを保管する。
  • コンテンツ配信
    S3上に保存したコンテンツを配信する。
  • ログデータなどの保存先
    EC2で収集されたログの退避先、ビッグデータ分析で使用する生データの保存先として利用する。

弊社広告配信システムにおいては特に動画広告の場合に、S3上に動画素材をアップロードした上で AWS CloudFrontとS3を連携させることで、容量の大きい動画系広告でも高速かつ安定した広告配信を実現しています。

バージョン管理

S3で保存されるオブジェクトは、バージョンで管理することも可能です。例えば、誤削除などのミス発生時などにこの機能が適用されていれば、すぐに以前のバージョンに復旧することができます。 この機能を有効化すると、オブジェクトを更新した時などに 前の世代のオブジェクトが自動的に保管される様になります。 何世代分保存するかを指定することもできます。

Notification(通知)機能

バケットにファイルが追加されたことをイベントとして検知したい時はこの機能が有用です。 この機能ではバケット単位で、以下のイベントが発生した際に Amazon SNS, SQS, LambdaといったAWSサービスに通知を飛ばすことができます。

  • 新しいオブジェクトの作成イベント(Put, Post, Copy, CompleteMultiPartUpload)
  • オブジェクト削除イベント(Delete, DeleteMarkerCreated)
  • 低冗長化ストレージのオブジェクト消失イベント(RRSObjectLost)

その他の機能

  • クロスリージョンレプリケーション
    別リージョンへの複製保存を行う。
  • S3へのアクセスログ
    S3上でバケットに対してどんな操作を行ったかの記録ログを出力させる。
  • Tag管理
    バケットに対してタグを指定する。
  • メタデータ
    オブジェクトに対してメタデータを設定する。

私自身、入社して初めてクラウドサービスを触ったのですが 実際に使ってみるとその操作の簡単さと便利さに驚きました。 個人利用も可能なので、個人の自主アプリ制作などにも活用できそうですね。

それでは以上となります。

Amazon Elasticsearch ServiceでKibanaを利用する
DynamoDBストリームの利用
ClassicLinkを使用してVPCとEC2-Classic間の相互通信を行う