Pensarías que harían público la lectura del comportamiento predeterminado, ¿no? :) Compartí su frustración mientras creaba una API personalizada para interactuar con S3 desde una solución C #. Aquí está el fragmento que logra cargar un objeto S3 y configurarlo en acceso de lectura pública de forma predeterminada:
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 función ToACLString (acl) devuelve lectura pública , BASE_SERVICE_URL es s3.amazonaws.com y la constante AWS_ACL_HEADER es x-amz-acl . El plug y DreamMessage probablemente le parecerán extraños ya que estamos usando el marco de Dream para optimizar nuestras comunicaciones http. Básicamente, estamos haciendo un http PUT con los encabezados especificados y una firma de encabezado especial según las especificaciones de aws (consulte esta página en los documentos de aws para ver ejemplos de cómo construir el encabezado de autorización).
Para cambiar las ACL de 1000 objetos existentes, puede escribir un script, pero probablemente sea más fácil usar una herramienta GUI para solucionar el problema inmediato. Lo mejor que he usado hasta ahora es de una empresa llamada Cloudberry para S3; parece que tienen una prueba gratuita de 15 días para al menos uno de sus productos. Acabo de verificar que le permitirá seleccionar varios objetos a la vez y establecer su ACL en público a través del menú contextual. ¡Disfruta la nube!