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
- Un proyecto de Google Cloud con una cuenta de facturación activa de GCP
- Habilidades básicas de Python
- Conocimiento práctico de los comandos comunes de Linux
- Conocimientos básicos sobre el desarrollo y la implementación de aplicaciones de App Engine
- Una app de App Engine del módulo 1 en funcionamiento (completa su codelab [recomendado] o copia la app del repo)
Encuesta
¿Cómo usarás este instructivo?
¿Cómo calificarías tu experiencia en Python?
¿Cómo calificarías tu experiencia en el uso de los servicios de Google Cloud?
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:
- Configurar/trabajo previo
- Actualizar configuración
- Modifica el código de la aplicación
3. Configurar/trabajo previo
Esta sección explica cómo:
- Configura el proyecto de Cloud
- Obtén app de ejemplo del modelo de referencia
- (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".
- INICIO: Carpeta del módulo 1 (Python 2)
- FINALIZAR: Carpeta del módulo 1b (Python 3)
- Repositorio completo (para clonar o descargar el archivo ZIP)
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:
- Borra la carpeta
libsi hay una y ejecutapip install -t lib -r requirements.txtpara volver a completarlib. Si tienes instalados Python 2 y 3, es posible que debas usar el comandopip2. - Asegúrate de haber instalado y inicializado la herramienta de línea de comandos de
gcloud, y de haber revisado su uso. - Configura tu proyecto de Cloud con
gcloud config set projectPROJECT_IDsi no quieres ingresar tuPROJECT_IDcon cada comandogcloudque se emita. - Implementa la app de ejemplo con
gcloud app deploy - 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).

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:
- Reemplaza la directiva
runtimepor la versión compatible de Python 3. Por ejemplo, especificapython310para Python 3.10. - Borra las directivas
threadsafeyapi_version, ya que ninguna se usa en Python 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 enhandlers. - 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
librariesenapp.yaml, borra toda la sección. (Solo es necesario enumerar los paquetes obligatorios enrequirements.txt, como las bibliotecas no integradas). Nuestra app de ejemplo no tiene una secciónlibraries, por lo que debes pasar al siguiente paso. - Crea una directiva
app_engine_apisestablecida entruepara usarla. Esto corresponde a agregar el paquete del SDK de App Engine arequirements.txtanterior.
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
libcarpeta
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:

Notas finales
- Compara lo que tienes con lo que hay en la carpeta del módulo 1b (FINAL). Si te equivocaste en algún paso, haz los ajustes necesarios.
- Compara el módulo 0
main.pyen paralelo con el módulo 1bmain.pyen esta página. Si tu app aún usawebapp2, realiza el codelab del módulo 1 para aprender a migrar dewebapp2a Flask.
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/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- Los vínculos de almacenamiento anteriores dependen de tu
PROJECT_IDy *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:
- El servicio App Engine Datastore lo proporciona Cloud Datastore (Cloud Firestore en modo Datastore), que también tiene un nivel gratuito. Consulta su página de precios para obtener más información.
Próximos pasos
A partir de aquí, puedes seguir varias direcciones:
- Actualiza el código con servicios agrupados en paquetes que requieren más cambios de código
- Migra de servicios agrupados en paquetes a productos independientes de Cloud
- 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:
- Módulo 2: Migra de App Engine NDB a Cloud NDB
- Módulos 7 a 9: App Engine TaskQueue (tareas de envío) a Cloud Tasks
- Módulos 12 y 13: Migración de Memcache de App Engine a Memorystore de Cloud
- Módulos 15 y 16: Migración de Blobstore de App Engine a Cloud Storage
- Módulos 18 y 19: De App Engine TaskQueue (tareas de extracción) a Cloud Pub/Sub
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 |
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
- Accede a los servicios en paquetes en el entorno de ejecución de última generación de Python 3
- Comparación paralela de la app del módulo 0 (Python 2) y la app del módulo 1b (Python 3)
- Ejemplos de wrapper de objetos WSGI del framework web del SDK de App Engine
- Lanzamiento de la compatibilidad con los servicios en paquetes de App Engine en los entornos de ejecución de próxima generación (2021)
Documentación general de App Engine
- Documentación de App Engine
- Tiempo de ejecución de Python 2 App Engine (entorno estándar)
- Usa las bibliotecas integradas de App Engine en App Engine de Python 2
- Tiempo de ejecución de Python 3 de App Engine (entorno estándar)
- Diferencias entre los entornos de ejecución de Python 2 y 3 de App Engine (entorno estándar)
- Guía de migración de Python 2 a 3 de App Engine (entorno estándar)
- Información sobre los precios y las cuotas de App Engine
- Lanzamiento de la plataforma App Engine de segunda generación (2018)
- Asistencia a largo plazo para entornos de ejecución heredados
- Repositorio de muestras de migración de documentación
- Repositorio de muestras de migración aportadas por la comunidad
Otra información de la nube
- Python en Google Cloud Platform
- Bibliotecas cliente de Python de Google Cloud
- Nivel "Siempre gratis" de Google Cloud
- SDK de Google Cloud (herramienta de línea de comandos
gcloud) - Toda la documentación de Google Cloud
Videos
- Serverless Migration Station
- Expediciones sin servidores
- Suscríbete a Google Cloud Tech
- Suscríbete a Google Developers
Licencia
Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.