追記 2022/07/30
AWS CLI の --debug
を使えば、API リクエストの様子も見れるので、試してみたら案の定 key-marker
パラメータが付いてた。
$ aws --debug s3api list-object-versions --bucket BUCKET_NAME --key d/ --query 'DeleteMarkers[]' ... GET /BUCKET_NAME encoding-type=url&key-marker=d%2F&versions= host:s3.ap-northeast-1.amazonaws.com x-amz-content-sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x-amz-date:20220729T223700Z ...
タイトルが
釣りっぽくなってしまい恐縮ですが、詳しい情報をお持ちの方がいらっしゃったら教えて下さいmm
ちなみに、本記事での AWS CLI のバージョンは以下の通りです。
$ aws --version aws-cli/2.7.11 Python/3.10.5 Darwin/21.5.0 source/x86_64 prompt/off
最新バージョン (2.7.19) ではありません。
--key オプションって何?
見つけたというと大げさだけど、たまたま、とある S3 バケットの development/
というプレフィックス以下のオブジェクトバージョン一覧を取得したくて、以下のようなリクエストを送っていて気づきました。
$ aws s3api list-object-versions --bucket BUCKET_NAME --key deployment'
パスの名前は development/
なのに、リクエストには、存在しないオプション (--key
) で、さらに存在しないプレフィックス (deployment/
) を指定していたにも関わらず、ちゃんと、以下のようなレスポンスを返していたのです...
[ "development/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1", ... "development/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx99", ]
え、なんで?
API リファレンスを見ると...
以下のリファレンスによると、aws s3api list-object-versions
には、確かに --key
というオプションは存在していません。見落としていたらすいません。
でも、S3 の API ドキュメントを見ると、怪しい記述が...
key-marker
というリクエストパラメータが存在するらしいぞ...
key-marker Specifies the key to start with when listing objects in a bucket.
おお、そうなのかー。ということで、awscurl を使って確認。
$ awscurl --service s3 'https://s3.ap-northeast-1.amazonaws.com/BUCKET_NAME/?versions&key-marker=deployment' | tidy -xml -iq
以下のように、AWS CLI で --key
オプションを付与した際と同じレスポンスが返ってきます。
<?xml version="1.0" encoding="utf-8"?> <ListVersionsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>BUCKET_NAME</Name> <Prefix></Prefix> <KeyMarker>dev</KeyMarker> <VersionIdMarker></VersionIdMarker> <NextKeyMarker> development/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1</NextKeyMarker> <NextVersionIdMarker> ...
おおー、なるほどー、隠しオプション?? の --key
は、API の key-marker
オプションをラップしたものなのかなーという結論に至りましたとさ。
現場からは以上です!