2016-07-18 33 views
1

ich eine Methode geschrieben haben, die URLs unterzeichnet einen S3-Bucket zu lesen, die durch Cloudfront zugegriffen wird:S3/Cloudfront: wie den Inhalt eines Ordners in einen Eimer zur Liste

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; 
} 

Nun arbeitet meine Methode in Ordnung, wenn Der Endpunkt ist auf '' festgelegt. Wenn ich den Ordnernamen in den Endpunkt setze (wie 00Q17000008LRcAEAW/*), erhalte ich eine Reihe von Fehlern in der XML-Antwort.

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,] 

Ich kann nicht den ganzen Eimer auflisten, weil es zu groß für die 1000-Tasten-Grenze ist. Wie kann ich den Ordner auflisten?

+1

Einfache Anführungszeichen sind nicht für Zeichenfolgen in Java. –

+0

Ich würde dringend Jets3t anstelle der Handschrift all dies empfehlen. – chrylis

+0

Ja, es ist nicht auf meiner Plattform verfügbar. –

Antwort

1

Siehe S3 Dokumente für Listenobjekte, V1 und V2 für was S3 erwartet.

Kurz gesagt, müssen Sie das Präfix und das Trennzeichen (fast immer /) in der Abfragezeichenfolge angeben, nicht den Pfad. Der Weg ist immer die Wurzel der Schaufel, für die Objektanzeigen, z.B .:

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

Dies bedeutet auch, dass, wenn Sie ein default root object für die Verteilung definiert haben, können Sie nicht auch Verzeichnislisten durch die Verteilung ziehen. Sie würden eine zweite Distribution benötigen oder in diesem Fall Objektlisten direkt von S3 abrufen müssen.

In jedem Fall, bedenken Sie, dass Objektlisten sind relativ teuer, über 10 × der Preis für eine GET Anfrage, so mit CloudFront, um sie abzurufen, könnte Sinn machen, wenn die Antworten sinnvoll macht, oder Sie tun möchten etwas völlig anderes, für Objektlisten. Ich habe ein Setup mit S3-Ereignisbenachrichtigungen, Lambda und RDS eingeführt, um alle Objekte und ihre Metadaten in einer separaten Near-Real-Time-Datenbank zu speichern, in der ich schnellere und vollständigere Einträge ohne die Kosten (und Ich kann Objekte anhand ihrer Metadaten suchen.

+0

Danke für die ausführliche Information! Das hilft sehr. –