読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

S3: GetBucketの仕様

GET Bucket (List Objects) - Amazon Simple Storage Service

Get Bucketは, バケットの中のオブジェクトをリストするためのAPIなのだが, 仕様が複雑だ.

結論としては,

  1. markerで示されるものよりあとを全リストする.
  2. prefixでフィルタする.
  3. delimiterが指定された場合は, グルーピングする. list.groupBy(_.pathBefore(givenPrefix)みたいな感じのコードになる.
  4. "All of the keys rolled up in a common prefix count as a single return when calculating the number of returns" と書いてるように, グループは1カウントとして, リストの長さとする.
  5. maxKeysと比較して, truncateされたか計算する.
  6. NextMarkerは, "This element is returned only if you have delimiter request parameter specified. If response does not include the NextMaker and it is truncated, you can use the value of the last Key in the response as the marker in the subsequent request to get the next set of object keys."に基づいて計算する. (ListPartsは明にNextmarkerを指定することを強要するがなぜだ?考えたやつがバカ?)

という考え方で実装するのがもっともいいのではないかと思う.

Get Bucketがこのように色々なパラメータを指定出来るようになっているのは,

  • prefixによってバケット内に仮想的なバケットを構築する
  • delimiterによって結果をグルーピングする. 結果をリストで返す場合, そのリストが巨大になるのを防ぐため, 上限を指定することが出来る. デフォルトは1000が全体的に使われている
  • NextMarkerとtruncatedは, その分割されたリストをリンクさせるためである. (この仕様は優れている. 仮に2回のGet Bucketリクエストの間でキーが削除されてしまったとしても, 同じキーを二度返すことはない)

という機能を持たせるためである.