Começar a usar o Cloud Storage

O Google Display & Video 360 armazena automaticamente arquivos da leitura de entidades no Google Cloud Storage. Esses arquivos só podem ser acessados pelas contas com acesso concedido.

Criar um projeto

Crie e configure um projeto da seguinte maneira:

  1. Acesse a página de APIs ativadas pelo Console de APIs do Google.

    Você será solicitado a fazer login no Google, caso ainda não tenha feito isso.

  2. Na lista suspensa do projeto, selecione um projeto existente ou crie um novo.
    • Se você tiver vários projetos atuais, selecione aquele em que você quer ativar o Google Cloud Storage e, em seguida, selecione Continuar.
    • Se você não tiver um projeto, selecione Criar um novo projeto, digite um nome e selecione Criar.

      Observação: você precisa estar ciente de que alguns identificadores de recursos (como IDs do projeto) podem ser mantidos após o fim da vida útil do projeto. Por esse motivo, evite armazenar informações confidenciais em identificadores de recursos.

  3. Na lista de APIs ativadas, confira se o componente Google Cloud Storage está na lista. Se ele não estiver listado, clique na guia APIs do Google, pesquise e selecione o componente do Google Cloud Storage e clique em Ativar API.

    Observe que, para a maioria dos projetos, o componente Google Cloud Storage já está ativado. Se você planeja acessar o Google Cloud Storage usando a API JSON, verifique também se essa API está ativada.

  4. Ative o faturamento do projeto.

    Antes de usar o Google Cloud Storage, ative o faturamento do seu projeto, caso ainda não tenha feito isso. Ativar o faturamento não significa necessariamente que você será cobrado. Para mais informações, consulte Preços.

    1. Ainda no projeto do armazenamento em nuvem, clique no menu da galeria no canto superior esquerdo e selecione Faturamento.
    2. Se você ainda não tiver uma conta de faturamento, siga as instruções para criar uma nova conta de faturamento.
    3. Se você já tiver uma conta de faturamento, selecione-a e escolha Definir conta.

No Console de APIs do Google, permaneça no mesmo projeto e vá para a próxima seção.

Configurar o acesso ao Cloud Storage

  1. Ainda no Console de APIs do Google, no projeto necessário, clique no menu da galeria no canto superior esquerdo, selecione APIs e serviços e clique em Credenciais. Na página "Credenciais", procure Chaves da conta de serviço.

    Encontre o endereço de e-mail da chave da conta de serviço:

    1. Selecione o link Gerenciar contas de serviço (à direita da seção de chaves da conta de serviço).
    2. O endereço de e-mail fica visível na página Permissões resultante.

    Se não houver chaves de conta de serviço, crie uma nova conta de serviço:

    1. Selecione o menu suspenso Criar credenciais e escolha Chave da conta de serviço.
    2. No menu suspenso Conta de serviço, escolha Nova conta de serviço.
    3. Digite um Nome para a conta de serviço. O ID da conta de serviço é gerado automaticamente com base no nome e no nome do projeto.
    4. Anote o ID da conta de serviço gserviceaccount.com endereço de e-mail. Ele não aparece na página "Credenciais" depois que você seleciona Criar.
    5. Na seção Tipo de chave, escolha JSON.
    6. Clique em Criar. O arquivo JSON com o par de chaves pública/privada da conta é salvo na pasta "Downloads". Essa chave é usada para autenticar seu aplicativo na API e assinar todas as solicitações enviadas à API. Armazene o arquivo JSON gerado em um local seguro, em algum lugar onde seu aplicativo possa acessá-lo.
  2. Entre em contato com a equipe de suporte do Display & Video 360 para solicitar a ativação dos arquivos da leitura de entidades e/ou da API Google Bid Manager.

    Depois que a equipe de suporte confirmar o acesso, crie um Grupo do Google (ou grupos) dedicado e atualize os seguintes campos nos detalhes do parceiro do Display & Video 360 (somente usuários com acesso no nível do parceiro poderão fazer essas atualizações):

    • Grupo do Google de leitura de registros
      O grupo somente leitura tem permissões apenas para ler arquivos e listar o conteúdo dos buckets de armazenamento.
    • Grupo do Google de gerenciamento de registros
      O grupo de gerenciamento tem todas as permissões do grupo somente leitura, mas também pode alterar as ACLs de arquivos nos buckets. Nem mesmo o grupo de gerenciamento tem permissão para alterar ACLs de bucket, nem para criar, modificar ou excluir arquivos.

    Depois que o Grupo do Google for adicionado, você poderá adicionar e remover usuários do seu Grupo do Google conforme necessário, sem nenhum envolvimento da equipe de suporte do Display & Video 360. Somente os usuários do seu grupo terão acesso aos seus dados.

Acessar seus dados

Acessar dados com o gsutil

A ferramenta gsutil é um aplicativo de linha de comando que permite acessar os dados do Google Cloud Storage com facilidade, sem a necessidade de experiência de programação. É possível, por exemplo, usar a gsutil como parte de um script ou arquivo em lote em vez de criar aplicativos personalizados.

Para começar a usar a gsutil, leia a documentação da gsutil. Você ainda precisará autenticar usando o OAuth 2 como antes, mas a própria gsutil solicitará as credenciais na primeira vez que você usá-la e as armazenará para uso posterior.

Acessar dados de maneira programática

O Google Cloud Storage tem APIs para muitas linguagens de programação que permitem acessar os dados de maneira programática. O exemplo abaixo mostra como realizar um download simples de um dos arquivos da leitura de entidades do Google Cloud Storage. Lembre-se de que apenas os arquivos da leitura de entidades públicos são armazenados no bucket gdbm-public. Os arquivos de leitura de entidades particulares serão armazenados em buckets específicos do parceiro e do anunciante.

Java

O exemplo a seguir usa a biblioteca de cliente de APIs do Google para Java, o que facilita o acesso aos dados mantidos no Google Cloud Storage. Além da biblioteca de cliente geral das principais APIs do Google, também é necessário fazer o download da biblioteca separada para a API Cloud Storage.

Primeiro, configure as credenciais que serão usadas para se comunicar com a API e receber autorização para acessar seus dados. Isso é feito criando um objeto Credential que usa o endereço de e-mail developer.gserviceaccount.com da conta de serviço como ServiceAccountId e também carrega o arquivo de chave privada que foi transferido por download do Console de APIs do Google durante a criação da conta de serviço. Isso garante que todas as solicitações futuras à API sejam assinadas com a chave privada da conta de serviço:

NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();
JacksonFactory JSON_FACTORY = new JacksonFactory();

...

Credential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
   .setJsonFactory(JSON_FACTORY)
   .setServiceAccountId("...@developer.gserviceaccount.com")
   .setServiceAccountScopes(StorageScopes.DEVSTORAGE_READ_ONLY)
   .setServiceAccountPrivateKeyFromP12File(new File("...-privatekey.p12"))
   .build();

Depois de criar o objeto Credential, use-o para instanciar um novo objeto Storage que será usado em todas as solicitações futuras para a API Google Cloud Storage:

Storage storage = new Storage(HTTP_TRANSPORT, JSON_FACTORY, credential);

Agora que você tem um novo objeto Storage, já pode começar a fazer solicitações à API. Você está fazendo uma solicitação para recuperar um item específico bucketObjectName do bucket bucket. A biblioteca lida com o download HTTP do arquivo do Google Cloud Storage, e você simplesmente imprime o conteúdo no console:

Get bucketObject = storage.objects().get(bucketName, bucketObjectName);

ByteArrayOutputStream output = new ByteArrayOutputStream();
bucketObject.getMediaHttpDownloader().setDirectDownloadEnabled(true);
bucketObject.executeAndDownloadTo(output);

System.out.println(output.toString());

Os valores de bucket e bucketObjectName variam de acordo com a parte da API que você está acessando. Consulte a seção apropriada sobre convenções de nomenclatura.

C#

O exemplo a seguir usa a biblioteca de cliente de APIs do Google para .NET, o que torna o acesso aos dados mantidos no Google Cloud Storage simples e fácil.

Primeiro, configure as credenciais que serão usadas para se comunicar com a API e receber autorização de acesso aos seus dados. Para isso, crie um objeto AssertionFlowClient que use o endereço de e-mail developer.gserviceaccount.com da conta de serviço como ServiceAccountId e carregue o arquivo de chave privada que foi transferido por download do Console de APIs do Google durante a criação da conta de serviço.

string keyPath = @"...-privatekey.p12";
X509Certificate2 certificate = new X509Certificate2(keyPath, "notasecret", X509KeyStorageFlags.Exportable);
var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate)
{
    ServiceAccountId = "...@developer.gserviceaccount.com",
    Scope = StorageService.Scopes.DevstorageRead_only.GetStringValue()
};

Depois de criar o objeto AssertionFlowClient, use-o para instanciar um novo objeto OAuth2Authenticator, que pode ser usado para criar uma nova instância do Storage em todas as solicitações futuras para a API Google Cloud Storage:

var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState);
StorageService service = new StorageService(auth);

Agora que você tem um novo objeto Storage, já pode começar a fazer solicitações à API. Você está fazendo uma solicitação para recuperar um item específico, bucketObjectName, do bucket bucket. Usamos classes de biblioteca de cliente .NET padrão para processar o download HTTP do Google Cloud Storage, mas é preciso processar manualmente o caso em que há um redirecionamento para garantir que sempre haja o cabeçalho Authorization correto presente na solicitação:

var results = service.Objects.Get(bucketName, bucketObjectName).Fetch();

HttpWebRequest request = createRequest(results.Media.Link, auth);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

// Handle redirects manually to ensure that the Authorization header is present if
// your request is redirected.
if (response.StatusCode == HttpStatusCode.TemporaryRedirect)
{
    request = createRequest(response.Headers["Location"], auth);
    response = (HttpWebResponse)request.GetResponse();
}

O conteúdo da resposta pode ser lido do objeto HttpWebResponse por meio de GetResponseStream, como de costume. Os valores de bucket e bucketObjectName variam de acordo com a parte da API que você está acessando. Consulte a seção apropriada sobre convenções de nomenclatura.

Apêndice: amostras completas

Java

/*
 * Copyright (c) 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.bidmanager.api.samples;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStreamReader;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.storage.Storage;
import com.google.api.services.storage.Storage.Objects.Get;
import com.google.api.services.storage.StorageScopes;

/**
 * A simple class that demonstrates how to download a specific object from a bucket using a
 * service account
 */
public class ServiceDownload {

  /**
   * This is the HTTP Transport object used for automatically refreshing access tokens.
   */
  static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  /**
   * This is the JSON factory used for parsing refresh token responses.Your first requirement
   */
  static final JacksonFactory JSON_FACTORY = new JacksonFactory();

  /**
   * The main method will attempt to download a specific named object from the gdbm-public bucket
   * using a service account.
   *
   * @param args Not used.
   */
  public static void main(String[] args) {

    try {
      // Prompt the user for the details of the object to download.
      System.out.print("Name of object to download, e.g. entity/20130430.0.Browser.json:");
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      String bucketObjectName = in.readLine();
      in.close();
      String bucketName = "gdbm-public";

      Credential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
           .setJsonFactory(JSON_FACTORY)
           .setServiceAccountId("...@developer.gserviceaccount.com")
           .setServiceAccountScopes(StorageScopes.DEVSTORAGE_READ_ONLY)
           .setServiceAccountPrivateKeyFromP12File(
               new File("...-privatekey.p12"))
           .build();

      Storage storage = new Storage(HTTP_TRANSPORT, JSON_FACTORY, credential);

      Get bucketObject = storage.objects().get(bucketName, bucketObjectName);

      ByteArrayOutputStream output = new ByteArrayOutputStream();
      bucketObject.getMediaHttpDownloader().setDirectDownloadEnabled(true);
      bucketObject.executeAndDownloadTo(output);
      System.out.println(output.toString());

    } catch (Exception e) {
      System.err.println("Unexpected exception caught: " + e.getMessage());
      e.printStackTrace();
    }

  }


}

C#

/*
 * Copyright (c) 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;

using DotNetOpenAuth.OAuth2;

using Google.Apis;
using Google.Apis.Requests;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using Google.Apis.Storage.v1beta1;
using Google.Apis.Storage.v1beta1.Data;
using Google.Apis.Util;

namespace ApiSamples
{
    /// <summary>
    /// A simple class that demonstrates how to download a specific object from a bucket using a
    /// service account
    /// </summary>
    class ServiceDownload
    {
        /// <summary>
        /// The main method will attempt to download a specific named object from the
        /// gdbm-public bucket using a service account.
        /// </summary>
        /// <param name="args">Not used.</param>
        public static void Main(string[] args)
        {

            // Prompt the user for the details of the object to download
            Console.WriteLine("Name of object to download, e.g. entity/20130430.0.Browser.json:");
            string bucketObjectName = Console.ReadLine();
            string bucketName = "gdbm-public";

            try
            {
                string keyPath = @"...-privatekey.p12";
                X509Certificate2 certificate = new X509Certificate2(keyPath, "notasecret", X509KeyStorageFlags.Exportable);
                var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate)
                {
                    ServiceAccountId = "...@developer.gserviceaccount.com",
                    Scope = StorageService.Scopes.DevstorageRead_only.GetStringValue()
                };
                var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState);

                StorageService service = new StorageService(auth);
                var results = service.Objects.Get(bucketName, bucketObjectName).Fetch();

                HttpWebRequest request = createRequest(results.Media.Link, auth);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Handle redirects manully to ensure that the Authorization header is present if
                // our request is redirected.
                if (response.StatusCode == HttpStatusCode.TemporaryRedirect)
                {
                    request = createRequest(response.Headers["Location"], auth);
                    response = (HttpWebResponse)request.GetResponse();
                }

                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream);
                String data = reader.ReadToEnd();
                Console.Write(data);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unexpected exception caught: " + e.Message);
                Console.Write(e.StackTrace);
            }
            Console.ReadKey();
        }

        /// <summary>
        /// Generate a HttpWebRequest for the given URL with the appropriate OAuth2 authorization
        /// header applied.  The HttpWebRequest object returned has its AllowAutoRedirect option
        /// disabled to allow us to manually handle redirects.
        /// </summary>
        /// <param name="url">URL that is to be requested with this object</param>
        /// <param name="auth">The OAuth2Authenticator instance that contains the appropriate keys.</param>
        /// <returns>HttpWebRequest object ready to be used to make requests to the API</returns>
        private static HttpWebRequest createRequest(string url, OAuth2Authenticator<AssertionFlowClient> auth)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("Authorization", "Bearer " + auth.State.AccessToken);
            request.AllowAutoRedirect = false;
            return request;
        }

    }
}