Penseresti che renderebbero pubblico leggere il comportamento predefinito, vero? :) Ho condiviso la tua frustrazione durante la creazione di un'API personalizzata per interfacciarsi con S3 da una soluzione C #. Ecco lo snippet che esegue il caricamento di un oggetto S3 e l'impostazione predefinita per l'accesso in lettura pubblica:
public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) {
string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower());
DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes);
msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType;
msg.Headers[DreamHeaders.EXPECT] = "100-continue";
msg.Headers[AWS_ACL_HEADER] = ToACLString(acl);
try {
Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader);
s3Client.At(id).Put(msg);
} catch (Exception ex) {
throw new ApplicationException(String.Format("S3 upload error: {0}", ex.Message));
}
}
La funzione ToACLString (acl) restituisce public-read , BASE_SERVICE_URL è s3.amazonaws.com e la costante AWS_ACL_HEADER è x-amz-acl . Il plug e il materiale di DreamMessage probabilmente ti sembreranno strani poiché utilizziamo il framework Dream per semplificare le nostre comunicazioni http. Essenzialmente stiamo eseguendo un PUT http con le intestazioni specificate e una firma di intestazione speciale per le specifiche aws (vedere questa pagina nei documenti aws per esempi su come costruire l'intestazione di autorizzazione).
Per modificare un 1000 ACL di oggetti esistenti è possibile scrivere uno script, ma probabilmente è più semplice utilizzare uno strumento GUI per risolvere il problema immediato. Il migliore che ho usato finora proviene da una società chiamata cloudberry per S3; sembra che abbiano una prova gratuita di 15 giorni per almeno uno dei loro prodotti. Ho appena verificato che ti consentirà di selezionare più oggetti contemporaneamente e di impostare il loro ACL su pubblico tramite il menu contestuale. Goditi il cloud!