はじめに
AmazonS3のバケット内のリスト取得をキャプチャしてみる。
awscliコマンド
以下のコマンドで発行。
aws s3 ls s3://XXXXXXXXXXXXXXX/folder
リクエストパケット(HTTP 整形済み)
GET /XXXXXXXXXXXXXXX?list-type=2&delimiter=%2F&prefix=folder&encoding-type=url HTTP/1.1 Host: 192.168.5.128 Accept-Encoding: identity X-Amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 X-Amz-Date: 20200310T230624Z Authorization: AWS4-HMAC-SHA256 Credential=AAAAAAAAAAAAAAAAAAAA/20200310/ap-northeast-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=7dcda1a373749e306c11d2731f2c8434de494174c909531eb5c7e59d2828003c User-Agent: aws-cli/1.16.51 Python/2.7.15 Windows/10 botocore/1.12.41
解説
AWS S3 仕様のGET Bucket に相当。
バケットに対してGETメソッド に以下のパラメータが付随。
list-type=2 # 2はXML方式を指定。ただし、現在は2以外を受けつけない delimiter=%2F # %2Fは「 / 」をエスケープしたもの。「 / 」をデリミタとして解釈しなさいという意味になる。 prefix=folder # folderというプレフィックスで検索せいやって意味 encoding-type=url # XML1.0だと表現できない文字を%01みたいな感じで表示する指示らしい
要は、
S3 のDataBaseに対して
「接頭語が”folder”でEOL以外の終端は”/”で検索してくれ。」
と指示している状態。
lsなんでもっとシンプルな指示かと思ったが、絶対パスで指定するような方式しかない様子。
S3がファイルシステムのような構造ではなく、PathがDatabase上に於いてのKeyとなっているのが見て取れるコマンドと言える。
注意点
URI のクエリパラメータ
(今回の場合だと「list-type=2&delimiter=%2F&prefix=folder&encoding-type=url」が該当)
は、AWSの署名処理時にはアルファベット順にソートされている必要がある。
あと、先頭の「?」は含めない。
このルールを知らないと「SignatureDoesNotMatch」とだけ言われて、何が間違っているのかよくわからない事態に追い込まれる。
レスポンスパケット(HTTP /XML 整形済み)
HTTP/1.1 200 OK\r\n Accept-Ranges: bytes\r\n Content-Security-Policy: block-all-mixed-content Content-Type: application/xml Vary: Origin X-Amz-Bucket-Region: ap-northeast-1 X-Amz-Request-Id: 156D925F3759E01D X-Xss-Protection: 1; mode=block Date: Tue, 10 Mar 2020 23:06:24 GMT Transfer-Encoding: chunked 44d <?xml version="1.0" encoding="UTF-8"?> <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>XXXXXXXXXXXXXXX</Name> <Prefix>folder</Prefix> <NextContinuationToken>test2.txt</NextContinuationToken> <KeyCount>3</KeyCount> <MaxKeys>1000</MaxKeys> <Delimiter>/</Delimiter> <IsTruncated>false</IsTruncated> <Contents> <Key>test.txt</Key> <LastModified>2020-03-10T23:05:17.707Z</LastModified> <ETag>"00000000000000000000000000000000-1"</ETag> <Size>0</Size> <Owner> <ID></ID> <DisplayName></DisplayName> </Owner> <StorageClass>STANDARD</StorageClass> </Contents> <Contents> <Key>test1.txt</Key> <LastModified>2020-03-10T23:06:01.744Z</LastModified> <ETag>"00000000000000000000000000000000-2"</ETag> <Size>0</Size> <Owner> <ID></ID> <DisplayName></DisplayName> </Owner> <StorageClass>STANDARD</StorageClass> </Contents> <Contents> <Key>test2.txt</Key> <LastModified>2020-03-10T23:06:04.944Z</LastModified> <ETag>"00000000000000000000000000000000-3"</ETag> <Size>0</Size> <Owner> <ID></ID> <DisplayName></DisplayName> </Owner> <StorageClass>STANDARD</StorageClass> </Contents> </ListBucketResult> 0
コメント