ようへいの日々精進XP

よかろうもん

(小ネタ道場一本勝負) AWS CLI の s3api に隠しオプションを発見!?

追記 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 は、APIkey-marker オプションをラップしたものなのかなーという結論に至りましたとさ。

現場からは以上です!