arrow_back

Cómo crear archivos PDF con Go y Cloud Run

Unirse Acceder
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Cómo crear archivos PDF con Go y Cloud Run

Lab 1 hora universal_currency_alt 5 créditos show_chart Intermedio
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP762

Labs de autoaprendizaje de Google Cloud

Descripción general

En este lab, compilarás una aplicación web para convertir archivos PDF en Cloud Run, un servicio sin servidores, que convierte automáticamente los archivos almacenados en Google Drive en PDF y los almacena en carpetas separadas de Google Drive.

Qué aprenderás

  • Convertir una aplicación de Go en un contenedor
  • Aprender a compilar contenedores con Google Cloud Build
  • Crear un servicio de Cloud Run que convierta archivos en archivos PDF en la nube
  • Comprender cómo crear cuentas de servicio y agregar permisos
  • Usar el procesamiento de eventos con Cloud Storage

Requisitos previos

Este es un lab de nivel básico, lo que supone que el usuario tiene conocimientos previos sobre la consola de Cloud y Cloud Shell.

Además, debes sentirte cómodo editando archivos. Puedes usar tu editor de texto favorito (como nano, vi, etc.) o puedes iniciar el editor de código de Cloud Shell, que se encuentra en la cinta superior:

Ícono del editor de Cloud Shell

Configuración y requisitos

Antes de hacer clic en el botón Comenzar lab

Lee estas instrucciones. Los labs son cronometrados y no se pueden pausar. El cronómetro, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.

Este lab práctico te permitirá realizar las actividades correspondientes en un entorno de nube real, no en uno de simulación o demostración. Para ello, se te proporcionan credenciales temporales nuevas que utilizarás para acceder a Google Cloud durante todo el lab.

Para completar este lab, necesitarás lo siguiente:

  • Acceso a un navegador de Internet estándar (se recomienda el navegador Chrome)
Nota: Usa una ventana de navegador privada o de Incógnito para ejecutar este lab. Así evitarás cualquier conflicto entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.
  • Tiempo para completar el lab: Recuerda que, una vez que comienzas un lab, no puedes pausarlo.
Nota: Si ya tienes un proyecto o una cuenta personal de Google Cloud, no los uses en este lab para evitar cargos adicionales en tu cuenta.

Cómo iniciar su lab y acceder a la consola de Google Cloud

  1. Haga clic en el botón Comenzar lab. Si debe pagar por el lab, se abrirá una ventana emergente para que seleccione su forma de pago. A la izquierda, se encuentra el panel Detalles del lab que tiene estos elementos:

    • El botón Abrir la consola de Google
    • Tiempo restante
    • Las credenciales temporales que debe usar para el lab
    • Otra información para completar el lab, si es necesaria
  2. Haga clic en Abrir la consola de Google. El lab inicia recursos y abre otra pestaña en la que se muestra la página de acceso.

    Sugerencia: Ordene las pestañas en ventanas separadas, una junto a la otra.

    Nota: Si ve el diálogo Elegir una cuenta, haga clic en Usar otra cuenta.
  3. Si es necesario, copie el nombre de usuario del panel Detalles del lab y péguelo en el cuadro de diálogo Acceder. Haga clic en Siguiente.

  4. Copie la contraseña del panel Detalles del lab y péguela en el cuadro de diálogo de bienvenida. Haga clic en Siguiente.

    Importante: Debe usar las credenciales del panel de la izquierda. No use sus credenciales de Google Cloud Skills Boost. Nota: Usar su propia Cuenta de Google podría generar cargos adicionales.
  5. Haga clic para avanzar por las páginas siguientes:

    • Acepte los términos y condiciones.
    • No agregue opciones de recuperación o autenticación de dos factores (esta es una cuenta temporal).
    • No se registre para obtener pruebas gratuitas.

Después de un momento, se abrirá la consola de Cloud en esta pestaña.

Nota: Para ver el menú con una lista de los productos y servicios de Google Cloud, haga clic en el Menú de navegación que se encuentra en la parte superior izquierda de la pantalla. Ícono del menú de navegación

Activa Cloud Shell

Cloud Shell es una máquina virtual que cuenta con herramientas para desarrolladores. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud. Cloud Shell proporciona acceso de línea de comandos a tus recursos de Google Cloud.

  1. Haz clic en Activar Cloud Shell Ícono de Activar Cloud Shell en la parte superior de la consola de Google Cloud.

Cuando te conectes, habrás completado la autenticación, y el proyecto estará configurado con tu PROJECT_ID. El resultado contiene una línea que declara el PROJECT_ID para esta sesión:

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud es la herramienta de línea de comandos de Google Cloud. Viene preinstalada en Cloud Shell y es compatible con la función de autocompletado con tabulador.

  1. Puedes solicitar el nombre de la cuenta activa con este comando (opcional):
gcloud auth list
  1. Haz clic en Autorizar.

  2. Ahora, el resultado debería verse de la siguiente manera:

Resultado:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. Puedes solicitar el ID del proyecto con este comando (opcional):
gcloud config list project

Resultado:

[core] project = <project_ID>

Resultado de ejemplo:

[core] project = qwiklabs-gcp-44776a13dea667a6 Nota: Para obtener toda la documentación de gcloud, consulta la guía con la descripción general de gcloud CLI en Google Cloud.

Arquitectura

En este lab, ayudarás a la clínica veterinaria Pet Theory a convertir automáticamente sus facturas en archivos PDF para que los clientes puedan abrirlas de manera confiable.

Diagrama de arquitectura

Cómo usar las APIs de Google

En este lab, utilizarás las API de Google. Se habilitaron las siguientes API para ti:

Nombre API
Cloud Build cloudbuild.googleapis.com
Cloud Storage storage-component.googleapis.com
Cloud Run run.googleapis.com

Tarea 1: Obtén el código fuente

Comienza por descargar el código necesario para este lab.

  1. Activa tu cuenta de lab:
gcloud auth list --filter=status:ACTIVE --format="value(account)"
  1. Ejecuta el siguiente comando para clonar el repositorio de Pet Theory:
git clone https://github.com/Deleplace/pet-theory.git
  1. Dirígete al directorio correcto:
cd pet-theory/lab03

Tarea 2: Crea un microservicio de facturas

En esta sección, crearás una aplicación de Go para procesar solicitudes. Como se describe en el diagrama de arquitectura, integrarás Cloud Storage como parte de la solución.

  1. Haz clic en el ícono Abrir editor y, luego, haz clic en Abrir en una nueva ventana.

  2. Navega a pet-theory > lab03 > server.go

  3. Abre el código fuente server.go y edítalo para que coincida con el texto a continuación:

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 }
  1. Ahora ejecuta lo siguiente para compilar la aplicación:
go build -o server

Las funciones que llama este código de nivel superior están en archivos fuente:

  • server.go
  • notification.go
  • gcs.go

Una vez que la aplicación se haya compilado correctamente, puedes crear el servicio pdf-conversion.

Tarea 3: Crea un servicio pdf-conversion

El servicio de PDF usará Cloud Run y Cloud Storage para iniciar un proceso cada vez que se suba un archivo al almacenamiento designado.

Para lograr esto, usarás un patrón común de notificaciones de eventos junto con Cloud Pub/Sub. Esto permite que la aplicación se enfoque solo en el procesamiento de la información. El transporte y la transferencia de información los llevan a cabo otros servicios, lo que te permite mantener la simplicidad de la aplicación.

La compilación del módulo de factura requiere la integración de dos componentes:

Contenedor que incluye dos componentes: servidor y LibreOffice

Si agregas el paquete de LibreOffice, podrás usarlo en tu aplicación.

  1. En Abrir editor, abre el manifiesto de Dockerfile existente y actualiza el archivo como se muestra a continuación:
FROM debian:buster RUN apt-get update -y \ && apt-get install -y libreoffice \ && apt-get clean WORKDIR /usr/src/app COPY server . CMD [ "./server" ]
  1. Guarda el Dockerfile actualizado.

  2. Vuelve a compilar la imagen pdf-converter con Cloud Build:

gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter

Haz clic en Revisar mi progreso para verificar la realización de la tarea indicada arriba.

Compilar una imagen con Cloud Build
  1. Implementa el servicio pdf-converter actualizado.
Nota: Es una buena idea asignarle a LibreOffice 2 GB de RAM para trabajar; consulta la línea que incluye la opción --memory.
  1. Ejecuta los siguientes comandos para compilar el contenedor y, luego, implementarlo:
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

Haz clic en Revisar mi progreso para verificar la realización de la tarea indicada arriba.

Implementar el servicio pdf-converter

El servicio de Cloud Run se implementó correctamente. Sin embargo, implementamos una aplicación que requiere los permisos correctos para acceder a ella.

Tarea 4: Crea una cuenta de servicio

Una cuenta de servicio es un tipo especial de cuenta con acceso a las APIs de Google.

En este lab, se usa una cuenta de servicio para acceder a Cloud Run cuando se procesa un evento de Cloud Storage. Cloud Storage admite un conjunto amplio de notificaciones que se pueden usar para activar eventos.

A continuación, actualiza el código para notificar a la aplicación cuando se suba un archivo.

  1. Haz clic en Menú de navegación > Cloud Storage y verifica que se hayan creado dos buckets. Deberías ver lo siguiente:
  • PROJECT_ID-processed
  • PROJECT_ID-upload
  1. Crea una notificación de Pub/Sub para indicar que se subió un archivo nuevo al bucket de documentos ("subido"). Las notificaciones tendrán la etiqueta del tema "new-doc".
gsutil notification create -t new-doc -f json -e OBJECT_FINALIZE gs://$GOOGLE_CLOUD_PROJECT-upload
  1. Crea una cuenta de servicio nueva para activar los servicios de Cloud Run:
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"
  1. Otórgale permiso a la cuenta de servicio para que invoque al servicio pdf-converter:
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
  1. Ejecuta este comando para buscar el número de tu proyecto:
PROJECT_NUMBER=$(gcloud projects list \ --format="value(PROJECT_NUMBER)" \ --filter="$GOOGLE_CLOUD_PROJECT")
  1. Ejecuta este comando para permitir que tu proyecto genere tokens de autenticación de Cloud Pub/Sub:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator

Haz clic en Revisar mi progreso para verificar la realización de la tarea indicada arriba.

Crear una cuenta de servicio

Una vez que se creó la cuenta de servicio, puede usarse para invocar el servicio de Cloud Run.

Tarea 5: Prueba el servicio de Cloud Run

Antes de seguir avanzando, prueba el servicio implementado. Recuerda que el servicio requiere autenticación, así que prueba eso para asegurarte de que sea privado.

  1. Guarda la URL de tu servicio en la variable de entorno $SERVICE_URL:
SERVICE_URL=$(gcloud run services describe pdf-converter \ --platform managed \ --region {{{ project_0.default_region | "REGION" }}} \ --format "value(status.url)")
  1. Muestra la URL DEL SERVICIO:
echo $SERVICE_URL
  1. Realiza una solicitud GET anónima a tu servicio nuevo:
curl -X GET $SERVICE_URL

La solicitud GET anónima dará como resultado un mensaje de error
"Your client does not have permission to get URL". Este es el comportamiento esperado: no queremos que usuarios anónimos puedan llamar al servicio.

  1. Ahora intenta invocar al servicio como usuario autorizado:
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" $SERVICE_URL
  1. Obtendrás la respuesta "Ready to process POST requests from Cloud Storage trigger".

Excelente. Implementaste con éxito un servicio autenticado de Cloud Run.

Tarea 6: Activador de Cloud Storage

Para iniciar una notificación cuando se suba contenido nuevo a Cloud Storage, agrega una suscripción a tu tema de Pub/Sub existente.

Nota: Las notificaciones de Cloud Storage enviarán automáticamente un mensaje a tu fila de temas cuando se suba contenido nuevo. El uso de notificaciones te permite crear aplicaciones potentes que respondan a eventos sin necesidad de escribir código adicional.
  • Crea una suscripción a Pub/Sub para que el conversor de PDF se ejecute cada vez que se publique un mensaje en el tema 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

Haz clic en Revisar mi progreso para verificar la realización de la tarea indicada arriba.

Confirmar suscripción a Pub/Sub

Ahora siempre que se suba un archivo, la suscripción a Pub/Sub interactuará con tu cuenta de servicio. Luego, la cuenta de servicio iniciará tu servicio pdf-converter de Cloud Run.

Tarea 7: Prueba la notificación de Cloud Storage

Para probar el servicio de Cloud Run, usa los archivos de ejemplo disponibles.

  1. Copia algunos archivos de prueba en tu bucket de carga:
gsutil -m cp -r gs://spls/gsp762/* gs://$GOOGLE_CLOUD_PROJECT-upload
  1. En la consola de Cloud, haz clic en Cloud Storage > Buckets seguido del nombre del bucket cuyo nombre termina en "-upload" y, luego, haz clic en el botón Actualizar varias veces y observa cómo se borran los archivos, uno por uno, a medida que se convierten en archivos PDF.

  2. Luego, haz clic en Buckets, seguido del bucket cuyo nombre termina en "-processed". Debería contener las versiones en PDF de todos los archivos. Puedes abrir los archivos PDF para asegurarte de que se hayan convertido correctamente.

  3. Una vez que se complete la carga, haz clic en clic Menú de navegación > Cloud Run y, luego, haz clic en el servicio pdf-converter.

  4. Selecciona la pestaña REGISTROS y agrega un filtro de “Converting” para ver los archivos convertidos.

  5. Navega a Menú de navegación > Cloud Storage y abre el bucket cuyo nombre termina en "-upload" para confirmar que se hayan procesado todos los archivos cargados.

Excelente trabajo. Compilaste correctamente un nuevo servicio para crear un archivo PDF usando archivos cargados a Cloud Storage.

¡Felicitaciones!

El servicio pdf-converter convierte los documentos y los escribe en formato PDF en el bucket "processed". En este lab, aprendiste a realizar las siguientes tareas:

  • Convertir una aplicación de Go en un contenedor
  • Compilar contenedores con Google Cloud Build
  • Crear un servicio de Cloud Run
  • Habilitar permisos con una cuenta de servicio
  • Usar el procesamiento de eventos de Cloud Storage

Finaliza la Quest

Este lab de autoaprendizaje forma parte de la Quest Google Cloud Run Serverless Workshop. Una Quest es una serie de labs relacionados que forman una ruta de aprendizaje. Si completas esta Quest, obtendrás una insignia como reconocimiento por tu logro. Puedes hacer públicas tus insignias y agregar vínculos a ellas en tu currículum en línea o en tus cuentas de redes sociales. Inscríbete en esta Quest y obtén un crédito inmediato de realización. Consulta el catálogo de Google Cloud Skills Boost para ver todas las Quests disponibles.

Más información y próximos pasos

Capacitación y certificación de Google Cloud

Recibe la formación que necesitas para aprovechar al máximo las tecnologías de Google Cloud. Nuestras clases incluyen habilidades técnicas y recomendaciones para ayudarte a avanzar rápidamente y a seguir aprendiendo. Para que puedas realizar nuestros cursos cuando más te convenga, ofrecemos distintos tipos de capacitación de nivel básico a avanzado: a pedido, presenciales y virtuales. Las certificaciones te ayudan a validar y demostrar tus habilidades y tu conocimiento técnico respecto a las tecnologías de Google Cloud.

Actualización más reciente del manual: 29 de noviembre de 2023

Prueba más reciente del lab: 29 de noviembre de 2023

Copyright 2024 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.