2016-07-18 13 views
1

バケツにフォルダの内容を一覧表示する方法:今S3/CloudFrontは:私はCloudFrontを介してアクセスされるS3バケット読み取るためのURLに署名する方法書いて

private HTTPResponse signURL(String endpoint) { 
    String keyPairId = 'keyPairId'; 
    String secret = 'SOME_SECRET'; 
    String method = 'GET'; 
    Datetime dt  = Datetime.now(); 
    Long l   = dt.getTime(); 
    Long expiryLong = (l/1000) + 3600; 
    String expiry = String.valueOf(expiryLong); 
    String policy = policy('http://' + cfhost + '/' + endpoint, expiry); 
    String policyEnc = EncodingUtil.base64Encode(Blob.valueOf(policy)); 
    String rPolicy = cfReplace(policyEnc); 
    Blob mac   = Crypto.generateMac('HMACSHA1', 
              Blob.valueOf(rPolicy), 
              Blob.valueOf(secret)); 
    String signature = cfReplace(EncodingUtil.base64Encode(mac)); 

    HttpRequest req = new HttpRequest(); 
    req.setMethod(method); 
    req.setEndpoint('http://' + cfhost + '/' + endpoint + '?Policy=' + 
     policyEnc + '&Signature=' + signature + '&Key-Pair-Id=' + 
     keyPairId); 

    Http http = new Http(); 
    HTTPResponse res = http.send(req); 
    return res; 
} 

を、私の方法があれば正常に動作しますエンドポイントは''に設定されます。私がエンドポイントに(00Q17000008LRcAEAW/*のような)フォルダ名を置くと、私はXMLレスポンスに一連のエラーを出します。

XMLNode[ELEMENT,Error,null,null,null,[XMLNode[ELEMENT,Code,null,null,null,[XMLNode[TEXT,null,null,null,null,null,NoSuchKey,]],null,], XMLNode[ELEMENT,Message,null,null,null,[XMLNode[TEXT,null,null,null,null,null,The specified key does not exist.,]],null,], XMLNode[ELEMENT,Key,null,null,null,[XMLNode[TEXT,null,null,null,null,null,00Q17000008LRcAEAW/*,]],null,], XMLNode[ELEMENT,RequestId,null,null,null,[XMLNode[TEXT,null,null,null,null,null,some_req_id,]],null,], XMLNode[ELEMENT,HostId,null,null,null,[XMLNode[TEXT,null,null,null,null,null,some_host_id,]],null,]],null,] 

1000キーの上限には大きすぎるため、バケット全体をリストすることはできません。どのようにフォルダを一覧表示できますか?

+1

単一引用符はJavaの文字列ではありません。 –

+0

これを手書きで書くのではなく、jets3tを使うことを強くお勧めします。 – chrylis

+0

私のプラットフォームでは利用できません。 –

答えて

1

リストオブジェクトのS3ドキュメント、V1およびV2のS3の機能を参照してください。

要するに、パスではなく、クエリ文字列に接頭辞と区切り記号(ほとんどの場合は/)を指定する必要があります。パスは、例えば、オブジェクトリストのために、常にバケットのルートです。:

https://dxxxexample.cloudfront.net/?delimiter=/&prefix=00Q17000008LRcAEAW/&... 

これはまた、あなたが配布用に定義されdefault root objectを持っている場合、あなたはまた、配布を通じてディレクトリ一覧を引くことができないことを意味します。 2番目のディストリビューションが必要な場合や、その場合はS3から直接オブジェクトリストを取得する必要があります。

オブジェクトのリストは、GETリクエストの10倍以上の費用がかかります。そのため、CloudFrontを使用して応答をキャッシュすることが意味をなさせるかもしれません。オブジェクトリストの場合、まったく異なるもの。私は、S3イベント通知、Lambda、およびRDSを使用して、すべてのオブジェクトとそのメタデータを別のほぼリアルタイムのデータベースに格納するためのセットアップを展開していました。メタデータに基づいてオブジェクトを検索できます)。

+0

詳細な情報をありがとう!それは大いに役立ちます。 –

関連する問題