1. Descripción general
La serie de codelabs Serverless Migration Station (instructivos prácticos y autoaprendizaje) y los videos relacionados tienen como objetivo ayudar a los desarrolladores de Google Cloud sin servidores a modernizar sus apps guiándolos a través de una o más migraciones, en especial al alejarse 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á integrarlas con una variedad más amplia de productos de Cloud y acceder a ella, y actualizar con mayor facilidad a versiones de idiomas más recientes. Aunque inicialmente 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 cualquier otra, si corresponde.
Anteriormente, los desarrolladores debían migrar desde los “servicios en paquetes” heredados de App Engine como Datastore y Memcache antes de que pudieran actualizar las versiones de los idiomas, dos iniciativas potencialmente desafiantes. Al hacer que muchos de los servicios agrupados clave estén disponibles en el servicio de 2a generación de App Engine, los desarrolladores ahora pueden migrar sus apps a los entornos de ejecución más recientes mientras siguen usando (la mayoría de) los servicios en paquetes. En este codelab, se explica cómo actualizar una app de ejemplo de Python 2 a 3 mientras se mantiene el uso del servicio en paquete de Datastore (a través de la biblioteca de App Engine NDB). El uso de la mayoría de los servicios en paquetes solo requiere una actualización menor en el código, como se explica en este instructivo, pero hay otros que requieren cambios más amplios: las cubriremos en la "Parte 2", un módulo de seguimiento y un codelab.
En un próximo lab,
- Porta la 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 compatible con servicios agrupados en entornos de ejecución de 2a generación, como Python 3.
Requisitos
- Un proyecto de Google Cloud con una cuenta de facturación de GCP activa
- 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 que funcione (completa su codelab [recomendado] o copia la app del repositorio)
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. Información general
El servicio original de App Engine se lanzó en 2008 e incluía un conjunto de APIs heredadas (ahora conocidas como servicios en paquetes) para que los desarrolladores pudieran compilar e implementar aplicaciones de manera más conveniente a nivel mundial. Entre esos servicios, se incluyen Datastore, Memcache y Task Queue. Aunque era conveniente, los usuarios se preocupaban por la portabilidad de sus apps cuando usaban APIs propias que las vinculaban a App Engine, y querían que sus apps fueran más portátiles. Esto, sumado al hecho de que muchos de estos paquetes de servicios que maduraron para convertirse en sus propios productos de Cloud independientes, el equipo de App Engine lanzó la plataforma de nueva generación en 2018 sin ellos.
Llega el presente con los desarrolladores de Python 2 ansiosos por actualizar a Python 3. Una app 2.x que usa servicios agrupados requería migrar de esos servicios antes de que sus apps pudieran transferirse a la versión 3.x, lo que representa un par de migraciones forzadas consecutivas, lo que también puede ser un desafío. Para ayudar en esta transición, el equipo de App Engine presentó en otoño de 2021 un "agujero de gusano" lo que permite que las apps que se ejecutan en entornos de ejecución de nueva generación accedan a muchos de esos servicios en paquetes. Si bien esta actualización no incluye todos los servicios disponibles en los entornos de ejecución originales, los principales jugadores, como Datastore, Task Queue y Memcache, están disponibles.
En este codelab, se muestran los cambios necesarios para que actualices tu app a Python 3 mientras conservas el uso de servicios en paquetes. El objetivo es que tus apps se ejecuten en los entornos de ejecución más recientes, lo que te permitirá migrar de servicios en paquetes a equivalentes independientes de Cloud o alternativas de terceros según tus propios cronogramas, en lugar de que la actualización 3.x sea un obstáculo. Si bien ya no es necesario migrar desde los servicios en paquetes, esto te brinda más portabilidad y flexibilidad en términos de dónde se pueden alojar tus apps, lo que incluye cambiar a plataformas que pueden entregar mejor tus cargas de trabajo o simplemente permanecer en App Engine mientras actualizas a una versión de lenguaje más moderna, como se describió anteriormente.
La app de ejemplo de Python 2 del módulo 1 usa el servicio en paquetes de Datastore a través de App Engine NDB. La app ya migró frameworks de webapp2 a Flask (completado en el codelab del módulo 1), pero con el uso de Datastore intacto.
En este instructivo, se muestran 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
- (Re)Implementa y valida la app de referencia
Con estos pasos, te aseguras de comenzar a trabajar con código.
1. Configura el proyecto
Si completaste el codelab del módulo 1, te recomendamos que vuelvas a usar ese mismo proyecto (y código). Como alternativa, crea un proyecto de Cloud completamente nuevo o reutiliza 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 de 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 repositorio. Ya sea que uses el tuyo o el nuestro, comenzaremos en el código del módulo 1. En este codelab, se explica cada paso y se concluye con un código similar al que se encuentra en la carpeta del repositorio del módulo 7 “FINISH”.
- INICIO: Carpeta del módulo 1 (Python 2)
- FIN: Carpeta del módulo 1b (Python 3)
- Repositorio completo (para clonar o descargar un archivo ZIP)
Independientemente de la app del Módulo 1 que uses, la carpeta debería tener el siguiente aspecto, posiblemente con una carpeta lib
:
$ 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
lib
si hay una y ejecutapip install -t lib -r requirements.txt
para volver a propagarlib
. Es posible que debas usar el comandopip2
en su lugar si tienes instalados Python 2 y 3. - Asegúrate de haber instalado e 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 project
PROJECT_ID
si no quieres ingresar tuPROJECT_ID
con cada comandogcloud
emitido. - Implementa la app de ejemplo con
gcloud app deploy
- Confirma que la app del Módulo 1 se ejecute como se espera sin problemas y muestre las visitas más recientes (como se ilustra a continuación).
4. Actualizar configuración
Una vez que ejecutes correctamente esos pasos y veas que tu app web funciona, tendrás todo listo para portar esta app a Python 3, comenzando por la configuración.
Agrega el SDK a requirements.txt.
El entorno de ejecución de Python 3 de App Engine reduce de manera significativa la sobrecarga que se genera por el uso de bibliotecas de terceros. Todo lo que necesitas es agregar una lista en requirements.txt
. Para usar los servicios en paquete en Python 3, agrégale el paquete del SDK de App Engine, appengine-python-standard
. El paquete del SDK se une a Flask del módulo 1:
flask
appengine-python-standard
Actualiza app.yaml
Sigue los pasos que se indican a continuación para aplicar los cambios de configuración a tu archivo app.yaml
:
- Reemplaza la directiva
runtime
por la versión compatible de Python 3. Por ejemplo, especificapython310
para Python 3.10. - Borra las directivas
threadsafe
yapi_version
, ya que ninguna se usa en Python 3. - Borra la sección
handlers
por completo, ya que esta app solo tiene controladores de secuencia de comandos. Si tu app tiene controladores de archivos estáticos, déjalos intactos enhandlers
. - El entorno de ejecución de Python 3 no es compatible con las bibliotecas de terceros integradas, como lo hace el entorno de ejecución de Python 2. Si tu app tiene una sección
libraries
enapp.yaml
, borra toda la sección. (Los paquetes obligatorios solo deben enumerarse enrequirements.txt
como las bibliotecas no integradas). Nuestra app de ejemplo no tiene una secciónlibraries
, así que continúa con el siguiente paso. - Crea una directiva
app_engine_apis
configurada comotrue
para usarla, lo que equivale a agregar el paquete del SDK de App Engine arequirements.txt
más arriba.
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 estar enumerados en requirements.txt
, a menos que tengas algo especial en appengine_config.py
, no es necesario, así que bórralo. Del mismo modo, debido a que todas las bibliotecas de terceros se instalan automáticamente durante el proceso de compilación, no hay necesidad de copiarlas ni proporcionarlas, lo que significa que no tendrás que usar más comandos pip install
ni carpetas lib
, por lo que debes borrarlos. Resumen:
- Borrar
appengine_config.py
archivo - Borrar
lib
carpeta
Aquí concluye 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 empaquetados disponibles en el entorno de ejecución de Python 3, se requiere un fragmento breve de código que une el objeto de la aplicación Interfaz de puerta de enlace del servidor web (WSGI) en main.py
. La función del wrapper es google.appengine.api.wrap_wsgi_app()
. Para usarla, impórtala y une tu objeto WSGI con ella. Realiza los cambios que se indican a continuación para reflejar la actualización obligatoria de 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 a fin de ver ejemplos de unión de WSGI para otros frameworks de Python.
Si bien este ejemplo funciona para darle a tu app acceso a la mayoría de los servicios agrupados en Python 3, otros como Blobstore y Mail requieren código adicional. Abordaremos esos ejemplos en otro módulo sobre migración.
Con esto concluye todos los cambios necesarios para agregar el uso de servicios en paquetes de App Engine a la app de ejemplo 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 aparte de lo que ya hiciste en la configuración. El paso final es implementar esta aplicación modificada en el entorno de ejecución de Python 3 de App Engine de nueva generación y confirmar que las actualizaciones se realizaron correctamente.
6. Resumen/limpieza
En esta sección, se finaliza este codelab implementando la app y verificando que funcione según lo previsto y en cualquier resultado reflejado. Después de validar la app, realiza una limpieza y considera los pasos siguientes.
Implementa y verifica la aplicación
Implementa la app de Python 3 con gcloud app deploy
y confirma que la app funcione como en Python 2. Ninguna de las funciones 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 está en la carpeta del módulo 1b (FINALIZAR). Si diste un error en el camino, haz los ajustes necesarios.
- Compara el Módulo 0
main.py
en paralelo con el Módulo 1bmain.py
en esta página si tu app aún usawebapp2
. Luego, realiza el codelab del Módulo 1 para aprender a migrar dewebapp2
a Flask.
Felicitaciones por dar el primer paso para migrar tus apps de Python 2 de App Engine a Python 3 y, al mismo tiempo, conservar su uso de los servicios en paquetes.
Limpia
General
Si ya terminaste, te recomendamos que inhabilites la aplicación de App Engine para evitar que se te facture. Sin embargo, si deseas probar o experimentar un poco más, la plataforma de App Engine tiene una cuota gratuita y, siempre y cuando no superes ese nivel de uso, no se te debería cobrar. Eso es para procesamiento, pero es posible que también se apliquen cargos por servicios relevantes de App Engine, así que consulta la página de precios para obtener más información. Si esta migración implica otros servicios de Cloud, estos se facturan por separado. En ambos casos, si corresponde, consulta la sección "Específico de este codelab" a continuación.
Para una divulgación completa, la implementación en una plataforma de procesamiento 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 ocupa parte de esa cuota. 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. “Carpetas” específicas de Cloud Storage que debes revisar incluyen
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
*; por ejemplo, "us
" si tu app está alojada en EE.UU.
Por otro lado, si no vas a continuar con esta aplicación o algún otro codelab de migración relacionado y quieres borrar todo por completo, cierra tu proyecto.
Información específica de 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 de 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
Desde aquí, hay varias direcciones para seguir:
- Actualiza el código con servicios agrupados que requieren más cambios de código
- Migra de servicios agrupados a productos independientes de Cloud
- Migra de App Engine a otra plataforma sin servidores en la nube
Para acceder a otros servicios en paquetes, como Blobstore, Mail y Deferred, se requieren más cambios en el código. Los módulos de migración que se enfocan en alejarse de los servicios en paquetes heredados de App Engine que se deben considerar incluyen los siguientes:
- Módulo 2: App Engine NDB a Cloud NDB
- Módulos del 7 al 9: TaskQueue de App Engine (tareas push) a Cloud Tasks
- Módulos del 12 al 13: Memcache de App Engine a Cloud Memorystore
- Módulos del 15 al 16: De Blobstore de App Engine a Cloud Storage
- Módulos del 18 al 19: TaskQueue de App Engine (de extracción de tareas) a Cloud Pub/Sub
App Engine ya no es la única plataforma sin servidores en Google Cloud. Si tienes una aplicación pequeña de App Engine o una con funcionalidad limitada y deseas convertirla en un microservicio independiente, o si deseas dividir una aplicación monolítica en varios componentes reutilizables, estas son buenas razones para considerar cambiar a Cloud Functions. Si la creación de contenedores se volvió parte del flujo de trabajo de desarrollo de tu aplicación, en especial si consta de una canalización de CI/CD (integración continua/entrega o implementación continuas), considera migrar a Cloud Run. Estas situaciones 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 alojar tu app en contenedores con Docker, o el Módulo 5 para hacerlo sin contenedores, conocimiento sobre Docker ni
Dockerfile
.
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, puedes acceder a todo el contenido de Serverless Migration Station (codelabs, videos, código fuente [si está disponible]) a través de su repositorio de código abierto. El README
del repositorio 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 incluyen recursos adicionales para los desarrolladores que exploran este módulo o uno relacionado, así como productos relacionados. Esto incluye lugares donde enviar comentarios sobre este contenido, vínculos al código y varios documentos que pueden resultarte útiles.
Problemas o comentarios sobre el codelab
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, encontrarás los vínculos a las carpetas de repositorio del Módulo 1 (COMENZAR) y Módulo 1b (FINALIZAR). También se puede acceder a ellas desde el repositorio de todas las migraciones del codelab de App Engine.
Codelab | Python 2 | Python 3 |
N/A | ||
Módulo 17 (este codelab) | N/A | código (mod1b-flask) |
Recursos en línea
A continuación, hay recursos en línea que pueden ser relevantes para este tutorial:
Servicios empaquetados de App Engine
- Accede a los servicios en paquetes en el entorno de ejecución de nueva generación de Python 3
- Comparación en paralelo de la app del módulo 0 (Python 2) con la app del Módulo 1b (Python 3)
- Muestras 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 nueva generación (2021)
Documentación general de App Engine
- Documentación de App Engine
- Entorno de ejecución de App Engine (entorno estándar) para Python 2
- Usa las bibliotecas integradas de App Engine en Python 2 de App Engine
- Entorno de ejecución de App Engine (entorno estándar) para Python 3
- Diferencias entre Python 2 y 3 entornos de ejecución de App Engine (entorno estándar)
- Guía de migración de Python 2 a 3 de App Engine (entorno estándar)
- Información de precios y cuotas de App Engine
- Lanzamiento de la plataforma de 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 Cloud
- Python en Google Cloud Platform
- Bibliotecas cliente de Python de Google Cloud
- Google Cloud “Siempre gratuito” nivel
- SDK de Google Cloud (herramienta de línea de comandos de
gcloud
) - Toda la documentación de Google Cloud
Videos
- Estación de migración sin servidores
- 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.