はじめに
前回、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で指定してあげると続きが読み出せるというもの。
コメント