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 de autoaprendizaje) tiene como objetivo ayudar a los desarrolladores a comprender las diversas opciones que tienen a la hora de implementar sus aplicaciones. Aprenderás a usar la API de Google Cloud Translation en una aplicación web sencilla. Esta app se puede ejecutar de manera local o implementarse en una plataforma de procesamiento sin servidores de Cloud (App Engine, Cloud Functions o Cloud Run).

Harás este instructivo de JavaScript con Node.js con 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 son del tipo “nebulous sin servidores” repositorio de código abierto, que incluye una versión de Python de esta app y codelabs independientes. El repo también aloja apps similares que les 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 la implementación de 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 ejecutar de manera 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 implementaciones de Google Cloud
  • Habilidades básicas de programación (Python o JavaScript/Node.js)
  • Tener conocimiento práctico de los comandos básicos del sistema operativo

Encuesta

¿Cómo usarás este instructivo?

Léelo y completa los ejercicios. Solo lectura .

¿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. Habilitar la API de Translation

En esta sección, aprenderás a habilitar las APIs de Google en general. Para nuestra app de muestra, 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.

Habilita las APIs de Google

Introducción

Independientemente de la API de Google que desees usar en tu aplicación, estas deben estar habilitadas. Las APIs se pueden habilitar desde la línea de comandos o desde la consola de Cloud. El proceso de habilitación de APIs es idéntico, por lo que una vez que habilitas una API, puedes realizar otra de la misma manera.

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

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

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

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 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 porque es donde el sistema de Cloud Build debe registrar las imágenes de contenedor para implementarse en Cloud Run.

Opción 2: Consola de Cloud

También puedes habilitar las APIs de Google en el Administrador de APIs. En la consola de Cloud, ve al Administrador de API 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 quieres 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 tarifas; sin embargo, hay costos cuando se usa la mayoría de los productos y 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 cuentan con la función “Siempre gratuito” de nivel de servicio, que debes exceder para generar cargos de facturación.

Los usuarios nuevos de GCP califican para la prueba gratuita, que, en este momento, es de USD 300 durante los primeros 90 días. Por lo general, los codelabs no generan una facturación excesiva, por lo que te sugerimos que esperes la prueba gratuita hasta que tengas todo listo para probarla, especialmente porque se trata de una oferta única. Las cuotas del nivel gratuito no vencen ni se aplican independientemente de que uses la prueba gratuita o no.

Los usuarios deben hacer referencia a la información de precios de cualquier API antes de habilitarla (por ejemplo, la página de precios de la API de Cloud Vision ), en especial si tienen un nivel gratuito y, de ser así, cuál es. Siempre y cuando te mantengas dentro de los límites diarios o mensuales especificados de forma agregada, 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:

Cada producto de Google se factura de manera diferente, así que asegúrate de consultar la documentación adecuada para esa información.

Asegúrate de que se habiliten los servicios deseados

Asegúrate de usar la API de Cloud Translation 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 cada uno de sus respectivos paneles en la consola de Cloud: App Engine, Cloud Functions, Cloud Run.

Aunque habilitar las APIs desde la consola de Cloud es visualmente informativo, es más rápido usar la herramienta 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 los costos es general en todas las APIs de Google. Vamos a abarcar más detalles para este instructivo. Si bien su cuota mensual no aparece en la lista de la lista general "Siempre gratuito" nivel de resumen, la página de precios de la API de Translation indica que todos los usuarios reciben una cantidad fija de caracteres traducidos por mes. No se te debería cobrar ningún cargo a la API si te mantienes por debajo de ese umbral. Para obtener más información sobre los costos que usan las plataformas sin servidores de Google Cloud, consulta la sección Costos del repositorio. La fase de limpieza al final, se analizará cómo dejar de generar facturación después de completar este codelab.

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

Descargar ZIP o el repositorio clonado

  • Descarga el archivo ZIP o clona el repositorio con git clone https://github.com/googlecodelabs/cloud-nebulous-serverless.git.
  • Si no tienes un entorno de desarrollo local y quieres hacer este instructivo en Cloud Shell, puedes clonar el repositorio con el mismo comando git clone allí.
  • También puedes acceder al archivo ZIP desde el 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 hacer este instructivo específico, ya que es probable que implique borrar o cambiar los archivos. Si quieres realizar una implementación diferente, puedes comenzar de nuevo copiando 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 modernas de Node (>=10) y NPM (>=6)
  2. Ve a la ubicación en la que clonaste el repositorio (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 primer paso 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 un derivado sencillo de Google Traductor que les indica a los usuarios que ingresen un 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 se requieren para la aplicación (ten en cuenta que las versiones de los paquetes pueden actualizarse 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 omites las líneas comentadas sobre las licencias, se verá de la siguiente manera en la parte inferior y superior:

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 require incorporan el framework y la funcionalidad de plantillas, además de la biblioteca cliente de la API de Cloud Translation.
  2. Las variables globales representan la aplicación web, el ID del proyecto de Cloud, el cliente de la API de Translation y la “ruta de ubicación” superior. para las llamadas a la API de Translation, y los idiomas SOURCE y TARGET. En este caso, es inglés (en) y español (es), pero puedes cambiar estos valores a otros códigos de idioma compatibles con 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 con fines de visualización solo porque es irrelevante para la API).
  4. Las pocas líneas en la parte inferior son para enviar todas las solicitudes HTTP a translate() y, luego, exportar el objeto de la aplicación app.

Por último, en medio de index.js está 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 toma la entrada del usuario y llama a la API de Translation para realizar el trabajo pesado. Analicemos esto:

  1. Restablece las variables básicas del formulario. Esto es principalmente para solicitudes GET, ya que las solicitudes POST tendrán datos que las reemplazarán.
  2. Si se trata de un POST, toma el texto que quieras 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 solicitar el servicio.
  3. No pasamos SOURCE[0] a la API a una fuente en inglés específica. Cuando excluyes el idioma de origen, le solicitas a la API que lo detecte automáticamente (consulta sourceLanguageCode en la documentación).
  4. En cualquier caso, formatea los resultados reales (POST) o ningún dato (GET) en el contexto y la renderización de la plantilla.

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

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

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

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

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

Esta sección del codelab solo está destinada a la ejecución local. Si solo realizas la implementación en la nube, avanza a la siguiente sección.

Para ejecutar la app de ejemplo de manera local, se deben seguir tres pasos:

  1. Crea una cuenta de servicio
  2. Crea un par de claves pública/privada de la cuenta de servicio
  3. Descarga el archivo de credenciales y el paquete con el 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 de las aplicaciones basadas en la nube cuando acceden a datos que no pertenecen a usuarios humanos. Cuando se implementa en la nube, para reducir el tiempo de adaptación de los usuarios a la nube, todas las plataformas de procesamiento de Google Cloud (sin servidores y de otra índole) proporcionan cuentas de servicio predeterminadas.

Las cuentas de servicio predeterminadas incluyen un amplio conjunto de permisos pero al prepararse para lanzar un servicio de producción, sugerimos encarecidamente que los usuarios sigan la práctica recomendada de "privilegios mínimos", pero crear cuentas de servicio administradas por el usuario solo con permisos suficientes para que la app funcione correctamente. En cualquier caso, 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ública/privada) y poner esas credenciales a disposición del código de la aplicación.

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

Sigue las instrucciones que se indican en esta página para crear una cuenta de servicio y un par de claves pública/privada para ejecutar de forma local. Cuando crees la clave de la cuenta de servicio, se te solicitará que proporciones los permisos deseados. Asegúrate de seleccionar roles/cloudtranslate.user para que puedas acceder correctamente a la API.

Una vez que se haya creado correctamente el par de claves, se te pedirá que descargues el archivo de claves de la cuenta de servicio. Llámalo credentials.json y muévelo 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. Puedes encontrar más información sobre este proceso en esta página, que abarca el uso de las cuentas de servicio.

Inicia el servicio

Cuando estés listo para continuar, inicia el servidor Express localmente 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 en localhost:8080. Deberías ver un resultado similar al siguiente:

adc6665b7ae13c40.png

Traduce contenido para que funcione.

fc154326080bf14f.png

Cuando estés conforme, cierra el servidor con ^C (control-C) y sal. Felicitaciones por poner en ejecución una implementación local. Hay buenas noticias: la implementación 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 de 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 los credenciales en la carpeta principal antes de continuar.

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

Esta sección del codelab es solo para implementar en Node App Engine. Si no te interesa, continúa con 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 debe usar con una sola línea:

runtime: nodejs16

Ni Cloud Functions ni Cloud Run usan el archivo app.yaml. Si no piensas usar App Engine, es posible que este archivo se borre de forma segura. Cuando tengas 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 en todo el mundo, deberías poder acceder a ella en la URL que contiene el ID del proyecto. Deberías ver un resultado similar al de la versión local de Express, pero debes saber que se está ejecutando en la nube y que está disponible en todo el mundo:

da28f951c33a2c3d.png

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

9. OPCIÓN 3: Implementa en Cloud Functions

Esta sección del codelab es solo para implementar Node.js de Cloud Functions. Si no te interesa, continúa con la siguiente sección.

No hay archivos de configuración con Cloud Functions, así que cuando tengas todo listo para implementar Cloud Functions, ejecuta este comando:

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

Tu proyecto de GCP puede tener 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 que te gusten otros productos de Cloud. Sin importar 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 en todo el mundo, deberías poder acceder a ella en la URL que contiene el ID del proyecto, como se muestra en el resultado de la implementación (en “httpsTrigger/url”). La URL debería ser similar a https://REGION-PROJECT_ID.cloudfunctions.net/translate, la cual 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 es solo para implementar en Cloud Run. Si no te interesa, continúa con la siguiente sección.

Con Cloud Run, no hay archivos de configuración, así que sigue las instrucciones a continuación cuando tengas todo listo para implementarlo en Cloud Run.

Ya está todo listo para 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 indicaciones 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 Build empaqueta tus apps en Cloud Run de la misma manera que lo harías si ejecutaras tu app de manera local. Para los usuarios de Node.js, ejecuta npm install y npm start. Para Python, ejecuta pip install -r requirements.txt e inicia la app desde las instrucciones en tu Procfile. (Lo mismo se aplica a todos los demás lenguajes compatibles con Cloud Buildpacks). Tu app estará lista para usarse una vez que se complete el proceso de compilación.

Entonces, tu app estará (implementada de manera regional, pero) disponible a nivel mundial y se podrá acceder a ella a través de la URL que contiene tu ID del proyecto, como se muestra en el resultado de la implementación (en “Service URL”:

169f6edf5f7d2068.png

Traduce contenido para que funcione.

31554e71cb80f1b4.png

11. Conclusión

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

Limpia

La API de Cloud Translation te permite realizar una cantidad fija de caracteres traducidos por mes de forma gratuita. App Engine también tiene una cuota gratuita, al igual que Cloud Functions y Cloud Run. Se generarán cargos si se excede alguno de esos requisitos. Si planeas continuar con el siguiente codelab, no es necesario que cierres la app.

Sin embargo, si aún no estás listo para ir al 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 generen 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 o algún otro codelab, y deseas 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 una mayor transparencia, Cloud Build compila la imagen de tu aplicación, que luego se almacena en Cloud Container Registry o Artifact Registry, su sucesora. El almacenamiento de esa imagen consume parte de esa cuota, al igual que la salida de red cuando se transfiere esa imagen al servicio. Sin embargo, es posible que vivas en una región que no cuenta con ese nivel gratuito, así que ten en cuenta el uso que haces del almacenamiento para minimizar posibles costos.

12. Recursos adicionales

En las siguientes secciones, encontrarás material de lectura adicional y ejercicios recomendados para aumentar tu conocimiento adquirido tras completar este tutorial.

Estudio adicional

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

  1. Completa todas las demás ediciones de este codelab para ejecutar de forma local o implementar en plataformas de computación sin servidores de Google Cloud (consulta README del repositorio).
  2. Completa este instructivo con otro lenguaje de programación.
  3. Cambia esta aplicación para que sea compatible con diferentes idiomas de origen u objetivo.
  4. Actualiza esta aplicación para poder traducir texto a más de un idioma. Cambia el archivo de plantilla para que se muestre un menú desplegable con los idiomas de destino admitidos.

Más información

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks, Container Registry y Artifact Registry

Google Cloud Translation y el kit de AA de Google

Otros productos o páginas de Google Cloud

Licencia

Este instructivo cuenta con una licencia genérica de Creative Commons Attribution 2.0, mientras que el código fuente del repositorio está sujeto a Apache 2.