Práticas recomendadas do Cloud Storage

Introdução

Esta página contém um resumo das práticas recomendadas de outras páginas na documentação do Cloud Storage. Você pode usar as práticas recomendadas listadas aqui como uma referência rápida do que precisa ser lembrado ao criar um aplicativo que usa o Cloud Storage. Siga estas práticas recomendadas ao iniciar um aplicativo comercial.

Se você é iniciante no Cloud Storage, esta página pode não ser o melhor lugar para começar, já que não ensina o básico sobre a utilização dele. Se você é um novo usuário, sugerimos que comece com Primeiros passos: como usar o Console do GCP ou Primeiros passos: como usar a ferramenta gsutil.

Nomenclatura

  • O namespace do intervalo é global e visível publicamente. Cada nome de intervalo precisa ser exclusivo em todo o namespace do Cloud Storage. Para mais informações, consulte as Diretrizes de nomenclatura de intervalos e objetos.

  • Se você precisar de muitos intervalos, use GUIDs ou um equivalente para nomes de intervalo, coloque a lógica de repetição em seu código para lidar com colisões de nomes e mantenha uma lista para fazer referência cruzada a seus intervalos. Outra opção é usar intervalos com nome de domínio e gerenciar os nomes dos intervalos como subdomínios.

  • Não use códigos de usuário, endereços de e-mail, nomes de projetos, números de projetos ou qualquer informação pessoal identificável (PII, na sigla em inglês) em nomes de intervalos, porque qualquer um pode pesquisar a existência de um intervalo. Da mesma forma, tenha muito cuidado ao inserir PII nos nomes dos objetos, porque os nomes dos objetos aparecem nos URLs deles.

  • Os nomes de intervalo precisam estar em conformidade com as convenções de nomenclatura padrão do DNS, porque um nome de intervalo pode aparecer em um registro DNS como parte de um redirecionamento CNAME. Para detalhes sobre os requisitos de nome de intervalo, consulte Requisitos de nome de intervalo.

  • As barras em objetos não têm um significado especial para o Cloud Storage, já que não há compatibilidade com diretório nativo. Devido a isso, estruturas em diretórios aninhadas profundamente usando delimitadores de barra são possíveis, mas não terão o desempenho de um sistema de arquivos nativo que lista subdiretórios aninhados profundamente.

  • Evite usar nomes de arquivos sequenciais, como nomes de arquivos baseados em carimbos de data/hora se você estiver fazendo o upload de muitos arquivos em paralelo. Como os arquivos com nomes sequenciais são armazenados consecutivamente, é provável que eles atinjam o mesmo servidor de back-end, o que significa que a capacidade será restrita. Para atingir a capacidade ideal, você pode adicionar o hash do número de sequência como parte do nome do arquivo para torná-lo não sequencial. Para mais informações, consulte as Diretrizes de taxa de solicitação e distribuição de acesso.

Tráfego

  • Faça uma estimativa do valor do tráfego que será enviado para o Cloud Storage. Pense especificamente em:

    • Operações por segundo. Quantas operações por segundo você espera, tanto para intervalos e objetos, quanto para operações de criação, atualização e exclusão.

    • Largura de banda. Quantos dados serão enviados, em que período de tempo?

    • Controle de cache. Especificar os metadados de Cache-Control nos objetos reduzirá a latência de leitura em objetos ativos ou frequentemente acessados. Consulte Como ver e editar metadados para mais instruções sobre como configurar metadados de objetos, como Cache-Control.

  • Projete seu aplicativo para minimizar picos no tráfego. Se houver clientes do seu aplicativo fazendo atualizações, distribua-os ao longo do dia.

  • Mesmo que o Cloud Storage não tenha limite superior na taxa de solicitação, para conseguir o melhor desempenho ao escalonar para altas taxas, siga as Diretrizes de taxa de solicitação e distribuição de acesso.

  • Esteja ciente de que há limites de taxa para determinadas operações e projete seu aplicativo de acordo.

  • Se você receber um erro, use a retirada exponencial para evitar problemas devido a grandes intensidades de tráfego.

  • Entenda o nível de desempenho que os clientes esperam do seu aplicativo. Essas informações ajudarão você a escolher uma opção de armazenamento e região ao criar novos intervalos.

Opções de armazenamento de dados e regiões

  • Os dados que serão exibidos em uma taxa alta com alta disponibilidade precisarão usar a classe Multi-Regional Storage ou a Regional Storage. Essas classes fornecem a melhor disponibilidade, mas por um preço mais alto.

  • Dados que serão acessados com pouca frequência e podem ter disponibilidade um pouco menor podem ser armazenados usando a classe Nearline Storage ou a Coldline Storage.

  • Armazene seus dados em uma região mais próxima dos usuários do seu aplicativo. Por exemplo, para dados da UE, você pode escolher um intervalo da UE e, para dados dos EUA, escolher um intervalo nos EUA. Para mais informações, consulte Locais de intervalo.

  • Tenha em mente os requisitos de conformidade ao escolher um local para os dados do usuário. Há requisitos legais em torno dos locais que seus usuários fornecerão dados?

Segurança, ACLs e controle de acesso

  • A primeira e mais importante precaução é: nunca compartilhe suas credenciais. É necessário que cada usuário tenha credenciais distintas.

  • Ao imprimir detalhes do protocolo HTTP, suas credenciais de autenticação, como tokens OAuth 2.0, ficam visíveis nos cabeçalhos. Se você precisar postar detalhes do protocolo em um quadro de mensagens ou fornecer detalhes do protocolo HTTP para solução de problemas, limpe ou revogue quaisquer credenciais que aparecem como parte da saída.

  • Sempre use TLS (HTTPS) para transportar seus dados quando puder. Isso assegura que suas credenciais e seus dados sejam protegidos conforme você os transporta pela rede. Por exemplo, para acessar a API Cloud Storage, use https://storage.googleapis.com.

  • Use uma biblioteca HTTPS que valide os certificados do servidor. A falta de uma validação de certificado do servidor torna seu aplicativo vulnerável a ataques "man-in-the-middle" ou outros tipos de ataque. As bibliotecas HTTPS enviadas com determinadas linguagens de implementação usadas normalmente não verificam, por padrão, os certificados do servidor. Por exemplo, o Python anterior à versão 3.2 não tem suporte integrado ou completo para a validação de certificado de servidor e você precisa usar bibliotecas de wrapper de terceiros para garantir que seu aplicativo valide os certificados do servidor. O plugin boto inclui código que valida os certificados do servidor por padrão.

  • Quando os aplicativos não precisarem mais de acesso a seus dados, revogue suas credenciais de autenticação. Para fazer isso em serviços e APIs do Google, faça login nas permissões da Conta do Google, clique nos aplicativos desnecessários e depois clique em Remover acesso.

  • Certifique-se de que suas credenciais sejam armazenadas com segurança. Isso pode ser feito de maneira diferente, dependendo de seu ambiente e de onde você armazena suas credenciais. Por exemplo, se você armazenar suas credenciais em um arquivo de configuração, defina permissões apropriadas nesse arquivo para impedir o acesso indesejado. Se estiver usando o Google App Engine, considere usar StorageByKeyName para armazenar suas credenciais.

  • As solicitações do Cloud Storage se referem a intervalos e objetos pelos nomes deles. Como resultado, mesmo que as ACLs impeçam a operação não autorizada de terceiros em intervalos ou objetos, um terceiro pode tentar solicitações com nomes de intervalo ou de objeto e determinar a existência deles observando as respostas de erro. Dessa forma, é possível que as informações em nomes de intervalo ou de objeto vazem. Se você estiver preocupado com a privacidade de seus nomes de intervalo ou de objeto, tome as precauções adequadas, como:

    • Escolher nomes de intervalo e de objeto difíceis de adivinhar. Por exemplo, um intervalo chamado mybucket-gtbytul3 é aleatório o suficiente, de modo que terceiros não autorizados não possam adivinhá-lo ou enumerar outros nomes de intervalo a partir dele.

    • Evite usar informações confidenciais como parte de nomes de intervalos ou objetos. Por exemplo, em vez de nomear seu intervalo como mysecretproject-prodbucket, use somemeaninglesscodename-prod. Em alguns aplicativos, convém manter os metadados confidenciais em cabeçalhos personalizados do Cloud Storage, tal como x-goog-meta, em vez de codificar os metadados nos nomes de objetos.

  • Use grupos em vez de listar explicitamente um número grande de usuários. Isso não só torna o escalonamento melhor, mas também fornece uma maneira muito eficiente de atualizar o controle de acesso para um número grande de objetos de uma só vez. Por fim, é mais barato porque você não precisa fazer uma solicitação por objeto para alterar as ACLs.

  • Antes de adicionar objetos a um intervalo, verifique se as ACLs de objeto padrão estão definidas de acordo com seus requisitos primeiro. Isso pode poupar muito tempo atualizando ACLs para objetos individuais.

  • ACLs de intervalo e de objeto são independentes umas das outras, o que significa que as ACLs em um intervalo não afetam as ACLs em objetos dentro desse intervalo. É possível que um usuário sem permissões em um intervalo tenha permissões em um objeto dentro do intervalo. Por exemplo, é possível criar um intervalo de tal forma que apenas o GrupoA tenha permissão para listar os objetos dele e depois fazer o upload de um objeto para esse intervalo que concede ao GrupoB o acesso READ ao objeto. O GrupoB poderá ler o objeto, mas não poderá exibir o conteúdo do intervalo ou executar tarefas relacionadas a ele.

  • O sistema de controle de acesso do Cloud Storage inclui a capacidade de especificar que os objetos são legíveis publicamente. Certifique-se de que você pretende que qualquer objeto gravado com essa permissão seja público. Uma vez "publicados", os dados na Internet podem ser copiados para muitos lugares, por isso é efetivamente impossível recuperar o controle de leitura sobre um objeto gravado com essa permissão.

  • O sistema de controle de acesso do Cloud Storage inclui a capacidade de especificar que os intervalos são graváveis publicamente. Mesmo que configurar um intervalo dessa maneira possa ser conveniente para vários fins, recomendamos evitar o uso dessa permissão. Ela pode ser usada para distribuir conteúdo ilegal, vírus e outros malwares, e o proprietário do intervalo é legal e financeiramente responsável pelo conteúdo armazenado.

    Se você precisar disponibilizar o conteúdo com segurança para usuários que não têm contas do Google, recomendamos que você use URLs assinados. Por exemplo, com URLs assinados, você pode fornecer um link para um objeto e os clientes do seu aplicativo não precisam se autenticar com o Cloud Storage para acessá-lo. Quando você cria um URL assinado, controla o tipo (leitura, gravação, exclusão) e a duração do acesso.

  • Se você usa o gsutil, consulte estas recomendações adicionais.

Como fazer o upload de dados

  • Se você usar callbacks XMLHttpRequest (XHR) para receber atualizações de progresso, não feche e reabra a conexão se detectar que o progresso parou. Isso cria um loop de feedback positivo ruim durante os períodos de congestionamento da rede. Quando a rede está congestionada, os callbacks do XHR podem ser acumulados ​​em relação à atividade de confirmação (ACK/NACK) do fluxo de upload, e fechar e reabrir a conexão quando isso acontece usa mais capacidade de rede exatamente no momento em que você menos pode arcar com isso.

  • Para o tráfego de upload, recomendamos a configuração de tempos limite razoavelmente longos. Para uma boa experiência do usuário final, você pode definir um cronômetro do lado do cliente que atualiza a janela de status do cliente com uma mensagem (por exemplo, "congestionamento de rede") quando seu aplicativo não recebe um retorno de chamada XHR por muito tempo. Não feche a conexão e tente novamente quando isso acontecer.

  • Se você usa instâncias do Compute Engine com processos que enviam POST para o Cloud Storage para iniciar um upload recuperável, use instâncias do Compute Engine nos mesmos locais que seus intervalos do Cloud Storage. Em seguida, você pode usar um serviço de IP geográfico para escolher a região do Compute Engine para onde você encaminha solicitações de clientes, o que ajudará a manter o tráfego localizado em uma região geográfica.

  • Para uploads recuperáveis, a sessão recuperável precisa permanecer na região em que foi criada. Isso reduz o tráfego entre regiões que surge ao ler e gravar o estado da sessão, melhorando o desempenho do upload recuperável.

  • Evite dividir uma transferência em partes menores, se possível, e faça o upload de todo o conteúdo de uma só vez. Evitar essa divisão remove os custos fixos de latência e melhora a capacidade, além de reduzir o QPS em relação ao Cloud Storage.

    Situações em que é recomendável considerar o upload em partes incluem quando seus dados de origem estão sendo gerados dinamicamente, seus clientes têm limitações de tamanho de solicitação (o que é verdadeiro para muitos navegadores) ou seus clientes não conseguem transmitir bytes em uma única solicitação sem antes carregar a solicitação completa na memória. Se seus clientes receberem um erro, eles poderão consultar o servidor quanto ao deslocamento de confirmação e continuar fazendo o upload dos bytes restantes desse deslocamento.

  • Se possível, evite fazer upload de conteúdo que tenha content-encoding: gzip e um content-type compactado porque isso pode levar a um comportamento inesperado.

Como excluir dados

Se você acredita que o software ou os usuários do aplicativo podem excluir ou substituir erroneamente os objetos em algum momento, o Cloud Storage tem recursos que ajudam a proteger seus dados:

Listagem de objetos

Se você acabou de excluir muitos objetos do seu intervalo, a listagem de objetos pode ficar temporariamente muito lenta. Isso ocorre porque os registros excluídos não são eliminados imediatamente do sistema de armazenamento subjacente, portanto, a listagem de objetos precisa pular os registros excluídos ao localizar os objetos a serem retornados.

Em algum momento, os registros excluídos são removidos do sistema de armazenamento subjacente, e o desempenho da listagem de objetos se normaliza novamente. Isso normalmente leva algumas horas, mas em alguns casos pode levar alguns dias.

Projete sua carga de trabalho para evitar a listagem de um intervalo de objetos com muitas exclusões recentes. Por exemplo, se você estiver tentando excluir objetos de um intervalo listando-os repetidamente e excluindo-os, use o token de página retornado pela resposta de listagem de objetos para emitir a próxima solicitação de listagem, em vez de reiniciar a listagem desde o início para cada solicitação. Quando você recomeça sua listagem desde o início, cada solicitação precisa pular todos os objetos que acabaram de ser excluídos, fazendo com que a listagem de objetos fique mais lenta. Se você tiver excluído muitos objetos sob um determinado prefixo, tente evitar listar objetos nesse prefixo logo após as exclusões.

Hospedagem de site

O tópico Compartilhamento de recursos entre origens (CORS, na sigla em inglês) descreve como permitir que scripts hospedados em outros sites acessem recursos estáticos armazenados em um intervalo do Cloud Storage. O cenário inverso é quando você permite que scripts hospedados no Cloud Storage acessem recursos estáticos hospedados em um site fora do Cloud Storage. No segundo cenário, o site está disponibilizando cabeçalhos CORS para que o conteúdo em storage.googleapis.com tenha acesso permitido. Recomenda-se que você dedique um intervalo específico para esse acesso a dados. Por exemplo, é melhor que o site exiba o cabeçalho CORS Access-Control-Allow-Origin: https://mybucket.storage.googleapis.com, em vez de Access-Control-Allow-Origin: https://storage.googleapis.com. Essa abordagem impede que o site exponha recursos estáticos a todos storage.googleapis.com inadvertidamente.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.