枯れた技術の水平思考

世の中わからないことだらけだ.少し確かなことは検証をしたことだけ

AWS S3でオブジェクトキーの命名に気をつける話

本件は2018年7月18日のアップデートで不必要になったようです.

パフォーマンス向上の為のキー名の工夫が不要に

旧ドキュメントに記載されていた「The sequence pattern in the key names introduces a performance problem.(キー名を連続するパターンにすると、パフォーマンス上の問題が発生します)」という問題が解決しています。 引用元: パフォーマンス向上の為のキー名の工夫が不要に  

以下2018年7月18日以前の話になります.

以前に smoocy を作っている際にS3を使っていて日に日にレスポンスが遅くなりS3の手前に設置しているNginxのリバースプロキシがタイムアウト(3sec)を頻発していることがあった。

今回はそれをたまたま思い出したので忘備録として原因と対策を残しておく

原因

ドキュメントのままなのですけど..

大量のオブジェクトをアップロードする場合、キー名の一部として連番や日付と時刻の値を使用することがあります。たとえば、日付と時刻の組み合わせを使用するキー名を選択できます。このような例を次に示します。この例では、タイムスタンプがプレフィックスに含まれています。 examplebucket/2013-26-05-15-00-00/cust1234234/photo1.jpg examplebucket/2013-26-05-15-00-00/cust3857422/photo2.jpg examplebucket/2013-26-05-15-00-00/cust1248473/photo2.jpg examplebucket/2013-26-05-15-00-00/cust8474937/photo2.jpg examplebucket/2013-26-05-15-00-00/cust1248473/photo3.jpg ... examplebucket/2013-26-05-15-00-01/cust1248473/photo4.jpg examplebucket/2013-26-05-15-00-01/cust1248473/photo5.jpg examplebucket/2013-26-05-15-00-01/cust1248473/photo6.jpg examplebucket/2013-26-05-15-00-01/cust1248473/photo7.jpg ... キー名を連続するパターンにすると、パフォーマンス上の問題が発生します。この問題を理解するため、キー名が Amazon S3 でどのように保存されるかを説明します。 Amazon S3 では、各 AWS リージョンにオブジェクトキー名のインデックスを保持しています。オブジェクトキーは、インデックス内の複数のパーティションに UTF-8 バイナリ順で格納されます。キー名により、自動的にそのキーが格納されるパーティションが決まります。タイムスタンプやアルファベット順などの連続するプレフィックスを使用すると、Amazon S3 が大量のキーに対して特定のパーティションを対象にするため、そのパーティションの I/O 能力がひっ迫する可能性が増大します。キー名のプレフィックスをランダムにすると、キー名、したがって I/O ロードは複数のパーティションに分散されます。

引用元: リクエスト率およびリクエストパフォーマンスに関する留意事項 - Amazon Simple Storage Service

対策

こっちもドキュメントのままなのですけど..

キー名をランダムにする 1 つの方法は、キー名のプレフィックスとしてハッシュ文字列を追加することです。たとえば、キー名として付ける文字列の MD5 ハッシュを計算することができます。ハッシュから特定の数の文字を選択し、キー名のプレフィックスとして追加します。以下の例では、4 文字のハッシュが追加されたキー名を示します。 注記 3 ~ 4 文字のハッシュプレフィックスを追加すれば十分です。 プレフィックスとしては、16 進のハッシュを使用することを強くお勧めします。 examplebucket/232a-2013-26-05-15-00-00/cust1234234/photo1.jpg examplebucket/7b54-2013-26-05-15-00-00/cust3857422/photo2.jpg examplebucket/921c-2013-26-05-15-00-00/cust1248473/photo2.jpg examplebucket/ba65-2013-26-05-15-00-00/cust8474937/photo2.jpg examplebucket/8761-2013-26-05-15-00-00/cust1248473/photo3.jpg examplebucket/2e4f-2013-26-05-15-00-01/cust1248473/photo4.jpg examplebucket/9810-2013-26-05-15-00-01/cust1248473/photo5.jpg examplebucket/7e34-2013-26-05-15-00-01/cust1248473/photo6.jpg examplebucket/c34a-2013-26-05-15-00-01/cust1248473/photo7.jpg ...

引用元: リクエスト率およびリクエストパフォーマンスに関する留意事項 - Amazon Simple Storage Service

結論

ドキュメントを読んできちんとベストプラクティスにそう形にしましょう。

ちなみにS3では階層構造があるように振る舞っていますが、あれは擬似的なものであり実際はフラット構造で、区切り文字でそのように振る舞っているらしいです。

つまり、同一バケットにファイルを並べるときどうすればいいのかを考えるといい(?)

(S3 Like なOSSはどうなっているのだろうか

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