追記 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
というオプションは存在していません。見落としていたらすいません。
docs.aws.amazon.com
でも、S3 の API ドキュメントを見ると、怪しい記述が...
docs.aws.amazon.com
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
オプションをラップしたものなのかなーという結論に至りましたとさ。
現場からは以上です!