Ampliación de la asistencia para los servicios en paquetes de App Engine: Parte 1 (módulo 17)

1. Descripción general

El objetivo de la serie de codelabs de Serverless Migration Station (instructivos prácticos y de autoaprendizaje) y los videos relacionados es ayudar a los desarrolladores de Google Cloud sin servidores a modernizar sus aplicaciones guiándolos a través de una o más migraciones, principalmente alejándose de los servicios heredados. De esta manera, tus apps serán más portátiles y tendrás más opciones y flexibilidad, lo que te permitirá integrar y acceder a una mayor variedad de productos de Cloud, y actualizarte más fácilmente a versiones de lenguaje más recientes. Si bien, en un principio, se enfoca en los primeros usuarios de Cloud, principalmente los desarrolladores de App Engine (entorno estándar), esta serie es lo suficientemente amplia como para incluir otras plataformas sin servidores, como Cloud Functions y Cloud Run, o en cualquier otro lugar si corresponde.

Anteriormente, los desarrolladores debían migrar de los "servicios agrupados" heredados de App Engine, como Datastore y Memcache, antes de poder actualizar las versiones de idioma, dos tareas potencialmente difíciles de realizar de forma consecutiva. Al hacer que muchos de los servicios clave incluidos estén disponibles en el servicio de App Engine de 2ª generación, los desarrolladores ahora pueden portar sus apps a los entornos de ejecución más recientes y seguir usando (la mayoría de) los servicios incluidos. En este codelab, se explica cómo actualizar una app de muestra de Python 2 a 3 y, al mismo tiempo, mantener el uso del servicio agrupado de Datastore (a través de la biblioteca de App Engine NDB). El uso de la mayoría de los servicios incluidos solo requiere una actualización menor del código, como se explicará en este instructivo, pero hay otros que requieren cambios más extensos, que se abordarán en la "Parte 2", un módulo y un codelab de seguimiento.

En un próximo lab,

  • Cómo portar una app de ejemplo de App Engine de Python 2 a 3
  • Actualiza la configuración de la app para incluir el SDK de App Engine
  • Agrega código del SDK a la app que admite servicios en paquetes en entornos de ejecución de 2ª generación, como Python 3

Requisitos

Encuesta

¿Cómo usarás este instructivo?

Leer Leer y completar los ejercicios

¿Cómo calificarías tu experiencia en Python?

Principiante Intermedio Avanzado

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

Principiante Intermedio Avanzado

2. Fondo

El servicio original de App Engine se lanzó en 2008 y se proporcionó con un conjunto de APIs heredadas (ahora conocidas como servicios agrupados) para que los desarrolladores pudieran compilar e implementar aplicaciones a nivel global de manera conveniente. Estos servicios incluyen Datastore, Memcache y Task Queue. Si bien eran convenientes, los usuarios se preocuparon por la portabilidad de sus apps cuando usaban APIs propietarias que las vinculaban a App Engine y querían que sus apps fueran más portátiles. Esto, junto con el hecho de que muchos de estos servicios en paquetes maduraron hasta convertirse en sus propios productos de Cloud independientes, llevó al equipo de App Engine a lanzar la plataforma de próxima generación en 2018 sin ellos.

Avancemos rápidamente hasta hoy, con desarrolladores de Python 2 ansiosos por actualizar a Python 3. Las apps de la versión 2.x que usaban servicios agrupados en paquetes debían migrar de esos servicios antes de que sus apps pudieran portarse a la versión 3.x, lo que representaba un par de migraciones forzadas consecutivas, que también podían ser difíciles. Para facilitar esta transición, el equipo de App Engine introdujo en el otoño de 2021 un "agujero de gusano" al pasado, que permite que las apps que se ejecutan en entornos de ejecución de próxima generación accedan a muchos de esos servicios en paquetes. Si bien esta versión no incluye todos los servicios disponibles en los tiempos de ejecución originales, los principales, como Datastore, Task Queue y Memcache, están disponibles.

En este codelab, se muestran los cambios necesarios para actualizar tu app a Python 3 y, al mismo tiempo, conservar el uso de los servicios agrupados. El objetivo es que tus apps se ejecuten en los entornos de ejecución más recientes, lo que te permitirá migrar de los servicios incluidos a los equivalentes independientes de Cloud o a las alternativas de terceros en tus propios plazos, en lugar de que sea un bloqueo para una actualización a la versión 3.x. Si bien ya no es necesario migrar de los servicios agrupados, hacerlo te brinda más portabilidad y flexibilidad en cuanto a dónde se pueden alojar tus apps, lo que incluye cambiar a plataformas que pueden satisfacer mejor tus cargas de trabajo o simplemente permanecer en App Engine y actualizar a una versión de lenguaje más moderna, como se describió anteriormente.

La app de ejemplo de Python 2 del módulo 1 utiliza el servicio agrupado de Datastore a través de App Engine NDB. La app ya migró frameworks de webapp2 a Flask (se completó en el codelab del módulo 1), pero su uso de Datastore sigue intacto.

En este instructivo, se incluyen los siguientes pasos:

  1. Configurar/trabajo previo
  2. Actualizar configuración
  3. Modifica el código de la aplicación

3. Configurar/trabajo previo

Esta sección explica cómo:

  1. Configura el proyecto de Cloud
  2. Obtén app de ejemplo del modelo de referencia
  3. (Vuelve a) implementar y validar la app de referencia

Estos pasos garantizan que comiences con código funcional.

1. Configura el proyecto

Si completaste el codelab del módulo 1, te recomendamos volver a usar ese mismo proyecto (y el código). De manera alternativa, puedes crear un proyecto de Cloud nuevo o reutilizar otro proyecto existente. Asegúrate de que el proyecto tenga una cuenta de facturación activa en la que se haya habilitado el servicio de App Engine.

2. Obtén app de ejemplo del modelo de referencia

Uno de los requisitos previos para este codelab es tener una app de App Engine del módulo 1 que funcione: completa el codelab del módulo 1 (recomendado) o copia la app del módulo 1 del repo. Sin importar si usas el tuyo o el nuestro, el código del módulo 1 es el que tendremos en cuenta. Este codelab te guiará en cada paso y concluirá con un código que se parezca al que se encuentra en la carpeta del repositorio del módulo 7 "FINISH".

Independientemente de la app del Módulo 1 que uses, la carpeta debería verse como la siguiente, posiblemente con una carpeta lib también:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

3. (vuelve a) implementa la aplicación de modelo de referencia

Ejecuta los siguientes pasos para volver a implementar la app del Módulo 1:

  1. Borra la carpeta lib si hay una y ejecuta pip install -t lib -r requirements.txt para volver a completar lib. Si tienes instalados Python 2 y 3, es posible que debas usar el comando pip2.
  2. Asegúrate de haber instalado y inicializado la herramienta de línea de comandos de gcloud, y de haber revisado su uso.
  3. Configura tu proyecto de Cloud con gcloud config set project PROJECT_ID si no quieres ingresar tu PROJECT_ID con cada comando gcloud que se emita.
  4. Implementa la app de ejemplo con gcloud app deploy
  5. Confirma que la app del Módulo 1 se ejecuta según lo previsto sin problemas para mostrar las visitas más recientes (como se ilustra a continuación).

a7a9d2b80d706a2b.png

4. Actualizar configuración

Una vez que hayas ejecutado esos pasos de forma correcta y veas que tu app web funciona, podrás portarla a Python 3, comenzando con config.

Agrega el SDK a requirements.txt

El entorno de ejecución de Python 3 de App Engine reduce significativamente la sobrecarga por el uso de bibliotecas de terceros. Solo es necesario enumerarlas en requirements.txt. Para usar los servicios agrupados en Python 3, agrega el paquete del SDK de App Engine, appengine-python-standard, a él. El paquete del SDK se une a Flask desde el módulo 1:

flask
appengine-python-standard

Actualiza app.yaml

Sigue los pasos que se indican a continuación para aplicar cambios de configuración a tu archivo app.yaml:

  1. Reemplaza la directiva runtime por la versión compatible de Python 3. Por ejemplo, especifica python310 para Python 3.10.
  2. Borra las directivas threadsafe y api_version, ya que ninguna se usa en Python 3.
  3. Borra por completo la sección handlers, ya que esta app solo tiene controladores de secuencias de comandos. Si tu app tiene controladores de archivos estáticos, déjalos intactos en handlers.
  4. El entorno de ejecución de Python 3 no admite bibliotecas integradas de terceros, como sí lo hace el entorno de ejecución de Python 2. Si tu app tiene una sección libraries en app.yaml, borra toda la sección. (Solo es necesario enumerar los paquetes obligatorios en requirements.txt, como las bibliotecas no integradas). Nuestra app de ejemplo no tiene una sección libraries, por lo que debes pasar al siguiente paso.
  5. Crea una directiva app_engine_apis establecida en true para usarla. Esto corresponde a agregar el paquete del SDK de App Engine a requirements.txt anterior.

Resumen de los cambios necesarios que se deben realizar en app.yaml:

ANTES:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

DESPUÉS:

runtime: python310
app_engine_apis: true

Otros archivos de configuración

Como todos los paquetes de terceros solo deben aparecer en requirements.txt, a menos que tengas algo especial en appengine_config.py, no es necesario, así que bórralo. Del mismo modo, como todas las bibliotecas de terceros se instalan automáticamente durante el proceso de compilación, no es necesario copiarlas ni incluirlas en el paquete, lo que significa que ya no se necesita el comando pip install ni la carpeta lib, por lo que puedes borrarlos. Resumen:

  • Borrar archivo appengine_config.py
  • Borrar lib carpeta

Con esto, se completan todos los cambios de configuración necesarios.

5. Modifica el código de la aplicación

Para acceder a la mayoría de los servicios en paquetes disponibles en el entorno de ejecución de Python 3, se requiere un fragmento de código corto que encapsule el objeto de aplicación de la Interfaz de puerta de enlace del servidor web (WSGI) en main.py. La función de wrapper es google.appengine.api.wrap_wsgi_app(), y la usas importándola y uniéndola a tu objeto WSGI. Realiza los siguientes cambios para reflejar la actualización requerida para Flask en main.py:

ANTES:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

app = Flask(__name__)

DESPUÉS:

from flask import Flask, render_template, request
from google.appengine.api import wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)

Consulta la documentación para ver ejemplos de ajuste de WSGI para otros frameworks de Python.

Si bien este ejemplo funciona para otorgarle a tu app acceso a la mayoría de los servicios incluidos en Python 3, otros, como Blobstore y Mail, requieren código adicional. Analizaremos esas muestras en otro módulo de migración.

Con esto, se completan todos los cambios necesarios para agregar el uso de los servicios agrupados de App Engine a la app de muestra del Módulo 1. La aplicación ya es compatible con Python 2 y 3, por lo que no hay cambios adicionales para portarla a Python 3 más allá de lo que ya hiciste en la configuración. El paso final es implementar esta app modificada en el entorno de ejecución de Python 3 de App Engine de próxima generación y confirmar que las actualizaciones se realizaron correctamente.

6. Resumen/Limpieza

En esta sección, se completa el codelab con la implementación de la app y la verificación de que funcione según lo previsto y en cualquier resultado reflejado. Después de la validación de la app, realiza cualquier limpieza y considera los próximos pasos.

Implementa y verifica la aplicación

Implementa la app de Python 3 con gcloud app deploy y confirma que la app funciona como lo hacía en Python 2. Ninguna de las funcionalidades cambia, por lo que el resultado debería ser idéntico al de la app del módulo 1:

a7a9d2b80d706a2b.png

Notas finales

Felicitaciones por dar el primer paso para transferir tus apps de App Engine de Python 2 a Python 3 y conservar su uso de los servicios agrupados en este momento.

Limpia

General

Si terminaste por ahora, te recomendamos que inhabilites tu app de App Engine para evitar incurrir en cargos de facturación. Sin embargo, si deseas realizar más pruebas o experimentos, la plataforma de App Engine tiene una cuota gratuita, por lo que no se te cobrará siempre que no excedas ese nivel de uso. Esto se aplica a la capacidad de procesamiento, pero también puede haber cargos por los servicios relevantes de App Engine, por lo que debes consultar su página de precios para obtener más información. Si esta migración involucra otros servicios de Cloud, estos se facturarán por separado. En cualquier caso, si corresponde, consulta la sección "Específico para este codelab" que se encuentra más abajo.

Para divulgar toda la información, la implementación en una plataforma de computación sin servidores de Google Cloud, como App Engine, genera costos menores de compilación y almacenamiento. Cloud Build tiene su propia cuota gratuita, al igual que Cloud Storage. El almacenamiento de esa imagen usa parte de esa cuota. 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. Las "carpetas" específicas de Cloud Storage que debes revisar incluyen las siguientes:

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • Los vínculos de almacenamiento anteriores dependen de tu PROJECT_ID y *LOC*ación, por ejemplo, "us" si tu app está alojada en EE.UU.

Por otro lado, si no vas a continuar con esta aplicación ni con otros codelabs de migración relacionados y quieres borrar todo por completo, cierra tu proyecto.

Específico para este codelab

Los servicios que se indican a continuación son exclusivos de este codelab. Consulta la documentación de cada producto para obtener más información:

Próximos pasos

A partir de aquí, puedes seguir varias direcciones:

  1. Actualiza el código con servicios agrupados en paquetes que requieren más cambios de código
  2. Migra de servicios agrupados en paquetes a productos independientes de Cloud
  3. Migra de App Engine a otra plataforma sin servidores de Cloud

El acceso a otros servicios incluidos, como Blobstore, Correo electrónico y Diferido, requiere más cambios en el código. Entre los módulos de migración que se enfocan en dejar de usar los servicios agrupados en paquetes heredados de App Engine, se incluyen los siguientes:

App Engine ya no es la única plataforma sin servidores de Google Cloud. Si tienes una app de App Engine pequeña o una que tiene funcionalidad limitada y deseas convertirla en un microservicio independiente, o bien quieres dividir una app monolítica en varios componentes reutilizables, estos son buenos motivos para considerar la posibilidad de migrar a Cloud Functions. Si la contenerización se convirtió en parte de tu flujo de trabajo de desarrollo de aplicaciones, en especial si consta de una canalización de CI/CD (integración continua/entrega o implementación continua), considera migrar a Cloud Run. Estos casos se abordan en los siguientes módulos:

  • Migra de App Engine a Cloud Functions: Consulta el módulo 11
  • Migra de App Engine a Cloud Run: Consulta el módulo 4 para organizar tu app en contenedores con Docker o el módulo 5 para hacerlo sin contenedores, conocimientos de Docker ni Dockerfiles.

Cambiar a otra plataforma sin servidores es opcional, y te recomendamos que consideres las mejores opciones para tus apps y casos de uso antes de realizar cualquier cambio.

Independientemente del módulo de migración que consideres a continuación, se puede acceder a todo el contenido de Serverless Migration Station (codelabs, videos, código fuente [cuando esté disponible]) en su repositorio de código abierto. El README del repo también proporciona orientación sobre qué migraciones considerar y cualquier "orden" relevante de los módulos de migración.

7. Recursos adicionales

A continuación, se enumeran recursos adicionales para los desarrolladores que deseen explorar más a fondo este módulo de migración o uno relacionado, así como los productos relacionados. Esto incluye lugares para proporcionar comentarios sobre este contenido, vínculos al código y varios documentos que pueden resultarte útiles.

Problemas o comentarios de los codelabs

Si encuentras algún problema con este Codelab, primero busca el problema antes de enviarlo. Vínculos para buscar y crear problemas nuevos:

Recursos de migración

En la siguiente tabla, puedes encontrar vínculos a las carpetas del repositorio para el módulo 1 (INICIAR) y el módulo 1b (FINALIZAR). También se puede acceder a ellos desde el repositorio de todas las migraciones de codelab de App Engine.

Codelab

Python 2

Python 3

Módulo 1

código

N/A

Módulo 17 (este codelab)

N/A

code (mod1b-flask)

Recursos en línea

A continuación, se incluyen recursos en línea que pueden ser pertinentes para este instructivo:

Servicios empaquetados de App Engine

Documentación general de App Engine

Otra información de la nube

Videos

Licencia

Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.