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

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

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. 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:

  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. (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”.

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:

  1. Borra la carpeta lib si hay una y ejecuta pip install -t lib -r requirements.txt para volver a propagar lib. Es posible que debas usar el comando pip2 en su lugar si tienes instalados Python 2 y 3.
  2. Asegúrate de haber instalado e 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 emitido.
  4. Implementa la app de ejemplo con gcloud app deploy
  5. 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).

a7a9d2b80d706a2b.png

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:

  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 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 en handlers.
  4. 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 en app.yaml, borra toda la sección. (Los paquetes obligatorios solo deben enumerarse en requirements.txt como las bibliotecas no integradas). Nuestra app de ejemplo no tiene una sección libraries, así que continúa con el siguiente paso.
  5. Crea una directiva app_engine_apis configurada como true para usarla, lo que equivale a agregar el paquete del SDK de App Engine a requirements.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:

a7a9d2b80d706a2b.png

Notas finales

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:

Próximos pasos

Desde aquí, hay varias direcciones para seguir:

  1. Actualiza el código con servicios agrupados que requieren más cambios de código
  2. Migra de servicios agrupados a productos independientes de Cloud
  3. 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:

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

Módulo 1

código

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

Documentación general de App Engine

Otra información de Cloud

Videos

Licencia

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