GSP762

Présentation
Dans cet atelier, vous allez créer une application Web de conversion en PDF sur Cloud Run, un service sans serveur, pour convertir automatiquement des fichiers stockés dans Google Drive en PDF stockés dans des dossiers Google Drive séparés.
Objectifs
Au cours de cet atelier, vous allez :
- Convertir une application Go vers un conteneur
- Découvrir comment créer des conteneurs avec Google Cloud Build.
- Créer un service Cloud Run qui convertit des fichiers en PDF dans le cloud.
- Apprendre à créer des comptes de service et ajouter des autorisations
- Utiliser le traitement des événements avec Cloud Storage
Préparation
Avant de cliquer sur le bouton "Démarrer l'atelier"
Lisez ces instructions. Les ateliers sont minutés, et vous ne pouvez pas les mettre en pause. Le minuteur, qui démarre lorsque vous cliquez sur Démarrer l'atelier, indique combien de temps les ressources Google Cloud resteront accessibles.
Cet atelier pratique vous permet de suivre les activités dans un véritable environnement cloud, et non dans un environnement de simulation ou de démonstration. Des identifiants temporaires vous sont fournis pour vous permettre de vous connecter à Google Cloud le temps de l'atelier.
Pour réaliser cet atelier :
- Vous devez avoir accès à un navigateur Internet standard (nous vous recommandons d'utiliser Chrome).
Remarque : Ouvrez une fenêtre de navigateur en mode incognito (recommandé) ou de navigation privée pour effectuer cet atelier. Vous éviterez ainsi les conflits entre votre compte personnel et le compte temporaire de participant, qui pourraient entraîner des frais supplémentaires facturés sur votre compte personnel.
- Vous disposez d'un temps limité. N'oubliez pas qu'une fois l'atelier commencé, vous ne pouvez pas le mettre en pause.
Remarque : Utilisez uniquement le compte de participant pour cet atelier. Si vous utilisez un autre compte Google Cloud, des frais peuvent être facturés à ce compte.
Démarrer l'atelier et se connecter à la console Google Cloud
-
Cliquez sur le bouton Démarrer l'atelier. Si l'atelier est payant, une boîte de dialogue s'affiche pour vous permettre de sélectionner un mode de paiement.
Sur la gauche, vous trouverez le panneau "Détails concernant l'atelier", qui contient les éléments suivants :
- Le bouton "Ouvrir la console Google Cloud"
- Le temps restant
- Les identifiants temporaires que vous devez utiliser pour cet atelier
- Des informations complémentaires vous permettant d'effectuer l'atelier
-
Cliquez sur Ouvrir la console Google Cloud (ou effectuez un clic droit et sélectionnez Ouvrir le lien dans la fenêtre de navigation privée si vous utilisez le navigateur Chrome).
L'atelier lance les ressources, puis ouvre la page "Se connecter" dans un nouvel onglet.
Conseil : Réorganisez les onglets dans des fenêtres distinctes, placées côte à côte.
Remarque : Si la boîte de dialogue Sélectionner un compte s'affiche, cliquez sur Utiliser un autre compte.
-
Si nécessaire, copiez le nom d'utilisateur ci-dessous et collez-le dans la boîte de dialogue Se connecter.
{{{user_0.username | "Username"}}}
Vous trouverez également le nom d'utilisateur dans le panneau "Détails concernant l'atelier".
-
Cliquez sur Suivant.
-
Copiez le mot de passe ci-dessous et collez-le dans la boîte de dialogue Bienvenue.
{{{user_0.password | "Password"}}}
Vous trouverez également le mot de passe dans le panneau "Détails concernant l'atelier".
-
Cliquez sur Suivant.
Important : Vous devez utiliser les identifiants fournis pour l'atelier. Ne saisissez pas ceux de votre compte Google Cloud.
Remarque : Si vous utilisez votre propre compte Google Cloud pour cet atelier, des frais supplémentaires peuvent vous être facturés.
-
Accédez aux pages suivantes :
- Acceptez les conditions d'utilisation.
- N'ajoutez pas d'options de récupération ni d'authentification à deux facteurs (ce compte est temporaire).
- Ne vous inscrivez pas à des essais sans frais.
Après quelques instants, la console Cloud s'ouvre dans cet onglet.
Remarque : Pour accéder aux produits et services Google Cloud, cliquez sur le menu de navigation ou saisissez le nom du service ou du produit dans le champ Recherche.
Activer Cloud Shell
Cloud Shell est une machine virtuelle qui contient de nombreux outils pour les développeurs. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud. Cloud Shell vous permet d'accéder via une ligne de commande à vos ressources Google Cloud.
-
Cliquez sur Activer Cloud Shell
en haut de la console Google Cloud.
-
Passez les fenêtres suivantes :
- Accédez à la fenêtre d'informations de Cloud Shell.
- Autorisez Cloud Shell à utiliser vos identifiants pour effectuer des appels d'API Google Cloud.
Une fois connecté, vous êtes en principe authentifié et le projet est défini sur votre ID_PROJET : . Le résultat contient une ligne qui déclare l'ID_PROJET pour cette session :
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
est l'outil de ligne de commande pour Google Cloud. Il est préinstallé sur Cloud Shell et permet la complétion par tabulation.
- (Facultatif) Vous pouvez lister les noms des comptes actifs à l'aide de cette commande :
gcloud auth list
- Cliquez sur Autoriser.
Résultat :
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (Facultatif) Vous pouvez lister les ID de projet à l'aide de cette commande :
gcloud config list project
Résultat :
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
Remarque : Pour consulter la documentation complète sur gcloud
, dans Google Cloud, accédez au guide de présentation de la gcloud CLI.
Architecture
Dans cet atelier, vous allez aider le cabinet vétérinaire Pet Theory à convertir automatiquement ses factures en PDF, afin d'avoir l'assurance que les clients puissent les ouvrir.

Utiliser des API Google
Dans cet atelier, vous allez utiliser des API Google. Les API suivantes ont été activées pour vous :
Nom |
API |
Cloud Build |
cloudbuild.googleapis.com |
Cloud Storage |
storage-component.googleapis.com |
Cloud Run |
run.googleapis.com |
Tâche 1 : Obtenir le code source
Pour commencer, téléchargez le code nécessaire pour cet atelier.
-
Activez votre compte d'atelier :
gcloud auth list --filter=status:ACTIVE --format="value(account)"
-
Exécutez la commande suivante pour cloner le dépôt Pet Theory :
git clone https://github.com/Deleplace/pet-theory.git
-
Accédez au répertoire approprié :
cd pet-theory/lab03
Tâche 2 : Créer un microservice de factures
Dans cette section, vous allez créer une application Go afin de traiter les requêtes. Comme décrit dans le schéma de l'architecture, vous intégrerez Cloud Storage dans la solution.
-
Cliquez sur l'icône Ouvrir l'éditeur, puis sur Ouvrir dans une nouvelle fenêtre.
-
Accédez à pet-theory > lab03 > server.go
-
Ouvrez le code source server.go
et modifiez-le pour qu'il corresponde au texte ci-dessous :
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"os/exec"
"regexp"
"strings"
)
func main() {
http.HandleFunc("/", process)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
log.Printf("Defaulting to port %s", port)
}
log.Printf("Listening on port %s", port)
err := http.ListenAndServe(fmt.Sprintf(":%s", port), nil)
log.Fatal(err)
}
func process(w http.ResponseWriter, r *http.Request) {
log.Println("Serving request")
if r.Method == "GET" {
fmt.Fprintln(w, "Ready to process POST requests from Cloud Storage trigger")
return
}
//
// Read request body containing Cloud Storage object metadata
//
gcsInputFile, err1 := readBody(r)
if err1 != nil {
log.Printf("Error reading POST data: %v", err1)
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(w, "Problem with POST data: %v \n", err1)
return
}
//
// Working directory (concurrency-safe)
//
localDir, errDir := ioutil.TempDir("", "")
if errDir != nil {
log.Printf("Error creating local temp dir: %v", errDir)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Could not create a temp directory on server. \n")
return
}
defer os.RemoveAll(localDir)
//
// Download input file from Cloud Storage
//
localInputFile, err2 := download(gcsInputFile, localDir)
if err2 != nil {
log.Printf("Error downloading Cloud Storage file [%s] from bucket [%s]: %v",
gcsInputFile.Name, gcsInputFile.Bucket, err2)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Error downloading Cloud Storage file [%s] from bucket [%s]",
gcsInputFile.Name, gcsInputFile.Bucket)
return
}
//
// Use LibreOffice to convert local input file to local PDF file.
//
localPDFFilePath, err3 := convertToPDF(localInputFile.Name(), localDir)
if err3 != nil {
log.Printf("Error converting to PDF: %v", err3)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Error converting to PDF.")
return
}
//
// Upload the freshly generated PDF to Cloud Storage
//
targetBucket := os.Getenv("PDF_BUCKET")
err4 := upload(localPDFFilePath, targetBucket)
if err4 != nil {
log.Printf("Error uploading PDF file to bucket [%s]: %v", targetBucket, err4)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Error downloading Cloud Storage file [%s] from bucket [%s]",
gcsInputFile.Name, gcsInputFile.Bucket)
return
}
//
// Delete the original input file from Cloud Storage.
//
err5 := deleteGCSFile(gcsInputFile.Bucket, gcsInputFile.Name)
if err5 != nil {
log.Printf("Error deleting file [%s] from bucket [%s]: %v", gcsInputFile.Name,
gcsInputFile.Bucket, err5)
// This is not a blocking error.
// The PDF was successfully generated and uploaded.
}
log.Println("Successfully produced PDF")
fmt.Fprintln(w, "Successfully produced PDF")
}
func convertToPDF(localFilePath string, localDir string) (resultFilePath string, err error) {
log.Printf("Converting [%s] to PDF", localFilePath)
cmd := exec.Command("libreoffice", "--headless", "--convert-to", "pdf",
"--outdir", localDir,
localFilePath)
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
log.Println(cmd)
err = cmd.Run()
if err != nil {
return "", err
}
pdfFilePath := regexp.MustCompile(`\.\w+$`).ReplaceAllString(localFilePath, ".pdf")
if !strings.HasSuffix(pdfFilePath, ".pdf") {
pdfFilePath += ".pdf"
}
log.Printf("Converted %s to %s", localFilePath, pdfFilePath)
return pdfFilePath, nil
}
-
Exécutez maintenant ce qui suit pour créer l'application :
go build -o server
Résultat attendu :
go: downloading cloud.google.com/go/storage v1.6.0
go: downloading cloud.google.com/go v0.53.0
go: downloading github.com/googleapis/gax-go/v2 v2.0.5
go: downloading google.golang.org/api v0.18.0
go: downloading google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63
go: downloading google.golang.org/grpc v1.27.1
go: downloading go.opencensus.io v0.22.3
go: downloading golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
go: downloading github.com/golang/protobuf v1.3.3
go: downloading golang.org/x/net v0.0.0-20200222125558-5a598a2470a0
go: downloading github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e
go: downloading golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae
go: downloading golang.org/x/text v0.3.2
Les fonctions appelées par ce code de niveau supérieur se trouvent dans des fichiers sources :
- serveur.go
- notification.go
- gcs.go
Une fois l'application créée, vous pouvez créer le service de convertisseur PDF.
Tâche 3 : Créer un service de convertisseur PDF
Le service PDF utilisera Cloud Run et Cloud Storage pour initier un processus chaque fois qu'un fichier sera importé dans l'espace de stockage désigné.
Pour cela, vous allez utiliser un schéma commun de notifications d'événements avec Cloud Pub/Sub. Cela permet à l'application de se concentrer seulement sur
le traitement des informations. Le transport et la transmission des informations sont effectués par
d'autres services, ce qui vous permet de
simplifier l'application.
La création du module de facturation nécessite l'intégration de deux composants :

L'ajout du package LibreOffice vous permet de l'utiliser dans votre application.
-
Dans Ouvrir l'éditeur, ouvrez le fichier manifeste Dockerfile
existant et mettez-le à jour comme indiqué ci-dessous :
FROM amd64/debian
RUN apt-get update -y \
&& apt-get install -y libreoffice \
&& apt-get clean
WORKDIR /usr/src/app
COPY server .
CMD [ "./server" ]
-
Enregistrez le fichier Dockerfile
mis à jour.
-
Lancez une recompilation de l'image pdf-converter
à l'aide de Cloud Build :
gcloud builds submit \
--tag gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter
Cliquez sur Vérifier ma progression pour vérifier que vous avez correctement effectué la tâche ci-dessus.
Créer une image avec Cloud Build
-
Déployez le service pdf-converter mis à jour.
Remarque : Il est recommandé d'allouer 2 Go de RAM à LibreOffice pour son fonctionnement (voir la ligne comportant l'option --memory
).
-
Exécutez les commandes suivantes pour créer le conteneur et le déployer :
gcloud run deploy pdf-converter \
--image gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter \
--platform managed \
--region {{{ project_0.default_region | "REGION" }}} \
--memory=2Gi \
--no-allow-unauthenticated \
--set-env-vars PDF_BUCKET=$GOOGLE_CLOUD_PROJECT-processed \
--max-instances=3
Cliquez sur Vérifier ma progression pour vérifier que vous avez correctement effectué la tâche ci-dessus.
Service de conversion en PDF déployé
Le service Cloud Run a bien été déployé. Cependant, nous avons déployé une application qui nécessite les autorisations adéquates pour y accéder.
Tâche 4 : Créer un compte de service
Un compte de service est un type de compte particulier ayant accès aux API Google.
Dans cet atelier, vous utilisez un compte de service pour accéder à Cloud Run quand un événement
Cloud Storage est traité. Cloud Storage accepte un grand nombre de notifications qui peuvent servir à
déclencher des événements.
Ensuite, mettez à jour le code pour avertir l'application qu'un fichier a été importé.
-
Cliquez sur le menu de navigation > Cloud Storage, puis vérifiez que deux buckets ont été créés. Vous devriez obtenir le résultat suivant :
-
Créez une notification Pub/Sub pour indiquer qu'un nouveau fichier a été importé dans le bucket de documents "uploaded" (importé). Les notifications seront étiquetées avec le sujet "new-doc".
gsutil notification create -t new-doc -f json -e OBJECT_FINALIZE gs://$GOOGLE_CLOUD_PROJECT-upload
Résultat attendu :
Created Cloud Pub/Sub topic projects/{{{project_0.project_id | "PROJECT_ID"}}}/topics/new-doc
Created notification config projects/_/buckets/{{{project_0.project_id | "PROJECT_ID"}}}-upload/notificationConfigs/1
-
Créez un compte de service pour déclencher les services Cloud Run :
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"
Résultat attendu :
Created service account [pubsub-cloud-run-invoker].
-
Donnez au nouveau compte de service l'autorisation d'appeler le service de convertisseur PDF :
gcloud run services add-iam-policy-binding pdf-converter \
--member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
--role=roles/run.invoker \
--region {{{ project_0.default_region | "REGION" }}} \
--platform managed
Résultat attendu :
Updated IAM policy for service [pdf-converter].
bindings:
- members:
- serviceAccount:pubsub-cloud-run-invoker@{{{project_0.project_id | "PROJECT_ID"}}}.iam.gserviceaccount.com
role: roles/run.invoker
etag: BwYYfbXS240=
version: 1
-
Recherchez votre numéro de projet en exécutant cette commande :
PROJECT_NUMBER=$(gcloud projects list \
--format="value(PROJECT_NUMBER)" \
--filter="$GOOGLE_CLOUD_PROJECT")
-
Activez le projet pour créer des jetons d'authentification Cloud Pub/Sub :
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member=serviceAccount:{{{ project_0.project_id | "PROJECT_ID" }}}@{{{ project_0.project_id | "PROJECT_ID" }}}.iam.gserviceaccount.com \
--role=roles/iam.serviceAccountTokenCreator
Cliquez sur Vérifier ma progression pour vérifier que vous avez correctement effectué la tâche ci-dessus.
Compte de service créé
Une fois le compte de service créé, il peut être utilisé pour appeler le service Cloud Run.
Tâche 5 : Tester le service Cloud Run
Avant de poursuivre, testez le service déployé. N'oubliez pas
que le service nécessite une authentification. Vous devez donc vérifier que le service est
réellement privé.
-
Enregistrez l'URL de votre service dans la variable d'environnement $SERVICE_URL :
SERVICE_URL=$(gcloud run services describe pdf-converter \
--platform managed \
--region {{{ project_0.default_region | "REGION" }}} \
--format "value(status.url)")
-
Affichez l'URL SERVICE :
echo $SERVICE_URL
-
Envoyez une requête GET anonyme à votre nouveau service :
curl -X GET $SERVICE_URL
Résultat attendu :
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Your client does not have permission to get URL <code>/</code> from this server.</h2>
<h2></h2>
REMARQUE :
La requête GET anonyme génère un message d'erreur :
"Your client does not have permission to get URL"
(Votre client n'est pas autorisé à obtenir l'URL).
En effet, vous ne voulez pas que le service puisse être appelé par des utilisateurs anonymes.
-
Essayez maintenant d'appeler le service en tant qu'utilisateur autorisé :
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" $SERVICE_URL
Résultat attendu :
Ready to process POST requests from Cloud Storage trigger
Bravo ! Vous avez déployé un service Cloud Run authentifié.
Tâche 6 : Déclencheur Cloud Storage
Pour lancer une notification lorsque du nouveau contenu est importé dans Cloud Storage, ajoutez un abonnement à votre sujet Pub/Sub existant.
Remarque : Les notifications Cloud Storage envoient automatiquement un message à votre file d'attente de sujets quand de nouveaux contenus sont importés. Grâce aux notifications, vous pouvez créer des applications performantes qui répondent à des événements sans avoir à écrire de code supplémentaire.
-
Créez un abonnement Pub/Sub pour que le convertisseur PDF fonctionne à chaque fois qu'un message est publié dans le sujet new-doc
:
gcloud pubsub subscriptions create pdf-conv-sub \
--topic new-doc \
--push-endpoint=$SERVICE_URL \
--push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
Résultat attendu :
Created subscription [projects/{{{ project_0.project_id| "PROJECT_ID" }}}/subscriptions/pdf-conv-sub].
Cliquez sur Vérifier ma progression pour vérifier que vous avez correctement effectué la tâche ci-dessus.
Confirmer l'abonnement Pub/Sub
Désormais, chaque fois qu'un fichier est importé, l'abonnement Pub/Sub interagit avec votre compte de service. Le compte de service lance alors le service Cloud Run de convertisseur PDF.
Tâche 7 : Tester la notification Cloud Storage
Pour tester le service Cloud Run, utilisez les fichiers d'exemples disponibles.
-
Copiez les fichiers de test dans votre bucket d'importation :
gsutil -m cp -r gs://spls/gsp762/* gs://$GOOGLE_CLOUD_PROJECT-upload
Résultat attendu :
Copying gs://spls/gsp762/cat-and-mouse.jpg [Content-Type=image/jpeg]...
Copying gs://spls/gsp762/file-sample_100kB.doc [Content-Type=application/msword]...
Copying gs://spls/gsp762/file-sample_500kB.docx [Content-Type=application/vnd.openxmlformats-officedocument.wordprocessingml.document]...
Copying gs://spls/gsp762/file_example_XLS_10.xls [Content-Type=application/vnd.ms-excel]...
Copying gs://spls/gsp762/file-sample_1MB.docx [Content-Type=application/vnd.openxmlformats-officedocument.wordprocessingml.document]...
Copying gs://spls/gsp762/file_example_XLSX_50.xlsx [Content-Type=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]...
Copying gs://spls/gsp762/file_example_XLS_100.xls [Content-Type=application/vnd.ms-excel]...
Copying gs://spls/gsp762/file_example_XLS_50.xls [Content-Type=application/vnd.ms-excel]...
Copying gs://spls/gsp762//Copy of cat-and-mouse.jpg [Content-Type=image/jpeg]...
-
Dans la console Cloud, cliquez sur Cloud Storage > Buckets suivi du bucket dont le nom se termine par -upload.
-
Cliquez sur le bouton Actualiser à plusieurs reprises pour voir la suppression des fichiers, l'un après l'autre, une fois qu'ils sont convertis au format PDF.
-
Cliquez ensuite sur Buckets, suivi du bucket dont le nom se termine par -processed. Il doit contenir les versions PDF de tous les fichiers.
REMARQUE :
Le traitement des fichiers peut prendre quelques minutes.
Utilisez l'option permettant d'actualiser les buckets pour vérifier l'état d'avancement.
-
N'hésitez pas à ouvrir les fichiers PDF pour vous assurer qu'ils ont été correctement convertis.
-
Une fois l'importation terminée, cliquez sur le menu de navigation > Cloud Run, puis sur le service pdf-converter.
-
Sélectionnez l'onglet JOURNAUX et ajoutez le filtre "Conversion" pour afficher les fichiers convertis.
-
Accédez au menu de navigation > Cloud Storage et ouvrez le bucket dont le nom se termine par -upload pour confirmer que tous les fichiers importés ont été traités.
Bravo ! Vous venez de créer un nouveau service pour générer un PDF à l'aide des fichiers importés dans Cloud Storage.
Félicitations !
Dans cet atelier, vous avez appris comment convertir une application Go en conteneur, comment créer des conteneurs à l'aide de Google Cloud Build et vous avez lancé un service Cloud Run.
Vous avez également vu comment activer les autorisations à l'aide d'un compte de service et comment exploiter le traitement des événements Cloud Storage. Ces étapes sont essentielles au fonctionnement du service pdf-converter qui transforme des documents en PDF et les stocke dans le bucket "processed" (traité).
Formations et certifications Google Cloud
Les formations et certifications Google Cloud vous aident à tirer pleinement parti des technologies Google Cloud. Nos cours portent sur les compétences techniques et les bonnes pratiques à suivre pour être rapidement opérationnel et poursuivre votre apprentissage. Nous proposons des formations pour tous les niveaux, à la demande, en salle et à distance, pour nous adapter aux emplois du temps de chacun. Les certifications vous permettent de valider et de démontrer vos compétences et votre expérience en matière de technologies Google Cloud.
Dernière mise à jour du manuel : 15 mai 2024
Dernier test de l'atelier : 15 mai 2024
Copyright 2025 Google LLC. Tous droits réservés. Google et le logo Google sont des marques de Google LLC. Tous les autres noms d'entreprises et de produits peuvent être des marques des entreprises auxquelles ils sont associés.