AmazonS3 RESTパケット解析(リスト取得)

AmazonS3 RESTパケット解析 S3

はじめに

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

コメント

タイトルとURLをコピーしました