AWSのS3の転送速度を早くする裏ワザをAWSの中の人に聞いてきた


インフラエンジニアの伊藤です。

Amazon S3
非常なスケーラブルなシステムで、99.99%の可用性を誇るシステムです。
(ちなみに堅牢性は99.9999999%になります)

静的サイトとしてS3を使用している人もいらっしゃるでしょうし、
ストレージとして使用している人もいるでしょう。

やっぱり気になるのは転送速度。

AWSの中の人がいってた「転送速度を速くするワザ」を今回紹介したいと思います!

S3ってディレクトリ-ファイルの構造じゃない

転送速度を速くするワザの前に・・・
S3は上記の堅牢性や可用性を担保するために、ファイルをアップロードしたタイミングで、
同じリージョンの3つのデータセンターに対してコピーを行っています。

で、S3にはバケットとオブジェクトというものがあり、「フォルダ=バケット」、「ファイル=オブジェクト」というイメージをしますが、実体はそうじゃないのです。

引用します。

mazon S3の基礎技術は、単純なKVS(Key-Value型データストア)でしかありません。例えば下記のようなフォルダ(と我々が認識している)構造があったとします。(本エントリーでは、bar.txtにはbar、baz.txtにはbazっていう文字が入っていると単純に考えることにします。)
(ルート)
└ foo/
└ bar.txt
ただこれは、我々がこのように認識しているだけであって、S3的には単純に下記のような情報を保持しているに過ぎません。S3においては基本的に、/に特別な意味は無いのです。
キー(フルパス名) バリュー(ファイルの内容)
foo/bar.txt bar

参考サイト:Amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする | Developers.IO

Amazon S3 ではバケットとオブジェクトをサポートしていますが、Amazon S3 には階層がありません。ただし、オブジェクトキー名のプレフィックスと区切り記号によって、Amazon S3 コンソールや AWS SDK で階層を暗示し、フォルダの概念を導入できます。

参考サイト:オブジェクトキーとメタデータ – Amazon Simple Storage Service

バケットとオブジェクトを使うとフォルダとファイルっぽいですが、あくまで概念として作っているだけのようです。

キーバリュー型のデータなので、データを取得するときは単純に検索がかかっていきます。
また、同じようなバケット名にしてしまうと、同じデータセンターにデータが格納されてからデータコピーをしてしまい、
転送速度が遅くなりがちになるようです。

バケット名の先頭にハッシュ値をつけよう

バケット名に何文字か適当なハッシュ値をつけることで、同じデータセンターに書き込まれることがなくなります。

  • test01
  • test02
  • test03

ではなく、

  • abctest01
  • yjctest02
  • ckttest03

と言った感じですね。

ただ、どんなバケット名でもいいかというとそうではなくて、
命名規則にも制限があるので、注意しましょう。

  • バケット名は、3~63 文字以内にする必要があります。
  • バケット名は、1 つのラベルまたは一連の複数のラベルとして指定します。隣り合うラベルは単一のピリオドで区切ります。バケット名には、小文字の英文字、数字、およびハイフン(-)を含めることができます。各ラベルの先頭および末尾は、小文字の英文字または数字にする必要があります。
  • バケット名は、IP アドレスの形式(192.168.5.4 など)にはできません。
  • SSL と共に仮想ホスティング形式のバケットを使用した場合、SSL ワイルドカード証明書は、ピリオドを含まないバケットのみと一致します。この問題を回避するには、HTTP を使用するか、または独自の証明書検証ロジックを記述します。 バケット名にピリオド (「.」) は使用しないことをお勧めします。

引用元:バケットの制約と制限 – Amazon Simple Storage Service

これによって、各種データが同じリージョン内の違うデータセンターに書き込まれるので、
同じデータセンター内に書き込まれるより速くなることが期待できます。

先頭に何文字以上が必要やったけな…確か3文字以上とかだった気がします。

では、よきS3ライフを!


この記事をかいた人

About the author