Introdução ao Google Cloud Storage com Java

Introdução ao Google Cloud Storage com Java

1. Visão geral

Google Cloud Storage oferece armazenamento online adaptado às necessidades de um aplicativo individual com base na localização, frequência de acesso e custo. Ao contrário do Amazon Web Services, o Google Cloud Storage usa uma única API para acesso de alta, média e baixa frequência.

Como a maioria das plataformas em nuvem, o Google oferece um nível de acesso gratuito; os detalhes de preços sãohere.

Neste tutorial, vamos nos conectar ao armazenamento, criar um intervalo, gravar, ler e atualizar dados. Ao usar a API para ler e gravar dados, também usaremos o utilitário de armazenamento em nuvemgsutil.

2. Configuração do Google Cloud Storage

2.1. Dependência do Maven

Precisamos adicionar uma única dependência ao nossopom.xml:


    com.google.cloud
    google-cloud-storage
    1.17.0

O Maven Central temlatest version of the library.

2.2. Criar chave de autenticação

Antes de nos conectarmos ao Google Cloud, precisamos configurarauthentication. Os aplicativos Google Cloud Platform (GCP) carregam uma chave privada e informações de configuração de um arquivo de configuração JSON. Geramos esse arquivo através do console do GCP. O acesso ao console requer uma conta válida do Google Cloud Platform.

Criamos nossa configuração:

  1. Indo para oGoogle Cloud Platform Console

  2. Se ainda não definimos um projeto GCP, clicamos no botãocreate e inserimos um nome de projeto, como “example-cloud-tutorial

  3. Selecione “new service account” na lista suspensa

  4. Adicione um nome como “example-cloud-storage” no campo do nome da conta.

  5. Em “role”, selecione Projeto e, em seguida, Proprietário no submenu.

  6. Selecione criar e o console fará o download de um arquivo de chave privada.

A função na etapa 6 autoriza a conta a acessar os recursos do projeto. Por uma questão de simplicidade, concedemos a esta conta acesso completo a todos os recursos do projeto.

Para um ambiente de produção, definiríamos uma função que corresponda ao acesso que o aplicativo precisa.

2.3. Instale a chave de autenticação

Em seguida, copiamos o arquivo baixado do console do GCP para um local conveniente e apontamos a variável de ambienteGOOGLE_APPLICATION_CREDENTIALS para ele. Essa é a maneira mais fácil de carregar as credenciais, embora veremos outra possibilidade abaixo.

Para Linux ou Mac:

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/file"

Para Windows:

set GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\file"

2.4. Instale o Cloud Tools

O Google fornece várias ferramentas para gerenciar sua plataforma em nuvem. Usaremosgsutil durante este tutorial para ler e gravar dados junto com a API.

Podemos fazer isso em duas etapas fáceis:

  1. Instale o Cloud SDK a partir das instruçõeshere para nossa plataforma.

  2. Siga o guia de início rápido para nossa plataformahere. Na etapa 4 deInitialize the SDK, selecionamos o nome do projeto na etapa 4 da seção 2.2 acima (“example-cloud-storage” ou qualquer nome que você tenha usado).

gsutil agora está instalado e configurado para ler dados de nosso projeto de nuvem.

3. Conectando-se aStorage e criando umBucket

3.1. Conecte-se aStorage

Antes de podermos usar o armazenamento do Google Cloud, precisamos criar um objeto de serviço. Se já configuramos a variável de ambienteGOOGLE_APPLICATION_CREDENTIALS, podemos usar a instância padrão:

Storage storage = StorageOptions.getDefaultInstance().getService();

Se não quisermos usar a variável de ambiente, temos que criar uma instânciaCredentialse passá-la paraStorage with o nome do projeto:

Credentials credentials = GoogleCredentials
  .fromStream(new FileInputStream("path/to/file"));
Storage storage = StorageOptions.newBuilder().setCredentials(credentials)
  .setProjectId("example-cloud-tutorial").build().getService();

3.2. Criando umBucket

Agora que estamos conectados e autenticados, podemos criar um intervalo. Caçambas são contêineres que contêm objetos. Eles podem ser usados ​​para organizar e controlar o acesso a dados.

Não há limite para o número de objetos em um balde. GCPlimits o número de operações em intervalos eencourages application designers to emphasize operations on objects rather than on buckets.

A criação de um depósito requer umBucketInfo:

Bucket bucket = storage.create(BucketInfo.of("example-bucket"));

Neste exemplo simples, temos um nome de bloco e aceitamos as propriedades padrão. Bucket names must beglobally unique. Se escolhermos um nome que já foi usado,create() falhará.

3.3. Examinando aBucket comgsutil

Como agora temos um balde, podemos examiná-lo comgsutil.

Vamos abrir um prompt de comando e dar uma olhada:

$ gsutil ls -L -b gs://example-1-bucket/
gs://example-1-bucket/ :
    Storage class:          STANDARD
    Location constraint:        US
    Versioning enabled:     None
    Logging configuration:      None
    Website configuration:      None
    CORS configuration:         None
    Lifecycle configuration:    None
    Requester Pays enabled:     None
    Labels:             None
    Time created:           Sun, 11 Feb 2018 21:09:15 GMT
    Time updated:           Sun, 11 Feb 2018 21:09:15 GMT
    Metageneration:         1
    ACL:
      [
        {
          "entity": "project-owners-385323156907",
          "projectTeam": {
            "projectNumber": "385323156907",
            "team": "owners"
          },
          "role": "OWNER"
        },
        ...
      ]
    Default ACL:
      [
        {
          "entity": "project-owners-385323156907",
          "projectTeam": {
            "projectNumber": "385323156907",
            "team": "owners"
          },
          "role": "OWNER"
        },
            ...
      ]

gsutil se parece muito com comandos do shell, e qualquer pessoa familiarizada com a linha de comando do Unix deve se sentir muito confortável aqui. Observe que passamos no caminho para nosso intervalo como um URL:gs://example-1-bucket/, junto com algumas outras opções.

A opçãols produz uma listagem ouobjects oubuckets, e a opção-L indicou que queremos uma listagem detalhada - então recebemos detalhes sobre obucket incluindo os tempos de criação e controles de acesso.

Vamos adicionar alguns dados ao nosso intervalo!

4. Ler, escrever e atualizar dados

In Google Cloud Storage, objects are stored in Blobs; Os nomesBlob podem conter qualquer caractere Unicode, limitado a 1024 caracteres.

4.1. Gravando dados

Vamos salvar umString em nosso intervalo:

String value = "Hello, World!";
byte[] bytes = value.getBytes(UTF_8);
Blob blob = bucket.create("my-first-blob", bytes);

Como você pode ver, os objetos são simplesmente matrizes debytes no intervalo, portanto, armazenamos umString simplesmente operando com seus bytes brutos.

4.2. Lendo dados comgsutil

Agora que temos um balde com um objeto, vamos dar uma olhada emgsutil.

Vamos começar listando o conteúdo do nosso intervalo:

$ gsutil ls gs://example-1-bucket/
gs://example-1-bucket/my-first-blob

Passamosgsutil a opçãols novamente, mas omitimos-be-L,, então pedimos uma breve lista de objetos. Recebemos uma lista de URIs para cada objeto, que é um no nosso caso.

Vamos examinar o objeto:

$ gsutil cat gs://example-1-bucket/my-first-blob
Hello World!

Cat concatena o conteúdo do objeto para a saída padrão. Vemos oString que escrevemos noBlob.

4.3. Lendo dados

Blobs são atribuídos aBlobId na criação.

A maneira mais fácil de recuperar um Blob é comBlobId:

Blob blob = storage.get(blobId);
String value = new String(blob.getContent());

Passamos o id paraStoragee obtemosBlob de volta, egetContent() retorna os bytes.

Se não tivermosBlobId, podemos pesquisar o intervalo por nome:

Page blobs = bucket.list();
for (Blob blob: blobs.getValues()) {
    if (name.equals(blob.getName())) {
        return new String(blob.getContent());
    }
}

4.4. Atualizando dados

Podemos atualizar umBlob recuperando-o e acessando seuWriteableByteChannel:

String newString = "Bye now!";
Blob blob = storage.get(blobId);
WritableByteChannel channel = blob.writer();
channel.write(ByteBuffer.wrap(newString.getBytes(UTF_8)));
channel.close();

Vamos examinar o objeto atualizado:

$ gsutil cat gs://example-1-bucket/my-first-blob
Bye now!

4.5. Salvar um objeto no arquivo e excluir

Vamos salvar o objeto atualizado em um arquivo:

$ gsutil copy gs://example-1-bucket/my-first-blob my-first-blob
Copying gs://example-1-bucket/my-first-blob...
/ [1 files][    9.0 B/    9.0 B]
Operation completed over 1 objects/9.0 B.
Grovers-Mill:~ egoebelbecker$ cat my-first-blob
Bye now!

Como esperado, a opçãocopy copia o objeto para o nome do arquivo especificado na linha de comando.

gsutil pode copiar qualquer objeto do Google Cloud Storage para o sistema de arquivos local, presumindo que haja espaço suficiente para armazená-lo.

Vamos terminar limpando:

$ gsutil rm gs://example-1-bucket/my-first-blob
Removing gs://example-1-bucket/my-first-blob...
/ [1 objects]
Operation completed over 1 objects.
$ gsutil ls gs://example-1-bucket/
$

rm (del também funciona) exclui o objeto especificado

5. Conclusão

Neste breve tutorial, criamos credenciais para o Google Cloud Storage e nos conectamos à infraestrutura. Criamos um balde, escrevemos dados e depois lemos e modificamos. Como estamos trabalhando com a API, também usamosgsutil para examinar o armazenamento em nuvem à medida que criamos e lemos os dados.

Também discutimos como usar buckets e escrever e modificar dados com eficiência.

Amostras de código, como sempre, podem ser encontradasover on GitHub.