Implementa un "Google Traductor" App de Express.js en App Engine, Cloud Functions y Cloud Run

1. Descripción general

Esta serie de codelabs (instructivos prácticos y de autoaprendizaje) tiene como objetivo ayudar a los desarrolladores a comprender las diversas opciones que tienen cuando implementan sus aplicaciones. Aprenderás a usar la API de Google Cloud Translation en una aplicación web simple. Esta app se puede ejecutar de forma local o implementar en una plataforma de procesamiento sin servidores de Cloud (App Engine, Cloud Functions o Cloud Run).

Realizarás este instructivo de JavaScript con Node.js usando el framework web Express.js. También aprenderás a acceder a las APIs de Google Cloud desde nuestras plataformas sin servidores. Todas las versiones de esta app provienen del repositorio de código abierto"nebulous serverless", que incluye una versión en Python de esta app y codelabs independientes. El repositorio también aloja apps similares que muestran a los desarrolladores cómo acceder a las APIs de Google que no son de Cloud desde nuestras plataformas sin servidores.

Este codelab se enfoca en implementar esta app en las plataformas en negrita mencionadas anteriormente.

Obtendrás información para hacer las siguientes acciones

Requisitos

  • Un proyecto de Google Cloud con una cuenta de facturación de Cloud activa
  • Un framework web instalado para ejecutarse de forma local ( Flask para quienes realizan el instructivo de Python o Express para quienes realizan el instructivo de JavaScript/Node.js)
  • Al menos una plataforma de procesamiento sin servidores habilitada para las implementaciones de Google Cloud
  • Habilidades básicas de programación (Python o JavaScript/Node.js)
  • Conocimiento práctico de los comandos básicos del sistema operativo

Encuesta

¿Cómo usarás este instructivo?

Leer y completar los ejercicios Solo leer

¿Cómo calificarías tu experiencia de desarrollo en Python o Node.js?

Principiante Intermedio Avanzado

¿Cómo calificarías tu experiencia en el uso de los servicios de Google Cloud?

Principiante Intermedio Avanzado

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una string de caracteres que no se utiliza en las API de Google y se puede actualizar en cualquier momento.
  • El ID del proyecto debe ser único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). Cloud Console genera automáticamente una string única, que, por lo general, no importa cuál sea. En la mayoría de los codelabs, debes hacer referencia al ID del proyecto (suele ser PROJECT_ID). Por lo tanto, si no te gusta, genera otro aleatorio o prueba con uno propio y comprueba si está disponible. Después de crear el proyecto, este ID se “congela” y no se puede cambiar.
  • Además, hay un tercer valor, el Número de proyecto, que usan algunas API. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en Cloud Console para usar las API o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Si quieres cerrar los recursos para no se te facture más allá de este instructivo, sigue las instrucciones de “limpieza” que se encuentran al final del codelab. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

3. Habilita la API de Translation

En esta sección, aprenderás a habilitar las APIs de Google en general. En nuestra app de ejemplo, habilitarás la API de Cloud Translation. También habilitarás App Engine, Cloud Functions o Cloud Run (además de Cloud Artifact Registry), según las plataformas en las que desees implementar la app de ejemplo.

Cómo habilitar las APIs de Google

Introducción

Independientemente de la API de Google que quieras usar en tu aplicación, esta debe estar habilitada. Las APIs se pueden habilitar desde la línea de comandos o desde la consola de Cloud. El proceso para habilitar las APIs es idéntico, por lo que, una vez que habilites una, podrás habilitar otra de la misma manera.

Opción 1: gcloud Interfaz de línea de comandos (Cloud Shell o entorno local)

Si bien es más común habilitar las APIs desde la consola de Cloud, algunos desarrolladores prefieren hacer todo desde la línea de comandos. Para ello, debes buscar el "nombre del servicio" de una API. Parece una URL: SERVICE_NAME.googleapis.com. Puedes encontrarlos en el gráfico de productos compatibles o consultarlos de forma programática con la API de Google Discovery.

Con esta información, puedes habilitar una API con Cloud Shell (o tu entorno de desarrollo local con la herramienta de línea de comandos de gcloud instalada) de la siguiente manera:

gcloud services enable SERVICE_NAME.googleapis.com

Ejemplo 1: Habilita la API de Cloud Vision

gcloud services enable vision.googleapis.com

Ejemplo 2: Habilita Google App Engine

gcloud services enable appengine.googleapis.com

Ejemplo 3: Habilita varias APIs con una sola solicitud. Por ejemplo, si este codelab tiene usuarios que implementan una app con la API de Cloud Translation en App Engine, Cloud Functions y Cloud Run, la línea de comandos sería la siguiente:

gcloud services enable appengine.googleapis.com cloudfunctions.googleapis.com artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

Este comando habilita App Engine, Cloud Functions, Cloud Run y la API de Cloud Translation. Además, habilita Cloud Artifact Registry, ya que es allí donde el sistema de Cloud Build debe registrar las imágenes de contenedor para implementarlas en Cloud Run.

Opción 2: Consola de Cloud

También puedes habilitar las APIs de Google en el Administrador de APIs. En Cloud Console, ve a API Manager y selecciona Biblioteca.

fb0f1d315f122d4a.png

Comienza a ingresar el nombre de una API en la barra de búsqueda para ver los resultados coincidentes:

2275786a24f8f204.png

Selecciona la API que deseas habilitar y haz clic en el botón Habilitar:

7960a6752a1da767.png

El proceso para habilitar todas las APIs es similar, independientemente de la API de Google que desees usar.

Costo

Muchas APIs de Google se pueden usar sin cargo, pero hay costos cuando se usan la mayoría de los productos y las APIs de Google Cloud. Cuando habilites las APIs de Cloud, es posible que se te solicite una cuenta de facturación activa. Sin embargo, algunos productos de Google Cloud incluyen un nivel"Siempre gratuito", que debes superar para incurrir en cargos de facturación.

Los usuarios nuevos de GCP cumplen con los requisitos para obtener la prueba gratuita, que actualmente es de USD 300 y es válida durante los primeros 90 días. Por lo general, los Codelabs no generan muchos cargos o no generan ninguno, por lo que te sugerimos que esperes para usar la prueba gratuita hasta que realmente quieras probarla, en especial, porque es una oferta única. Las cuotas del nivel gratuito no vencen y se aplican independientemente de si usas la prueba gratuita o no.

Los usuarios deben consultar la información sobre precios de cualquier API antes de habilitarla (por ejemplo, la página de precios de la API de Cloud Vision ), y deben tener en cuenta si tiene un nivel gratuito y, si es así, cuál es. Siempre que te mantengas dentro de los límites diarios o mensuales especificados en conjunto, no deberías incurrir en ningún cargo. Los precios y los niveles gratuitos varían entre las APIs de los grupos de productos de Google. Ejemplos:

Los diferentes productos de Google se facturan de manera diferente, por lo que debes consultar la documentación correspondiente para obtener esa información.

Asegúrate de que los servicios deseados estén habilitados

Asegúrate de que la API de Cloud Translation esté en el Administrador de APIs, como se indicó anteriormente. Si no habilitaste las plataformas sin servidores desde la línea de comandos, puedes hacerlo desde sus respectivos paneles en la consola de Cloud: App Engine, Cloud Functions y Cloud Run.

Si bien habilitar las APIs desde la consola de Cloud es visualmente informativo, es más rápido usar la herramienta de gcloud, que tarda segundos en habilitar todos los servicios:

$ gcloud services enable appengine.googleapis.com \
cloudfunctions.googleapis.com artifactregistry.googleapis.com \
run.googleapis.com translate.googleapis.com
Operation "operations/acf.p2-xxxxxx035451-704918f2-5470-4436-9bdd-c3b204yyyyyy" finished successfully.

Más información sobre los costos

La sección anterior sobre costos es general para todas las APIs de Google. Cubramos más detalles para este instructivo. Si bien su cuota mensual no se indica en la página de resumen general del nivel "Siempre gratis", en la página de precios de la API de Translation se indica que todos los usuarios obtienen una cantidad fija de caracteres traducidos por mes. No se te cobrará ninguna tarifa por la API si te mantienes por debajo de ese umbral. Para obtener más información sobre los costos de las plataformas sin servidores de Google Cloud, consulta la sección de costos del repositorio. En la sección “Realiza una limpieza” al final, se explicará cómo dejar de incurrir en facturación después de completar este codelab.

4. Obtén el código de la app de ejemplo

Descarga el archivo ZIP o clona el repositorio

  • Descarga el archivo ZIP o clona el repo con git clone https://github.com/googlecodelabs/cloud-nebulous-serverless.git.
  • Si no tienes un entorno de desarrollo local y deseas realizar este instructivo en Cloud Shell, puedes clonar el repo con el mismo comando git clone allí.
  • También puedes acceder al archivo ZIP desde su botón verde Code, como se muestra en la siguiente captura de pantalla:

5cd6110c4414cf65.png

Ahora que tienes todo, crea una copia completa de la carpeta para realizar este instructivo específico, ya que es probable que debas borrar o cambiar los archivos. Si quieres realizar otra implementación, puedes copiar la original para no tener que clonarla ni descargarla de nuevo.

5. Confirma el entorno de Node.js

Para configurar tu entorno de Node.js, haz lo siguiente:

  1. Asegúrate de tener instaladas las versiones contemporáneas de Node (>=10) y NPM (>=6).
  2. Ve a la ubicación en la que clonaste el repo (o descomprimiste el archivo ZIP) y, luego, dirígete a la carpeta cloud/nodejs.
  3. Confirma que package.json esté presente y, luego, ejecuta npm install.

Para el punto 1 anterior, puedes verificar qué versiones tienes en la línea de comandos:

$ node -v
v17.0.1
$ npm -v
8.1.0

6. Recorrido por la app de ejemplo

La app de ejemplo es una derivada simple de Google Traductor que solicita a los usuarios que ingresen texto en inglés y reciban la traducción equivalente de ese texto en español.

El archivo de configuración package.json indica qué paquetes de terceros son necesarios para la aplicación (ten en cuenta que las versiones de los paquetes se pueden actualizar más allá de lo que se indica aquí):

{
  "name": "cloud-nebulous-serverless-nodejs",
  "version": "0.0.1",
  "description": "Nebulous Serverless sample app",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "mocha test/test_neb.js"
  },
  "author": "Google LLC",
  "license": "Apache-2.0",
  "dependencies": {
    "@google-cloud/translate": "^6.3.1",
    "express": "^4.17.1",
    "nunjucks": "^3.2.3"
  },
  "devDependencies": {
    "mocha": "^9.1.3",
    "supertest": "^6.1.6"
  }
}

Ahora, abre el archivo index.js para que podamos ver cómo funciona. Si se omiten las líneas comentadas sobre la licencia, se verá de la siguiente manera en la parte superior e inferior:

const express = require('express');
const nunjucks = require('nunjucks');
const {TranslationServiceClient} = require('@google-cloud/translate');

const app = express();
app.use(express.urlencoded({extended: true}));
nunjucks.configure('templates', {autoescape: true, express: app});
const TRANSLATE = new TranslationServiceClient();

const PORT = process.env.PORT || 8080;
const SOURCE = ['en', 'English'];
const TARGET = ['es', 'Spanish'];
let parent;
TRANSLATE.getProjectId().then(result => {
    parent = `projects/${result}`;
});


if (!process.env.FUNCTION_TARGET) {
    app.listen(PORT, () =>
        console.log(`Listening on port ${PORT}`)
    );
}

# . . . [translate() function definition] . . .

app.all('/', translate);
module.exports = {
    app
};
  1. Los requires incorporan la funcionalidad de framework y plantillas, y la biblioteca cliente de la API de Cloud Translation.
  2. Las variables globales representan la app web, el ID del proyecto de Cloud, el cliente de la API de Translation, la "ruta de ubicación" principal para las llamadas a la API de Translation y los idiomas SOURCE y TARGET. En este caso, son inglés (en) y español (es), pero puedes cambiar estos valores por otros códigos de idioma admitidos por la API de Cloud Translation.
  3. El primer elemento de cada par (SOURCE y TARGET) es el código de idioma, mientras que el segundo es el nombre del idioma (y se usa solo para fines de visualización, ya que es irrelevante para la API).
  4. Las pocas líneas que se encuentran en la parte inferior sirven para enviar todas las solicitudes HTTP a translate() y, luego, exportar el objeto de la aplicación app.

Por último, en el medio de index.js, se encuentra el corazón de la aplicación, la función translate():

async function translate(req, rsp) {
    let text = null;
    let translated = null;
    if (req.method === 'POST') {
        text = req.body.text.trim();
        if (text) {
            const data = {
                contents: [text],
                parent: parent,
                targetLanguageCode: TARGET[0]
            };
            const [response] = await TRANSLATE.translateText(data);
            translated = response.translations[0].translatedText;
        }
    }
    const context = {
        orig:  {text: text, lc: SOURCE},
        trans: {text: translated, lc: TARGET}
    };
    rsp.render('index.html', context);
}

La función principal se encarga de tomar la entrada del usuario y llamar a la API de Translation para realizar el trabajo pesado. Veamos esto en detalle:

  1. Restablece las variables básicas del formulario. Esto se aplica principalmente a las solicitudes GET, ya que las solicitudes POST tendrán datos que reemplazarán estos valores.
  2. Si es una solicitud POST, toma el texto para traducir y, si no está vacío, crea una estructura JSON que represente el requisito de metadatos de la API. Luego, llama a la API para el servicio.
  3. No pasamos SOURCE[0] a la API para una fuente específica en inglés. Cuando omites el idioma de origen, le solicitas a la API que lo detecte automáticamente (consulta sourceLanguageCode en la documentación).
  4. De todos modos, formatea los resultados reales (POST) o los datos nulos (GET) en el contexto de la plantilla y renderiza.

La parte visual de la aplicación se encuentra en el archivo de plantilla index.html. Muestra los resultados traducidos anteriormente (en blanco, de lo contrario) seguidos del formulario que solicita algo para traducir:

<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<style>
body {
  font-family: Verdana, Helvetica, sans-serif;
  background-color: #DDDDDD;
}
</style>
<h2>My Google Translate (1990s edition)</h2>

{% if trans['text'] %}
    <h4>Previous translation</h4>
    <li><b>Original</b>:   {{ orig['text'] }}  (<i>{{ orig['lc'][0] }}</i>)</li>
    <li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}

<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>

Para el resto del instructivo, puedes elegir cualquiera de las cuatro opciones para implementar y ejecutar esta app, o todas ellas. Todas las implementaciones son opcionales, lo que significa que puedes realizar cualquiera de ellas o todas.

  1. Ejecuta el servicio de forma local
  2. Implementa en App Engine (entorno estándar)
  3. Cómo realizar implementaciones en Cloud Functions
  4. Realiza una implementación en Cloud Run

7. OPCIÓN 1: Ejecuta el servicio de forma local

Esta sección del codelab solo se puede ejecutar de forma local. Si solo realizas la implementación en la nube, pasa a la siguiente sección.

Para ejecutar la app de ejemplo de forma local, debes seguir estos tres pasos distintos:

  1. Crea una cuenta de servicio
  2. Crea un par de claves pública/privada de cuenta de servicio
  3. Descarga el archivo de credenciales y agrégalo al código de la aplicación
  4. Inicia el servicio

Más información sobre las cuentas de servicio

Las cuentas de servicio son el mecanismo de seguridad para acceder a las APIs de Google para aplicaciones basadas en la nube cuando se accede a datos que no pertenecen a usuarios humanos. Cuando se realiza la implementación en la nube, para reducir el tiempo de preparación de los usuarios que se incorporan a la nube, todas las plataformas de procesamiento de Google Cloud (sin servidores y de otro tipo) proporcionan cuentas de servicio predeterminadas.

Las cuentas de servicio predeterminadas incluyen un amplio conjunto de permisos para "evitar burocracia", pero, cuando se prepara el lanzamiento de un servicio de producción, recomendamos a los usuarios que sigan la práctica recomendada de "privilegios mínimos" y creen cuentas de servicio administradas por el usuario con solo los permisos suficientes para que su app funcione correctamente. De todos modos, no hay cuentas de servicio predeterminadas para las implementaciones locales, por lo que debes crear una cuenta de servicio y una clave de cuenta de servicio (en realidad, un par de claves públicas/privadas) y hacer que esas credenciales estén disponibles para el código de la aplicación.

Crea un par de claves de cuenta de servicio y descarga el archivo de credenciales

Sigue las instrucciones de esta página para crear una cuenta de servicio y un par de claves públicas y privadas para ejecutar el código de forma local. Cuando crees la clave de la cuenta de servicio, se te pedirá que proporciones los permisos deseados. Asegúrate de seleccionar roles/cloudtranslate.user para poder acceder a la API correctamente.

Una vez que se haya creado correctamente tu par de claves, se te solicitará que descargues el archivo de claves de la cuenta de servicio. Llámala credentials.json y muévela a la carpeta de nivel superior de la aplicación. Ahora debes indicarle al SDK de Cloud que use esas credenciales: configura la variable de entorno GOOGLE_APPLICATION_CREDENTIALS para que apunte a ese archivo. También puedes encontrar más información sobre este proceso en esta página, que abarca el uso de cuentas de servicio.

Inicia el servicio

Cuando estés listo para continuar, inicia el servidor de Express de forma local con el siguiente comando:

$ npm start

> cloud-nebulous-serverless-nodejs@0.0.1 start
> node index.js

Listening on port 8080

Ve a tu navegador web para conectarte a localhost:8080 y deberías ver algo como lo siguiente:

adc6665b7ae13c40.png

Traduce algo para ver cómo funciona.

fc154326080bf14f.png

Cuando esté satisfecho con el resultado, salga del servidor con ^C (Control+C) y cierre la ventana. Felicitaciones por ejecutar una implementación local. Hay buenas noticias: implementar en la nube es mucho más fácil.

Solución de problemas

¿Recibes un error como este cuando solicitas una traducción?

node:fs:2486
      handleErrorFromBinding(ctx);
      ^

Error: The file at credentials.json does not exist, or it is not a file. ENOENT: no such file or directory, lstat '/tmp/nodejs/credentials.json'
    . . .

SOLUCIÓN: Este error significa que no completaste la creación de una cuenta de servicio ni la descarga del archivo del par de claves pública/privada credentials.json. Regresa a "OPCIÓN 1: Ejecuta el servicio de forma local", completa este proceso y, luego, instala las credenciales en la carpeta principal antes de continuar.

8. OPCIÓN 2: Implementa en App Engine (entorno estándar)

Esta sección del codelab solo sirve para la implementación en Node App Engine. Si no te interesa, pasa a la siguiente sección.

Esta implementación usa el archivo de configuración app.yaml, que le indica a App Engine qué entorno de ejecución usar con una sola línea:

runtime: nodejs16

Ni Cloud Functions ni Cloud Run usan el archivo app.yaml. Si no planeas usar App Engine, puedes borrar este archivo de forma segura. Cuando esté todo listo para implementar en App Engine, ejecuta este comando:

$ gcloud app deploy

Una vez que se selecciona una región, el resultado de gcloud app deploy será mucho menos detallado y debería verse de la siguiente manera:

Services to deploy:

descriptor:                  [/private/tmp/nodejs/app.yaml]
source:                      [/private/tmp/nodejs]
target project:              [PROJECT_ID]
target service:              [default]
target version:              [2021...]
target url:                  [https://PROJECT_ID.REG_ABBR.appspot.com]
target service account:      [App Engine default service account]


Do you want to continue (Y/n)?

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 2 files to Google Cloud Storage                          ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...⠏WARNING: *** Improve build performance by generating and committing package-lock.json.

Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://PROJECT_ID.REG_ABBR.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse

To take a quick anonymous survey, run:
  $ gcloud survey

Ahora que tu app está disponible a nivel mundial, deberías poder acceder a ella en la URL que contiene el ID de tu proyecto y ver un resultado similar a la versión local de Express, pero ten en cuenta que se ejecuta en la nube y está disponible en todo el mundo:

da28f951c33a2c3d.png

Si envías una solicitud, verás que funciona igual que todas las demás implementaciones.

9. OPCIÓN 3: Implementa en Cloud Functions

Esta sección del codelab solo sirve para implementar en Cloud Functions de Node. Si no te interesa, pasa a la siguiente sección.

No hay archivos de configuración con Cloud Functions, por lo que, cuando esté todo listo para implementar en Cloud Functions, ejecuta este comando:

$ gcloud functions deploy translate \
  --runtime nodejs16 \
  --entry-point app \
  --trigger-http \
  --region REGION \
  --allow-unauthenticated

Es posible que tu proyecto de GCP tenga un REGION predeterminado, pero puedes usar la marca --region para implementar tu función en una región específica. Cloud Functions no te solicita información como otros productos de Cloud. Independientemente de la región que elijas, el resultado de gcloud functions deploy debería verse de la siguiente manera:

Deploying function (may take a while - up to 2 minutes)...⠛
For Cloud Build Logs, visit: https://console.cloud.google.com/cloud-build/builds;region=REGION/15ac7fc1-731d-4f3b-bc15-8f2614xxxxxx?project=062269xxxxxx
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: aaf7e0cd-fbbd-4624-abeb-3e7437xxxxxx
buildName: projects/062269xxxxxx/locations/REGION/builds/aaf7e0cd-fbbd-4624-abeb-3e7437xxxxxx
entryPoint: app
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://REGION-PROJECT_ID.cloudfunctions.net/translate
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/REGION/functions/translate
runtime: nodejs16
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-REGION-01de94c2-6eb4-4c49-aaff-09276cdb7ae9/a1db9f2d-3511-414b-aeeb-de6042xxxxxx.zip
status: ACTIVE
timeout: 60s
updateTime: '2021...'
versionId: '...'

Ahora que tu app está disponible a nivel mundial, deberías poder acceder a ella en la URL que contiene el ID de tu proyecto, como se muestra en el resultado de la implementación (en "httpsTrigger/url"). La URL debería verse de la siguiente manera: https://REGION-PROJECT_ID.cloudfunctions.net/translate, que varía según la región que seleccionaste y el ID de tu proyecto de Cloud.

518f1c3165f2096d.png

10. OPCIÓN 4: Implementa en Cloud Run

Esta sección del codelab solo se aplica a la implementación en Cloud Run. Si no te interesa, pasa a la siguiente sección.

No hay archivos de configuración con Cloud Run, por lo que, cuando esté todo listo para la implementación en Cloud Run, siga las instrucciones que se indican a continuación.

Ahora puedes implementar tu servicio de traducción en Cloud Run ejecutando este comando:

$ gcloud run deploy translate --source . --allow-unauthenticated --platform managed

El resultado debería ser el siguiente y proporcionar algunas instrucciones para los próximos pasos:

Please specify a region:
 [1] asia-east1
 [2] asia-east2
. . . (other regions) . . .
 [28] us-west4
 [29] cancel
Please enter your numeric choice:  REGION_CHOICE

To make this the default region, run `gcloud config set run/region REGION`.

Deploying from source requires an Artifact Registry repository to
store build artifacts. A repository named [cloud-run-source-deploy] in
 region [REGION] will be created.

Do you want to continue (Y/n)?

This command is equivalent to running "gcloud builds submit --pack image=[IMAGE] ." and "gcloud run deploy translate --image [IMAGE]"

Building . . . and deploying container to Cloud Run service [translate] in project [PROJECT_ID] region [REGION]
✓ Building and deploying... Done.
  ✓ Creating Container Repository...
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/60e1b
  9bb-b991-4b4e-8d8a-HASH?project=PROJECT_NUMBER].
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [translate] revision [translate-00001-xyz] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

Cloud Buildpacks crea paquetes de tus apps para Cloud Run de la misma manera en que lo harías si ejecutaras tu app de forma local. Para los usuarios de Node.js, ejecuta npm install y npm start. En el caso de Python, ejecuta pip install -r requirements.txt y, luego, inicia la app según las instrucciones de tu Procfile. (Lo mismo se aplica a todos los demás idiomas compatibles con Cloud Buildpacks). Tu app estará lista para usarse cuando se complete el proceso de compilación.

Luego, tu app estará disponible a nivel global (aunque se implemente de forma regional) y se podrá acceder a ella a través de la URL que contiene el ID de tu proyecto, como se muestra en el resultado de la implementación (en "Service URL:").

169f6edf5f7d2068.png

Traduce algo para ver cómo funciona.

31554e71cb80f1b4.png

11. Conclusión

¡Felicitaciones! Aprendiste a habilitar y usar la API de Cloud Translation, obtener las credenciales necesarias y, luego, implementar una app web simple en Express de forma local, en App Engine, Cloud Functions o Cloud Run. Consulta la carpeta del repo para obtener más información o acceder a otras versiones de esta app, así como a otros codelabs.

Limpia

La API de Cloud Translation te permite realizar una cantidad fija de traducciones de caracteres por mes de forma gratuita. App Engine también tiene una cuota gratuita, al igual que Cloud Functions y Cloud Run. Se te cobrarán cargos si se supera cualquiera de los límites. Si planeas continuar con el siguiente codelab, no es necesario que cierres la app.

Sin embargo, si aún no estás listo para continuar con el siguiente instructivo o te preocupa que Internet descubra la app que acabas de implementar, inhabilita tu app de App Engine, borra tu Cloud Function o inhabilita tu servicio de Cloud Run para evitar que se apliquen cargos. Cuando estés listo para pasar al siguiente codelab, puedes volver a habilitarla. Por otro lado, si no vas a continuar con esta aplicación ni con otros codelabs y quieres borrar todo por completo, puedes cerrar tu proyecto.

Además, la implementación en una plataforma de procesamiento sin servidores de Google Cloud genera costos menores de compilación y almacenamiento. Cloud Build tiene su propia cuota gratuita, al igual que Cloud Storage. Para mayor transparencia, Cloud Build compila la imagen de tu aplicación, que luego se almacena en Cloud Container Registry o en Artifact Registry, su sucesor. El almacenamiento de esa imagen usa parte de esa cuota, al igual que la salida de red cuando se transfiere la imagen al servicio. Sin embargo, es posible que vivas en una región que no tenga ese nivel gratuito, por lo que debes tener en cuenta tu uso de almacenamiento para minimizar los costos potenciales.

12. Recursos adicionales

En las siguientes secciones, encontrarás material de lectura adicional y ejercicios recomendados para aumentar los conocimientos que adquiriste al completar este instructivo.

Estudio adicional

Ahora que tienes algo de experiencia con la API de Translation, hagamos algunos ejercicios adicionales para desarrollar aún más tus habilidades. Para continuar con tu ruta de aprendizaje, modifica nuestra app de ejemplo de la siguiente manera:

  1. Completa todas las demás ediciones de este codelab para ejecutarlo de forma local o implementarlo en las plataformas de procesamiento sin servidores de Google Cloud (consulta el README del repo).
  2. Completar este instructivo con otro lenguaje de programación
  3. Cambia esta aplicación para que admita diferentes idiomas de origen o destino.
  4. Actualiza esta aplicación para poder traducir texto a más de un idioma. Cambia el archivo de plantilla para que tenga un menú desplegable de idiomas de destino admitidos.

Más información

Google App Engine

Google Cloud Functions

Google Cloud Run

Buildpacks de Google Cloud, Container Registry y Artifact Registry

Google Cloud Translation y Google ML Kit

Otros productos o páginas de Google Cloud

Licencia

Este instructivo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons, mientras que el código fuente del repositorio cuenta con la licencia Apache 2.