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.
Hay situaciones en las que no tienes una "app completa" requerir los recursos de App Engine o Cloud Run. Si tu código consta solo de un microservicio o una función simple, es probable que Cloud Functions sea la mejor opción. En este codelab, aprenderás a migrar apps simples de App Engine (o dividir apps más grandes en varios microservicios) y, luego, implementarlas en Cloud Functions, otra plataforma sin servidores creada específicamente para casos de uso como este.
En un próximo lab,
- Uso de Cloud Shell
- Habilita la API de Google Cloud Translation
- Autentica solicitudes a la API
- Convierte una app pequeña de App Engine para que se ejecute en Cloud Functions
- Implementa tu código en Cloud Functions
Requisitos
- Un proyecto de Google Cloud Platform 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 2 Cloud NDB para Python 3 que funcione
- Recomendación: Completa el codelab del módulo 2 y el paso adicional de portabilidad de la app de Python 2 a 3
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
Los sistemas de PaaS, como Google App Engine y Cloud Functions, proporcionan muchos beneficios a los usuarios. Estas plataformas sin servidores permiten que tu equipo técnico se enfoque en crear soluciones empresariales en lugar de dedicar tiempo a investigar plataformas para usar y determinar la cantidad de hardware necesario. Las aplicaciones pueden aumentar la escala automáticamente según sea necesario, reducir la escala verticalmente a cero con la facturación de pago por uso para controlar los costos y permitir una variedad de lenguajes de desarrollo comunes de hoy en día.
Sin embargo, si bien el desarrollo de aplicaciones web de pila completa o los backends complejos para aplicaciones para dispositivos móviles son excelentes opciones para App Engine, los desarrolladores suelen intentar poner en línea algunas funciones, como actualizar un feed de noticias o obtener la puntuación más reciente de la eliminatoria del equipo local. Si bien la lógica de programación existe para ambas situaciones, ninguna parece ser una “aplicación” completa que requieren la potencia de App Engine. Aquí es donde Cloud Functions cobra importancia.
Cloud Functions sirve para implementar la porción pequeña de código que hace lo siguiente:
- No es parte de toda la aplicación.
- No se necesitan en toda una pila de desarrollo.
- Se encuentra en una aplicación o un backend de una sola aplicación para dispositivos móviles que se enfoca en un aspecto
También puedes usar Cloud Functions para dividir una aplicación monolítica grande en varios microservicios, cada uno con una base de datos común compartida, como Cloud Firestore o Cloud SQL. Si quieres alojar tu función o microservicio en un contenedor y que se ejecute sin servidores en Cloud Run, también puedes hacerlo.
Nuestra aplicación de muestra de App Engine que ha aparecido en casi todos los instructivos de migración es una aplicación corta con funcionalidad básica que funciona igual de bien en Cloud Functions. En este instructivo, aprenderás a modificar esa app para que se ejecute en Cloud Functions. Desde la perspectiva de App Engine, debido a que las funciones son más simples que las apps completas, tu experiencia de inicio debería ser más fácil (y más rápida) y con menos “sobrecarga” en general. Esta migración incluye los siguientes pasos:
- Configurar/trabajo previo
- Quita los archivos de configuración
- Modifica archivos de la aplicación
3. Configurar/trabajo previo
Este codelab comienza con la versión de Python 3 de la app de ejemplo de App Engine de Cloud NDB del módulo 2 porque Cloud Functions no es compatible con Python 2. Primero, configuraremos nuestro proyecto, obtener el código y, luego, implementar la app de referencia para confirmar que empezamos con el código que funciona.
1. Configura el proyecto
Si completaste el codelab del Módulo 2 (y lo transferiste a Python 3), te recomendamos que vuelvas a usar ese mismo proyecto (y código). Como alternativa, puedes crear un proyecto completamente nuevo o reutilizar otro proyecto existente. Asegúrate de que el proyecto tenga una cuenta de facturación activa con el servicio de App Engine habilitado.
2. Obtén app de ejemplo del modelo de referencia
Uno de los requisitos previos de este codelab es tener una app de ejemplo del Módulo 2 que funcione. Si no tienes uno, completa cualquiera de los instructivos vinculados anteriormente antes de continuar con este paso. De lo contrario, si ya conoces su contenido, puedes comenzar por tomar el código del módulo 2 que aparece a continuación.
Ya sea que uses el tuyo o el nuestro, comenzaremos en el código de Python 3 del módulo 2. En este codelab del módulo 11, se explica cada paso y se concluye con un código similar al que hay en la carpeta del repositorio del módulo 11 (FINISH).
- INICIO: Código del módulo 2 (3.x [carpeta del repositorio del módulo 2b])
- FIN: Código del módulo 11 (3.x)
- Repositorio completo (para clonar o descargar el archivo ZIP)
El directorio de los archivos STARTing del módulo 2 de Python 3 (tuyos o los nuestros) debería verse de la siguiente manera:
$ ls README.md main.py templates app.yaml requirements.txt
3. (vuelve a) implementa la aplicación de modelo de referencia
Los pasos del trabajo previo restantes para ejecutar ahora sin estos:
- Familiarízate con la herramienta de línea de comandos de
gcloud
- Vuelve a implementar la app de muestra con
gcloud app deploy
- Confirma que la app se ejecuta en App Engine sin problemas
Una vez que hayas ejecutado correctamente esos pasos, estarás listo para convertirla en una Cloud Function.
4. Quita los archivos de configuración
El archivo app.yaml
es un artefacto de App Engine que no se usa con Cloud Functions, así que bórralo ahora. Si olvida hacerlo, no hay problema, ya que Cloud Functions no lo usa. Ese es el único cambio de configuración, ya que requirements.txt
permanece idéntico al del módulo 2.
Si también transferirás una app de App Engine de Python 2 a Python 3, borra appengine_config.py
y la carpeta lib
, si tienes una. Son artefactos de App Engine que no se usan en el entorno de ejecución de Python 3.
5. Modifica archivos de la aplicación
Solo hay un archivo de aplicación, main.py
, por lo que todos los cambios necesarios para migrar a Cloud Functions se producirán en este archivo.
Importaciones
Debido a que solo trabajamos con funciones, no hay necesidad de un framework de aplicación web. Sin embargo, para tu conveniencia, cuando se llama a Cloud Functions basadas en Python, se les pasa automáticamente un objeto de solicitud para que tu código lo use según sea necesario. (El equipo de Cloud Functions lo seleccionó para que sea un objeto Request de Flask que se pasó a su función).
Debido a que los frameworks web no forman parte del entorno de Cloud Functions, no hay importaciones de Flask, a menos que tu app use otras funciones de Flask. Este es nuestro caso, ya que la renderización de plantillas todavía se realiza después de la conversión a una función, lo que significa que aún se requiere una llamada a flask.render_template()
y, por lo tanto, su importación desde Flask. Como no hay un framework web, no es necesario crear una instancia de una app de Flask, por lo que debes borrar app = Flask(__name__)
. Antes y después de aplicar los cambios, tu código se verá de la siguiente manera:
ANTES:
from flask import Flask, render_template, request
from google.cloud import ndb
app = Flask(__name__)
ds_client = ndb.Client()
DESPUÉS:
from flask import render_template
from google.cloud import ndb
ds_client = ndb.Client()
Si dependes del objeto de la app (app
) o de cualquier otra infraestructura de framework web, debes resolver todas esas dependencias, encontrar soluciones alternativas adecuadas, quitar su uso por completo o buscar proxies. Solo entonces podrás convertir tu código en una Cloud Function. De lo contrario, te recomendamos que permanezcas en App Engine o alojas tu app en contenedores para Cloud Run.
Actualiza la firma de la función del controlador principal
Los cambios requeridos en la firma de la función son los siguientes:
- Flask ya no se usa después de convertir la aplicación en una Cloud Function, por lo que debes quitar los decoradores de ruta.
- Cloud Functions pasa automáticamente el objeto
Request
de Flask como parámetro, por lo que debes crear una variable para él. En nuestra app de ejemplo, la llamaremosrequest
. - Las funciones de Cloud Functions implementadas deben tener un nombre. Nuestro controlador principal recibió el nombre adecuado
root()
en App Engine para describir qué era (el controlador de aplicación raíz). Como Cloud Function, tiene menos sentido usar ese nombre. En su lugar, implementaremos la Cloud Function con el nombrevisitme
, así que úsala también como el nombre de la función de Python. De manera similar, en los módulos 4 y 5, también le asignamos el nombrevisitme
al servicio de Cloud Run.
A continuación, te mostramos el antes y el después de estas actualizaciones:
ANTES:
@app.route('/')
def root():
'main application (GET) handler'
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10)
return render_template('index.html', visits=visits)
DESPUÉS:
def visitme(request):
'main application (GET) handler'
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10)
return render_template('index.html', visits=visits)
Con esto concluye todas las actualizaciones necesarias. Ten en cuenta que los cambios solo afectaron la "infraestructura" de la aplicación código. No se necesitaban cambios en el código principal de la aplicación y no se alteró ninguna funcionalidad de la app. A continuación, se incluye una representación visual de los cambios que se realizaron para ilustrar este punto:
Desarrollo y pruebas locales
Mientras que App Engine tiene el servidor de desarrollo local dev_appserver.py
, Cloud Functions tiene su Functions Framework. Con este framework, puedes desarrollar y probar a nivel local. El código se puede implementar en Cloud Functions, pero también en otras plataformas de procesamiento, como Compute Engine, Cloud Run o incluso sistemas de nube híbrida o locales que admitan Knative. Consulta los siguientes vínculos adicionales a Functions Framework.
6. Compila e implementa
La implementación en Cloud Functions difiere un poco de App Engine. Como no se usan archivos de configuración fuera de requirements.txt
, se debe especificar más información sobre el código en la línea de comandos. Implementa tu nueva Cloud Function activada por HTTP que se ejecuta en Python 3.10 con este comando:
$ gcloud functions deploy visitme --runtime python310 --trigger-http --allow-unauthenticated
Espera un resultado similar al siguiente:
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/f5f6fc81-1bb3-4cdb-8bfe?project=PROJECT_ID Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 buildId: f5f6fc81-1bb3-4cdb-8bfe buildName: projects/PROJECT_ID/locations/REGION/builds/f5f6fc81-1bb3-4cdb-8bfe dockerRegistry: CONTAINER_REGISTRY entryPoint: visitme httpsTrigger: securityLevel: SECURE_OPTIONAL url: https://REGION-PROJECT_ID.cloudfunctions.net/visitme ingressSettings: ALLOW_ALL labels: deployment-tool: cli-gcloud name: projects/PROJECT_ID/locations/REGION/functions/visitme runtime: python310 serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com sourceUploadUrl: https://storage.googleapis.com/uploads-853031211983.REGION.cloudfunctions.appspot.com/8c923758-cee8-47ce-8e97-5720a5301c34.zip status: ACTIVE timeout: 60s updateTime: '2022-05-16T18:28:06.153Z' versionId: '8'
Después de que se implemente la función, usa la URL del resultado de la implementación y visita tu app. La URL tiene el formato REGION-PROJECT_ID.cloudfunctions.net/visitme
. El resultado debería ser idéntico al de la implementación anterior en App Engine:
Al igual que con la mayoría de los demás codelabs y videos de la serie, la funcionalidad de referencia de la app no cambia. El propósito es aplicar una técnica de modernización y hacer que la app funcione exactamente como antes, pero con la tecnología de infraestructura más nueva, por ejemplo, migrar de un servicio heredado de App Engine antiguo a su producto independiente de Cloud de reemplazo o, como en el caso de este instructivo, trasladar una app a otra plataforma sin servidores de Google Cloud.
7. Resumen/limpieza
Felicitaciones por convertir esta pequeña aplicación de App Engine en una Cloud Function. Otro caso de uso adecuado es dividir una aplicación monolítica grande de App Engine en una serie de microservicios, cada uno como una Cloud Function. Esta es una técnica de desarrollo más moderna, que genera un modelo más "plug-and-play" componente (a la "pila de JAM"). Permite mezclar, hacer coincidir y reutilizar código, que son dos objetivos, pero otro beneficio es que estos microservicios se seguirán depurando con el tiempo, lo que significa código estable y menores costos de mantenimiento en general.
Limpia
Después de completar este codelab, puedes inhabilitar la app del Módulo 2 de App Engine (de manera temporal o permanente) para evitar que se te facture. La plataforma de App Engine tiene una cuota gratuita, por lo que no se te facturará mientras permanezcas dentro de su nivel de uso. Lo mismo se aplica a Datastore: consulta la página de precios de Cloud Datastore para obtener más detalles.
La implementación en plataformas como App Engine y Cloud Functions genera costos menores de compilación y almacenamiento. En algunas regiones, Cloud Build tiene su propia cuota gratuita, al igual que Cloud Storage. Las compilaciones consumen una parte de esa cuota. Ten en cuenta el uso del almacenamiento para minimizar los posibles costos, especialmente si tu región no cuenta con este nivel gratuito.
Desafortunadamente, Cloud Functions no tiene un . Crea una copia de seguridad de tu código y simplemente borra la función. Puedes volver a implementarla con el mismo nombre más adelante. Sin embargo, si no vas a continuar con ningún otro codelab de migración y deseas borrar todo por completo, cierra tus proyectos de Cloud.
Próximos pasos
Más allá de este instructivo, otros módulos de migración que puedes analizar incluyen la creación de contenedores para tu app de App Engine para Cloud Run. Consulta los vínculos a los codelabs de los módulos 4 y 5:
- Módulo 4: Migra a Cloud Run con Docker
- Organiza tu aplicación en contenedores para que se ejecute en Cloud Run con Docker
- Esta migración te permite permanecer en Python 2.
- Módulo 5: Migra a Cloud Run con Cloud Buildpacks
- Crea contenedores para tu app a fin de que se ejecute en Cloud Run con paquetes de Cloud Build
- No necesitas conocer los detalles de Docker, contenedores, ni
Dockerfile
. - Requiere que tu app ya se haya migrado a Python 3 (Buildpacks no es compatible con Python 2).
Muchos de los otros módulos se enfocan en mostrar a los desarrolladores cómo migrar de los servicios en paquetes de App Engine a reemplazos independientes de Cloud:
- Módulo 2: migrar de
ndb
de App Engine a Cloud NDB - Módulos del 7 al 9: Migra de las tareas push de la lista de tareas en cola de App Engine a Cloud Tasks
- Módulos del 12 al 13: Migra de Memcache de App Engine a Cloud Memorystore
- Módulos del 15 al 16: Migra de Blobstore de App Engine a Cloud Storage
- Módulos del 18 al 19: Migra de la lista de tareas en cola de App Engine (tareas de extracción) a Cloud Pub/Sub.
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 en lugar de Cloud Functions. Consulta el Módulo 4 para alojar tu app en contenedores con Docker, o el Módulo 5 para hacerlo sin contenedores, conocimiento de Docker ni Dockerfile
. Ya sea que estés considerando usar Cloud Functions o Cloud Run, cambiar a otra plataforma sin servidores es opcional, y te recomendamos considerar 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.
8. Recursos adicionales
Problemas o comentarios de los Codelabs del módulo de migración de App Engine
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 8 (START) y el módulo 9 (FINISH). También puedes acceder a ellos desde el repositorio para todas las migraciones del codelab de App Engine. Puedes clonar o descargar un archivo ZIP.
Codelab | Python 3 |
Recursos en línea
A continuación, hay recursos en línea que pueden ser relevantes para este tutorial:
App Engine
- Documentación de App Engine
- Entorno de ejecución de App Engine (entorno estándar) para Python 2
- 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)
- Comparación primero y plataformas de segunda generación
- 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
Cloud Functions
- Comando gcloud functions deploy
- Información sobre los precios
- Anuncio de nueva generación de Cloud Functions
- Diferencias entre el primer y el funciones de segunda generación
- Instructivo, documentos de uso y repositorio de Functions Framework (desarrollo local)
- Páginas de productos
- Documentación
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.