Você pensaria que eles tornariam público a leitura do comportamento padrão, não é? :) Compartilhei sua frustração ao construir uma API personalizada para fazer a interface com o S3 a partir de uma solução C #. Aqui está o snippet que realiza o upload de um objeto S3 e a configuração para acesso de leitura pública por padrão:
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));
}
}
A função ToACLString (acl) retorna leitura pública , BASE_SERVICE_URL é s3.amazonaws.com e a constante AWS_ACL_HEADER é x-amz-acl . O plug e o DreamMessage provavelmente parecerão estranhos para você, já que estamos usando a estrutura do Dream para agilizar nossas comunicações http. Basicamente, estamos fazendo um http PUT com os cabeçalhos especificados e uma assinatura de cabeçalho especial de acordo com as especificações do aws (consulte esta página na documentação do aws para exemplos de como construir o cabeçalho de autorização).
Para alterar ACLs de 1000 objetos existentes, você pode escrever um script, mas provavelmente é mais fácil usar uma ferramenta de GUI para corrigir o problema imediato. O melhor que usei até agora é de uma empresa chamada cloudberry for S3; parece que eles têm uma avaliação gratuita de 15 dias para pelo menos um de seus produtos. Acabei de verificar que isso permitirá que você selecione vários objetos de uma vez e defina sua ACL como pública por meio do menu de contexto. Aproveite a nuvem!