Premiers pas avec Cloud Storage

Google Display & Video 360 stocke automatiquement les fichiers de lecture des entités dans Google Cloud Storage. Ces fichiers ne sont accessibles qu'aux comptes disposant d'un accès.

Créer un projet

Créez et configurez un projet comme suit:

  1. Accédez à la page des API activées dans la console Google APIs.

    Si vous n'êtes pas déjà connecté à Google, vous êtes invité à le faire.

  2. Dans la liste déroulante des projets, sélectionnez un projet existant ou créez-en un.
    • Si vous avez plusieurs projets existants, veillez à sélectionner celui pour lequel vous souhaitez activer Google Cloud Storage, puis cliquez sur Continuer.
    • Si vous n'avez pas de projet, sélectionnez Create a new project (Créer un projet), saisissez un nom de projet, puis sélectionnez Create (Créer).

      Remarque: Sachez que certains identifiants de ressources (tels que les ID de projet) peuvent être conservés au-delà de la durée de vie de votre projet. Pour cette raison, évitez de stocker des informations sensibles dans des identifiants de ressource.

  3. Dans la liste des API activées, assurez-vous que le composant Google Cloud Storage apparaît. S'il n'est pas répertorié, cliquez sur l'onglet API Google, recherchez et sélectionnez le composant Google Cloud Storage, puis cliquez sur Activer l'API.

    Notez que pour la plupart des projets, le composant Google Cloud Storage est déjà activé. Si vous prévoyez d'accéder à Google Cloud Storage à l'aide de l'API JSON, vous devez également vérifier que l'API JSON Google Cloud Storage est activée.

  4. Activez la facturation pour le projet.

    Avant de pouvoir utiliser Google Cloud Storage, vous devez activer la facturation pour votre projet, si ce n'est pas déjà fait. L'activation de la facturation ne signifie pas nécessairement que vous serez facturé. Pour en savoir plus, reportez-vous à la page Tarifs.

    1. Toujours dans le projet Cloud Storage, cliquez sur le menu de la galerie en haut à gauche, puis sélectionnez Facturation.
    2. Si vous ne possédez pas encore de compte de facturation, suivez les instructions pour en créer un.
    3. Si vous disposez d'un compte de facturation existant, sélectionnez-le, puis sélectionnez Définir le compte.

Dans la console Google APIs, restez dans le même projet et passez à la section suivante.

Configurer l'accès à Cloud Storage

  1. Toujours dans la console Google APIs, au niveau du projet requis, cliquez sur le menu de la galerie en haut à gauche, sélectionnez API et services, puis cliquez sur Identifiants. Sur la page "Identifiants", recherchez Clés de compte de service.

    Recherchez l'adresse e-mail de la clé du compte de service:

    1. Cliquez sur le lien Gérer les comptes de service (à droite de la section "Clés de compte de service").
    2. L'adresse e-mail s'affiche sur la page Autorisations qui s'affiche.

    S'il n'existe aucune clé de compte de service, créez-en un:

    1. Sélectionnez la liste déroulante Créer des identifiants, puis choisissez Clé de compte de service.
    2. Dans la liste déroulante Compte de service, sélectionnez Nouveau compte de service.
    3. Attribuez un nom au compte de service. L'ID du compte de service est automatiquement généré à partir du nom et du nom du projet.
    4. Notez l'adresse e-mail de l'ID de compte de service gserviceaccount.com. Il n'apparaît plus sur la page "Identifiants" une fois que vous avez sélectionné Créer.
    5. Dans la section Type de clé, sélectionnez JSON.
    6. Cliquez sur Créer. Le fichier JSON avec la paire de clés publique/privée du compte est enregistré dans votre dossier "Téléchargements". Cette clé permet d'authentifier votre application auprès de l'API et de signer toutes les requêtes qu'elle envoie à l'API. Stockez le fichier JSON généré dans un endroit sûr, où votre application pourra y accéder.
  2. Contactez l'équipe d'assistance Display & Video 360 pour demander l'activation des fichiers de lecture des entités et/ou de l'API Google Bid Manager.

    Une fois que l'équipe d'assistance a confirmé l'accès, créez un ou plusieurs groupes Google dédiés, puis mettez à jour les champs suivants dans les informations sur le partenaire Display & Video 360 (notez que seuls les utilisateurs disposant d'un accès au niveau du partenaire peuvent effectuer ces modifications):

    • Groupe Google de lecture des journaux
      Le groupe en lecture seule n'est autorisé qu'à lire des fichiers et à lister le contenu des buckets de stockage.
    • Groupe Google de gestion des journaux
      Le groupe de gestion dispose de toutes les autorisations du groupe en lecture seule, mais il peut également modifier les LCA des fichiers dans les buckets. Notez que même le groupe de gestion n'est pas autorisé à modifier les LCA du bucket, ni à créer, modifier ou supprimer des fichiers.

    Une fois le groupe Google ajouté, vous pouvez y ajouter des utilisateurs et en supprimer si nécessaire, sans intervention de l'équipe d'assistance Display & Video 360. Seuls les utilisateurs appartenant à votre groupe auront accès à vos données.

Accéder à vos données

Accéder aux données à l'aide de gsutil

L'outil gsutil est une application de ligne de commande qui vous permet d'accéder facilement à vos données Google Cloud Storage, sans aucune expérience en programmation. Vous pouvez, par exemple, utiliser gsutil dans le cadre d'un script ou d'un fichier de lot au lieu de créer des applications personnalisées.

Pour commencer à utiliser gsutil, consultez la documentation de gsutil. Vous devez toujours vous authentifier à l'aide d'OAuth 2 comme précédemment, mais gsutil vous demandera les identifiants la première fois que vous l'utiliserez, puis les stockera pour une utilisation ultérieure.

Accéder aux données de manière programmatique

Google Cloud Storage dispose d'API pour de nombreux langages de programmation qui vous permettent d'accéder à vos données de manière programmatique. L'exemple ci-dessous montre comment effectuer un téléchargement simple de l'un des fichiers de lecture des entités à partir de Google Cloud Storage. N'oubliez pas que seuls les fichiers de lecture des entités publics sont stockés dans le bucket gdbm-public. Vos fichiers de lecture des entités privés sont stockés dans des buckets spécifiques au partenaire et à l'annonceur.

Java

L'exemple suivant utilise la bibliothèque cliente des API Google pour Java, ce qui facilite l'accès aux données stockées dans Google Cloud Storage. En plus de la bibliothèque cliente générale des API Google, vous devez également télécharger la bibliothèque distincte pour l'API Cloud Storage.

Vous devez d'abord configurer les identifiants à utiliser pour communiquer avec l'API afin d'obtenir l'autorisation d'accéder à vos données. Pour ce faire, créez un objet Credential qui utilise l'adresse e-mail developer.gserviceaccount.com du compte de service comme ServiceAccountId et charge également le fichier de clé privée téléchargé à partir de la console Google APIs lors de la création du compte de service. Cela permettra de garantir que toutes les futures requêtes adressées à l'API sont signées avec la clé privée du compte de service:

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();

Après avoir créé l'objet Credential, vous pouvez l'utiliser pour instancier un nouvel objet Storage que vous pourrez utiliser pour toutes les futures requêtes adressées à l'API Google Cloud Storage:

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

Maintenant que vous disposez d'un nouvel objet Storage, vous pouvez commencer à envoyer des requêtes à l'API. Vous exécutez ici une requête visant à récupérer un élément spécifique bucketObjectName du bucket bucket. Cette bibliothèque gère le téléchargement HTTP du fichier à partir de Google Cloud Storage. Il vous suffit ensuite d'imprimer le contenu dans la console:

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

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

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

Les valeurs pour bucket et bucketObjectName varient en fonction de la partie de l'API à laquelle vous accédez. Reportez-vous à la section appropriée sur les conventions d'attribution de noms.

C#

L'exemple suivant utilise la bibliothèque cliente des API Google pour .NET, qui facilite l'accès aux données stockées dans Google Cloud Storage.

Vous devez d'abord configurer les identifiants à utiliser pour communiquer avec l'API afin d'obtenir l'autorisation d'accéder à vos données. Pour ce faire, créez un objet AssertionFlowClient qui utilise l'adresse e-mail developer.gserviceaccount.com du compte de service comme ServiceAccountId et charge également le fichier de clé privée téléchargé à partir de la console Google APIs lors de la création du compte de service.

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()
};

Après avoir créé l'objet AssertionFlowClient, vous pouvez l'utiliser pour instancier un nouvel objet OAuth2Authenticator que vous pouvez utiliser afin d'instancier une nouvelle instance Storage pour toutes les futures requêtes adressées à l'API Google Cloud Storage:

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

Maintenant que vous disposez d'un nouvel objet Storage, vous pouvez commencer à envoyer des requêtes à l'API. Vous exécutez ici une requête pour récupérer un élément spécifique, bucketObjectName, du bucket bucket. Nous utilisons des classes standards de la bibliothèque cliente .NET pour gérer le téléchargement HTTP à partir de Google Cloud Storage, mais vous devez gérer manuellement le cas où il y a une redirection pour vous assurer que la requête contient toujours l'en-tête Authorization approprié:

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();
}

Le contenu de la réponse peut ensuite être lu à partir de l'objet HttpWebResponse via GetResponseStream, comme d'habitude. Vos valeurs pour bucket et bucketObjectName varient en fonction de la partie de l'API à laquelle vous accédez. Reportez-vous à la section appropriée sur les conventions d'attribution de noms.

Annexe: Exemples complets

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;
        }

    }
}