AmazonS3 RESTパケット解析(リスト取得 max-key付き)

AmazonS3 RESTパケット解析 S3

はじめに

前回、AmazonS3に対してリスト取得のパケットキャプチャを実施した。
しかし、GET Bucket のレスポンス長はディレクトリのファイル数に依存し、必要メモリサイズが予測できないことが多い。
特にIoT 関連デバイス含めた組込み系システムに於いて、必要メモリサイズ不明は死活問題になる。
それをある程度回避するクリエパラメータとして、以下が存在。

  • max-keys
  • start-after

使用例

リクエスト1

<!-- ※※※ max-keysを3で指定 ※※※ --> 
delimiter=%2F&encoding-type=url&list-type=2&max-keys=3&prefix=YYYYYYYYYYYY%2F

レスポンス1

<Name>XXXXXXXXXXXXXXX</Name><Prefix>YYYYYYYYYYYY/</Prefix>
<NextContinuationToken>YYYYYYYYYYYY/00000003.log</NextContinuationToken>  <!-- ※※※ ←ここの「YYYYYYYYYYYY/00000003.log」を覚えておく ※※※ -->
<KeyCount>3</KeyCount><MaxKeys>3</MaxKeys><Delimiter>/</Delimiter><IsTruncated>true</IsTruncated>
<Contents><Key>YYYYYYYYYYYY/00000001.log</Key><LastModified>2020-03-10T04:25:22.789Z</LastModified><ETag>"44c489af4e61548fe28c628ec0f6afb0"</ETag><Size>262143</Size><Owner><ID></ID><DisplayName></DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents>
<Contents><Key>YYYYYYYYYYYY/00000002.log</Key><LastModified>2020-03-10T04:25:23.500Z</LastModified><ETag>"44c489af4e61548fe28c628ec0f6afb0"</ETag><Size>262143</Size><Owner><ID></ID><DisplayName></DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents>
<Contents><Key>YYYYYYYYYYYY/00000003.log</Key><LastModified>2020-03-10T04:25:24.213Z</LastModified><ETag>"44c489af4e61548fe28c628ec0f6afb0"</ETag><Size>262143</Size><Owner><ID></ID><DisplayName></DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>

リクエスト2

<!-- ※※※ max-keysを3で指定 、且つ、start-afterに先ほどの「YYYYYYYYYYYY/00000003.log」を指定 ※※※ --> 
delimiter=%2F&encoding-type=url&list-type=2&max-keys=3&prefix=YYYYYYYYYYYY%2F&start-after=YYYYYYYYYYYY%2F00000003.log

レスポンス2

<Name>XXXXXXXXXXXXXXX</Name><Prefix>YYYYYYYYYYYY/</Prefix><StartAfter>YYYYYYYYYYYY/00000003.log</StartAfter>
<NextContinuationToken>YYYYYYYYYYYY/00000006.log</NextContinuationToken> <!-- ※※※ ←ここの「YYYYYYYYYYYY/00000006.log」を覚えておいて、次のstart-afterでしていすれば、さらに続きが参照可能 ※※※ -->
<KeyCount>3</KeyCount><MaxKeys>3</MaxKeys><Delimiter>/</Delimiter><IsTruncated>true</IsTruncated>
<Contents><Key>YYYYYYYYYYYY/00000004.log</Key><LastModified>2020-03-10T04:25:24.931Z</LastModified><ETag>"44c489af4e61548fe28c628ec0f6afb0"</ETag><Size>262143</Size><Owner><ID></ID><DisplayName></DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents>
<Contents><Key>YYYYYYYYYYYY/00000005.log</Key><LastModified>2020-03-10T04:25:25.673Z</LastModified><ETag>"44c489af4e61548fe28c628ec0f6afb0"</ETag><Size>262143</Size><Owner><ID></ID><DisplayName></DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents>
<Contents><Key>YYYYYYYYYYYY/00000006.log</Key><LastModified>2020-03-10T04:25:26.400Z</LastModified><ETag>"44c489af4e61548fe28c628ec0f6afb0"</ETag><Size>262143</Size><Owner><ID></ID><DisplayName></DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>

まとめ

これを繰り返すことで、最終的にはディレクトリ内に存在するファイルをすべて特定可能。
当然、ディレクトリの深さやファイル名でレスポンス長が変化するが、
凡そ用意しておくサイズの予測はし易くなる。

あと、似たような仕様として以下も存在。

  • ContinuationToken
  • NextContinuationToken

こちらは、ContinuationTokenをクエリパラメータに指定すると、続きを得るためのハッシュ値を取得でき、そのハッシュ値をNextContinuationTokenで指定してあげると続きが読み出せるというもの。

コメント

タイトルとURLをコピーしました