Introduction à Google Cloud Storage avec Java

Introduction à Google Cloud Storage avec Java

1. Vue d'ensemble

Google Cloud Storage propose un stockage en ligne adapté aux besoins d'une application individuelle en fonction de l'emplacement, de la fréquence d'accès et du coût. Contrairement à Amazon Web Services, Google Cloud Storage utilise une seule API pour les accès haute, moyenne et basse fréquence.

Comme la plupart des plates-formes cloud, Google propose un niveau d'accès gratuit; les détails du prix sonthere.

Dans ce didacticiel, nous allons nous connecter au stockage, créer un bucket, écrire, lire et mettre à jour les données. Tout en utilisant l'API pour lire et écrire des données, nous utiliserons également l'utilitaire de stockage cloud degsutil.

2. Configuration de Google Cloud Storage

2.1. Dépendance Maven

Nous devons ajouter une seule dépendance à nospom.xml:


    com.google.cloud
    google-cloud-storage
    1.17.0

Maven Central a leslatest version of the library.

2.2. Créer une clé d'authentification

Avant de pouvoir nous connecter à Google Cloud, nous devons configurerauthentication. Les applications Google Cloud Platform (GCP) chargent une clé privée et des informations de configuration à partir d'un fichier de configuration JSON. Nous générons ce fichier via la console GCP. L'accès à la console nécessite un compte Google Cloud Platform valide.

Nous créons notre configuration par:

  1. Aller auxGoogle Cloud Platform Console

  2. Si nous n'avons pas encore défini de projet GCP, nous cliquons sur le boutoncreate et entrons un nom de projet, tel que "example-cloud-tutorial"

  3. Sélectionnez «new service account» dans la liste déroulante

  4. Ajoutez un nom tel que «example-cloud-storage» dans le champ du nom du compte.

  5. Sous «role», sélectionnez Projet, puis Propriétaire dans le sous-menu.

  6. Sélectionnez Créer et la console télécharge un fichier de clé privée.

Le rôle de l'étape 6 autorise le compte à accéder aux ressources du projet. Par souci de simplicité, nous avons donné à ce compte un accès complet à toutes les ressources du projet.

Pour un environnement de production, nous définirions un rôle correspondant à l'accès requis par l'application.

2.3. Installez la clé d'authentification

Ensuite, nous copions le fichier téléchargé à partir de la console GCP vers un emplacement pratique et nous y faisons pointer la variable d'environnementGOOGLE_APPLICATION_CREDENTIALS. C'est le moyen le plus simple de charger les identifiants, bien que nous examinions une autre possibilité ci-dessous.

Pour Linux ou Mac:

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/file"

Pour les fenêtres:

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

2.4. Installez Cloud Tools

Google fournit plusieurs outils pour gérer sa plateforme cloud. Nous allons utilisergsutil au cours de ce didacticiel pour lire et écrire des données parallèlement à l'API.

Nous pouvons le faire en deux étapes faciles:

  1. Installez le SDK Cloud à partir des instructionshere pour notre plate-forme.

  2. Suivez le Quickstart de notre plateformehere. À l'étape 4 deInitialize the SDK, nous sélectionnons le nom du projet à l'étape 4 de la section 2.2 ci-dessus («example-cloud-storage» ou le nom que vous avez utilisé).

gsutil est maintenant installé et configuré pour lire les données de notre projet cloud.

3. Connexion àStorage et création d'unBucket

3.1. Connectez-vous àStorage

Avant de pouvoir utiliser le stockage Google Cloud, nous devons créer un objet de service. Si nous avons déjà configuré la variable d'environnementGOOGLE_APPLICATION_CREDENTIALS, nous pouvons utiliser l'instance par défaut:

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

Si nous ne voulons pas utiliser la variable d'environnement, nous devons créer une instanceCredentials et la transmettre àStorage with le nom du projet:

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

3.2. Créer unBucket

Maintenant que nous sommes connectés et authentifiés, nous pouvons créer un bucket. Les seaux sont des conteneurs qui contiennent des objets. Ils peuvent être utilisés pour organiser et contrôler l'accès aux données.

Il n'y a pas de limite au nombre d'objets dans un compartiment. GCPlimits le nombre d'opérations sur les buckets etencourages application designers to emphasize operations on objects rather than on buckets.

La création d'un bucket nécessite unBucketInfo:

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

Pour cet exemple simple, nous nommons un compartiment et acceptons les propriétés par défaut. Bucket names must beglobally unique. Si nous choisissons un nom qui est déjà utilisé,create() échouera.

3.3. Examen d'unBucket avecgsutil

Puisque nous avons un bucket maintenant, nous pouvons l'examiner avecgsutil.

Ouvrons une invite de commande et jetons un œil:

$ 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 ressemble beaucoup à des commandes shell, et toute personne familière avec la ligne de commande Unix devrait se sentir très à l'aise ici. Notez que nous avons transmis le chemin d'accès à notre bucket en tant qu'URL:gs://example-1-bucket/, ainsi que quelques autres options.

L'optionls produit une liste ouobjects oubuckets, et l'option-L indique que nous voulons une liste détaillée - nous avons donc reçu des détails sur lesbucket y compris les heures de création et les contrôles d'accès.

Ajoutons quelques données à notre bucket!

4. Lecture, écriture et mise à jour des données

In Google Cloud Storage, objects are stored in Blobs; Les nomsBlob peuvent contenir n'importe quel caractère Unicode, limité à 1024 caractères.

4.1. Écrire des données

Sauvegardons unString dans notre bucket:

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

Comme vous pouvez le voir, les objets sont simplement des tableaux debytes dans le bucket, donc nous stockons unString en opérant simplement avec ses octets bruts.

4.2. Lecture de données avecgsutil

Maintenant que nous avons un bucket contenant un objet, examinonsgsutil.

Commençons par lister le contenu de notre bucket:

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

Nous avons de nouveau passé àgsutil l'optionls mais omis-b et-L,, nous avons donc demandé une brève liste des objets. Nous recevons une liste d'URI pour chaque objet, qui est un dans notre cas.

Examinons l'objet:

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

Cat concatène le contenu de l'objet en sortie standard. Nous voyons lesString que nous avons écrits dans lesBlob.

4.3. Lecture des données

Les objets blob reçoivent unBlobId lors de leur création.

Le moyen le plus simple de récupérer un objet blob est d'utiliser lesBlobId:

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

Nous transmettons l'id àStorage et obtenons lesBlob en retour, etgetContent() renvoie les octets.

Si nous ne disposons pas desBlobId, nous pouvons rechercher le bucket par nom:

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

4.4. Mise à jour des données

Nous pouvons mettre à jour unBlob en le récupérant puis en accédant à sesWriteableByteChannel:

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

Examinons l'objet mis à jour:

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

4.5. Enregistrer un objet dans un fichier, puis supprimer

Enregistrons l'objet mis à jour dans un fichier:

$ 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!

Comme prévu, l'optioncopy copie l'objet dans le nom de fichier spécifié sur la ligne de commande.

gsutil peut copier n'importe quel objet de Google Cloud Storage vers le système de fichiers local, à condition qu'il y ait suffisamment d'espace pour le stocker.

Nous terminerons par nettoyer:

$ 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 fonctionne aussi) supprime l'objet spécifié

5. Conclusion

Dans ce bref tutoriel, nous avons créé des informations d'identification pour Google Cloud Storage et nous sommes connectés à l'infrastructure. Nous avons créé un compartiment, écrit des données, puis lu et modifié celui-ci. Comme nous travaillons avec l'API, nous avons également utiliségsutil pour examiner le stockage dans le cloud lors de la création et de la lecture des données.

Nous avons également expliqué comment utiliser les compartiments et écrire et modifier les données efficacement.

Des échantillons de code, comme toujours, peuvent être trouvésover on GitHub.