<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hernán Villavicencio S</title>
    <description>The latest articles on DEV Community by Hernán Villavicencio S (@villavih).</description>
    <link>https://dev.to/villavih</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1993776%2Ff2c6e9c5-143e-42f5-9651-6c93418d4802.png</url>
      <title>DEV Community: Hernán Villavicencio S</title>
      <link>https://dev.to/villavih</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/villavih"/>
    <language>en</language>
    <item>
      <title>Despliega como Senior, paga como estudiante</title>
      <dc:creator>Hernán Villavicencio S</dc:creator>
      <pubDate>Fri, 07 Aug 2026 20:24:14 +0000</pubDate>
      <link>https://dev.to/villavih/despliega-como-senior-paga-como-estudiante-2gjn</link>
      <guid>https://dev.to/villavih/despliega-como-senior-paga-como-estudiante-2gjn</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;Serverless en Google Cloud: Cloud Functions + Firestore + Cloud Storage con Terraform&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si vienes del mundo AWS y siempre quisiste probar Google Cloud sin gastar un centavo, este post es para ti. Vamos a levantar una API serverless completa: con base de datos, frontend y todo automatizado con Terraform, que corre dentro del Free Tier de GCP. Cero servidores que administrar, cero facturas sorpresa.&lt;/p&gt;

&lt;p&gt;La idea es simple: montar una app de tareas (una “to-do list”) donde el backend es una función serverless, los datos viven en una base NoSQL administrada, y el frontend es un archivo estático servido desde el equivalente de S3. Todo desplegado con un terraform apply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El mapa mental: de AWS a GCP&lt;/strong&gt;&lt;br&gt;
Lo mejor para aprender una nube nueva es anclarla a la que ya conoces. Si has trabajado con el stack serverless de AWS, estas son las equivalencias directas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0lgsc2iy0k4xbdj0p4ii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0lgsc2iy0k4xbdj0p4ii.png" width="579" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La arquitectura completa cabe en un diagrama de tres cajas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftoffbgt3dlrtkjcc38lr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftoffbgt3dlrtkjcc38lr.png" width="391" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y así se ve con los servicios reales de Google Cloud:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ou91nw3q4dyzwcp5u9u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ou91nw3q4dyzwcp5u9u.png" width="800" height="670"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Arquitectura serverless en GCP: el navegador consume el frontend desde Cloud Storage y la API desde Cloud Functions Gen 2, que lee y escribe en Firestore, corre sobre Cloud Run, se autentica con una Service Account y envía logs a Cloud Logging.&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Costo total: $0&lt;/strong&gt;. Todo entra en el Free Tier de GCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lo que necesitas antes de empezar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkxpxn9yr9b6704gfuweo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkxpxn9yr9b6704gfuweo.png" width="647" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un detalle importante que a muchos los frena en el primer despliegue: &lt;strong&gt;aunque todo caiga en el Free Tier, GCP exige tener una cuenta de facturación vinculada al proyecto&lt;/strong&gt; para poder crear Cloud Functions, Firestore y usar Cloud Build. No te van a cobrar por el consumo del demo, pero el billing debe estar habilitado. Al crear tu cuenta en el Free Tier obtienes además $300 de crédito para tus primeros 90 días.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurar credenciales GCP&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Autenticarse con tu cuenta Google&lt;/span&gt;
gcloud auth login

&lt;span class="c"&gt;# 2. Crear o seleccionar un proyecto&lt;/span&gt;
gcloud projects create mi-proyecto-serverless   &lt;span class="c"&gt;# o usa uno existente&lt;/span&gt;
gcloud config &lt;span class="nb"&gt;set &lt;/span&gt;project mi-proyecto-serverless

&lt;span class="c"&gt;# 3. Habilitar credenciales para Terraform (Application Default Credentials)&lt;/span&gt;
gcloud auth application-default login

&lt;span class="c"&gt;# 4. Verificar que funciona&lt;/span&gt;
gcloud config get-value project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terraform usa las Application Default Credentials automáticamente: no necesitas crear ni descargar claves JSON. Es más limpio y más seguro que andar rotando llaves de service account a mano.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desplegar en 3 comandos&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Entrar a la carpeta de Terraform&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;charla-serverless-gcp/demo/terraform

&lt;span class="c"&gt;# 2. Inicializar Terraform (descarga el provider de GCP)&lt;/span&gt;
terraform init

&lt;span class="c"&gt;# 3. Desplegar toda la infraestructura&lt;/span&gt;
terraform apply &lt;span class="nt"&gt;-var&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"gcp_project_id=TU_PROJECT_ID"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terraform se encarga de todo: habilita las APIs necesarias (Cloud Functions, Cloud Build, Firestore, Cloud Run, Artifact Registry), crea la base de datos, la service account con sus permisos, los buckets y la función.&lt;/p&gt;

&lt;p&gt;Al terminar, imprime las URLs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;      = &lt;span class="s2"&gt;"https://tasks-demo-api-xxxx-uc.a.run.app/tasks"&lt;/span&gt;
&lt;span class="n"&gt;frontend_url&lt;/span&gt; = &lt;span class="s2"&gt;"https://storage.googleapis.com/tasks-demo-frontend-xxxx/index.html"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abres el frontend_url en el navegador y ya tienes la app funcionando.&lt;/p&gt;

&lt;p&gt;Un dato del mundo real: el primer despliegue de la Cloud Function tarda alrededor de 3 minutos y medio. No es que se haya colgado, es Cloud Build compilando tu código en la nube. Esa es una de las diferencias que se sienten viniendo de Lambda, donde subes un ZIP y arranca casi al instante. Aquí ganas un runtime más flexible y mejor manejo de dependencias, a cambio de un build inicial más lento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Probar la API&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://tasks-demo-api-xxxx-uc.a.run.app"&lt;/span&gt;

&lt;span class="c"&gt;# Crear una tarea&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/tasks"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"title": "Mi primera tarea serverless en GCP ☁️"}'&lt;/span&gt;

&lt;span class="c"&gt;# Listar tareas&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/tasks"&lt;/span&gt;
Respuesta del POST:
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"76f1b416-5934-4851-ad95-014490eda3b7"&lt;/span&gt;,
  &lt;span class="s2"&gt;"title"&lt;/span&gt;: &lt;span class="s2"&gt;"Mi primera tarea serverless en GCP ☁️"&lt;/span&gt;,
  &lt;span class="s2"&gt;"completed"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
  &lt;span class="s2"&gt;"created_at"&lt;/span&gt;: &lt;span class="s2"&gt;"2026-08-06T17:42:20.555504+00:00"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La tarea queda persistida en Firestore y el GET la devuelve. API serverless funcional, de punta a punta, sin haber tocado un solo servidor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Las diferencias que se sienten viniendo de AWS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Routing más simple&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
En AWS necesitabas API Gateway con sus recursos, métodos e integraciones. En GCP, Cloud Functions Gen 2 expone una URL HTTPS directamente y el routing lo hace tu propio código Python. Menos piezas de infraestructura que mantener.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Sin módulos por cada método HTTP&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
El Terraform de AWS solía tener módulos para lambda_method y cors_options por cada endpoint. En GCP no existe ese concepto: una sola función maneja todos los métodos (GET, POST, etc.) y el CORS lo resuelves en el código o en el bucket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Firestore vs DynamoDB&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
DynamoDB te pide definir hash_key y el billing_mode. Firestore trabaja con colecciones y documentos sin esquema, sin configuración de capacidad. Escribes y lees; la escala la maneja Google.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Cloud Run por debajo&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Las Cloud Functions Gen 2 corren sobre Cloud Run internamente. Por eso el endpoint termina siendo una URL *.run.app y no una cloudfunctions.net. Esto te da, gratis, mejor cold start, concurrencia por instancia y la posibilidad de migrar a contenedores el día que lo necesites.&lt;/p&gt;

&lt;p&gt;Limpiar todo al terminar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform destroy &lt;span class="nt"&gt;-var&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"gcp_project_id=TU_PROJECT_ID"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En cerca de un minuto borra todo. Un detalle con Firestore: la base de datos (default) es única por proyecto y por defecto Terraform la “abandona” (deletion_policy = ABANDON) en lugar de borrarla. Si quieres que el destroy también elimine la base —útil si vas a repetir el demo desde cero en el mismo proyecto— pon deletion_policy = "DELETE" en el recurso google_firestore_database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El repositorio&lt;/strong&gt;&lt;br&gt;
Todo el código, el handler.py de la función, el frontend, y el módulo de Terraform completo, está en GitHub para que lo clones, lo despliegues y lo adaptes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/VillaviH/charla-serverless-gcp" rel="noopener noreferrer"&gt;https://github.com/VillaviH/charla-serverless-gcp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La estructura es mínima y fácil de leer:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fremf9zp359o640i4bamf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fremf9zp359o640i4bamf.png" width="647" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para cerrar&lt;/strong&gt;&lt;br&gt;
Serverless no tiene por qué ser caro ni complicado, y no está atado a una sola nube. Si ya dominas el stack de AWS, GCP te resulta familiar en un par de horas: los conceptos son los mismos, cambian los nombres y algunos detalles de implementación. La mejor forma de aprenderlo es exactamente esta, desplegar algo real, probarlo, y destruirlo sin miedo a la factura.&lt;/p&gt;

&lt;p&gt;Clona el repo, levántalo en tu propia cuenta y cuéntame cómo te fue. Y si vas a llevar esto a producción, recuerda cerrar los accesos públicos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Despliega como senior, paga como estudiante.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hernán Villavicencio - AWS Community Builder - linkedin.com/in/hvillavicencio&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Actualización de AWS WAF generado por un template de CloudFormation</title>
      <dc:creator>Hernán Villavicencio S</dc:creator>
      <pubDate>Wed, 10 Dec 2025 20:26:58 +0000</pubDate>
      <link>https://dev.to/villavih/actualizacion-de-aws-waf-generado-por-un-stack-de-cloudformation-3c89</link>
      <guid>https://dev.to/villavih/actualizacion-de-aws-waf-generado-por-un-stack-de-cloudformation-3c89</guid>
      <description>&lt;p&gt;&lt;strong&gt;El problema:&lt;/strong&gt;&lt;br&gt;
• Alerta por correo y en el panel de AWS Health Dashboard.&lt;br&gt;
• El 15 de diciembre del 2025 finaliza el ciclo de vida de soporte de la versión 3.9 de python que utilizan las funciones lambdas que son generadas cuando se levanta el servicio de AWS WAF mediante el stack de cloudformation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arquitectura intervenida&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bbfz2pqyjjpmk6n3t28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bbfz2pqyjjpmk6n3t28.png" alt=" " width="798" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Análisis del problema&lt;/strong&gt;&lt;br&gt;
• Se descargo y reviso los template del stack de cloudformation del servicio AWS WAF levantado en la arquitectura mencionada.&lt;br&gt;
• De la revisión efectuada se puede observar en los template que el runtime de python de las funciones lambdas se crearon con python 3.8.&lt;br&gt;
• En la consola de aws las funciones lambdas muestran en el runtime la version de python 3.9, esto entendemos que algún momento AWS realizo el trabajo de actualización de las funciones una vez que finalizo el ciclo de vida del soporte, pero no se realizo la actualización en los template del  stack de cloudformation, por lo tanto en la consola de aws se observaba en “draft”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solución:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primero descargue los template del stack de cloudformation y los guardamos en formato yml, como se muestra en la figura:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zces4azt2gbp6busp0o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zces4azt2gbp6busp0o.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilizando KIRO modificamos el archivo principal del stack, reemplanzado en el parametro “Runtime: python3.8” por la versión 3.12, tal como se muestra en la figura:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft5dmq7wdpmvvb30734jk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft5dmq7wdpmvvb30734jk.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para actualizar el template en el stack del Cloudformation escogí la opción “Make a direct update”, como se muestra en la figura:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuitqoqfzynggqr19blkg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuitqoqfzynggqr19blkg.png" alt=" " width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En la siguiente pantalla escogemos primero la opción “Replace existing template” y luego especificamos el archivo del template modificado en la opción “Upload a template file” y damos click en el botón “Next”, como se muestra en la figura:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxknowz6x9m99z6b76hjd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxknowz6x9m99z6b76hjd.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ahora en la siguiente ventana en mi caso deje como estaban los detalles del stack sin modificar nada y para seguir damos click en el botón “next”, tal como se muestra en la figura:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef4fd7tnwo7xpzmaw58v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef4fd7tnwo7xpzmaw58v.png" alt=" " width="799" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En este paso no modificamos nada, excepto en la parte final que debemos marcar los check la opción “Capabilities” y dar click en el botón “next”, como se muestra en la figura:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0d6lqltevncetw7kpx7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0d6lqltevncetw7kpx7h.png" alt=" " width="799" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5zaovm1f430jb2c5mp4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5zaovm1f430jb2c5mp4.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En esta última pantalla debemos revisar todo lo configurado y dar click en el boton “submit” para enviar a actualizar el stack de Cloudformation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frspo2vk0vz2ucmym6ws3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frspo2vk0vz2ucmym6ws3.png" alt=" " width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Luego de la actualización del stack completo en Cloudformation lo veremos de esta forma, tal como se muestra en la imagen:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fw6bepw4j8cvuybqd5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fw6bepw4j8cvuybqd5o.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para finalizar debemos revisar que efectivamente las funciones lambdas se esten ejecutando con el runtime python versión 3.12, tal como se muestra en la figura:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8spcdgxesratfnkbui3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8spcdgxesratfnkbui3j.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bibliografía&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/solutions/latest/security-automations-for-aws-waf/architecture-overview.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/solutions/latest/security-automations-for-aws-waf/architecture-overview.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/solutions/latest/security-automations-for-aws-waf/aws-cloudformation-templates.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/solutions/latest/security-automations-for-aws-waf/aws-cloudformation-templates.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
