# Tema 5 · 6 · Programar la ejecución con EventBridge (opcional) Presentación del Tema 5: «Ejercicio 2 · programar la ejecución con EventBridge» (iteración cada minuto, comandos de la regla y su borrado). Duración: 10 min. Coste: prácticamente nulo mientras la regla exista poco tiempo, pero **corre cada minuto mientras exista**: bórrala al terminar. ## Qué vas a hacer Vas a programar la función Lambda de tu variante del Ejercicio 2 para que se ejecute sola cada minuto, comprobarás que aparecen datos nuevos en el destino y, **muy importante**, borrarás la regla. Esta carpeta **no tiene ficheros**: solo comandos de AWS CLI que ejecutas en CloudShell. **Atajo:** el script de tu variante (carpetas 05.03, 05.04 y 05.05) hace estos mismos pasos por ti: `./gestionar-crypto-s3.sh programar` (o `3-...-dynamodb.sh` o `4-...-s3-rds.sh`; puedes indicar los minutos, por ejemplo `programar 5`) crea la regla, el permiso y el destino, y `desprogramar` los borra. Además, **la regla se apaga sola a las 4 horas** (ver *Apagado automático*), `estado` te dice si la regla sigue activa y cuánto le queda, y `eliminar` la quita siempre antes de borrar la función. Los comandos de abajo hacen exactamente lo mismo a mano (son los) y funcionan igual si prefieres verlos uno a uno. **Qué se crea en AWS:** una regla de Amazon EventBridge (`crypto-cada-minuto`), un permiso en la función Lambda para que la regla pueda invocarla (limitado a esa regla con `--source-arn`) y el destino que une regla y función. Lo borras al terminar. Una regla de EventBridge invoca tu función con una frecuencia fija. Los comandos de la presentación hacen lo mismo que los de esta carpeta: crean la regla, el permiso y el destino, y terminan borrando la regla (`remove-targets` y `delete-rule`). ## Qué contiene esta carpeta | Fichero | Para qué sirve | En qué paso se usa | |---|---|---| | `README.md` | Única pieza de esta carpeta: los comandos para crear y borrar la regla. No hay scripts ni plantillas propios (los de las carpetas 05.03, 05.04 y 05.05 ya incluyen `programar` y `desprogramar`). | Siempre | ## Antes de empezar - **Depende de una de estas carpetas, la que te haya tocado** (ya desplegada y funcionando): - [05.03 · CoinGecko a S3](05.03-cryptoas3/README.md): función `crypto-price-tracker`. - [05.04 · CoinGecko a DynamoDB](05.04-cryptoadynamodb/README.md): función `crypto-price-tracker-dynamodb`. - [05.05 · CoinGecko a S3 y RDS](05.05-cryptoas3yrds/README.md): función `crypto-price-tracker-rds` (y por tanto la infraestructura base de la [05.01](05.01-infraestructurabase/README.md)). - Región **eu-north-1 (Estocolmo)**. - No hay que subir ningún zip a CloudShell: no hay ficheros que subir. Abre CloudShell y pega los comandos. ## Paso a paso **1. Crea la regla, el permiso y el destino.** Cambia `FN` por la función de tu variante (`crypto-price-tracker`, `crypto-price-tracker-dynamodb` o `crypto-price-tracker-rds`): ```bash REGION=eu-north-1 FN=crypto-price-tracker-dynamodb RULE=crypto-cada-minuto ACC=$(aws sts get-caller-identity --query Account --output text) aws events put-rule --name $RULE --schedule-expression "rate(1 minute)" --region $REGION aws lambda add-permission --function-name $FN --statement-id ev-$RULE \ --action lambda:InvokeFunction --principal events.amazonaws.com \ --source-arn arn:aws:events:$REGION:$ACC:rule/$RULE --region $REGION aws events put-targets --rule $RULE \ --targets "Id=1,Arn=arn:aws:lambda:$REGION:$ACC:function:$FN" --region $REGION ``` **Qué verás:** `put-rule` devuelve el ARN de la regla, `add-permission` un bloque `Statement`, y `put-targets` `"FailedEntryCount": 0`. **2. Espera un par de minutos y comprueba el destino.** Debe haber datos nuevos: en el tipo 1, dos ficheros nuevos por minuto; en el 2, cinco ítems; en el 3, diez filas y dos ficheros. Por ejemplo, para el tipo 2: ```bash aws dynamodb scan --table-name cunef-etl-demo-crypto-prices --select COUNT \ --region eu-north-1 --query Count --output text ``` (Tipo 1: `aws s3 ls s3://$BUCKET/crypto/ --recursive --human-readable`; tipo 3: además `SELECT COUNT(*) FROM crypto.coins;` en Adminer.) También puedes ver las ejecuciones con `aws logs tail /aws/lambda/$FN --since 10m --region $REGION`. **3. Apágala en cuanto termines la demostración** (corre cada minuto mientras exista, y CoinGecko puede empezar a devolver 429 si hay muchos alumnos a la vez). Bórrala del todo, no solo la desactives: ```bash aws events remove-targets --rule $RULE --ids 1 --region $REGION aws events delete-rule --name $RULE --region $REGION ``` **Qué verás:** `remove-targets` devuelve `"FailedEntryCount": 0` y `delete-rule` no imprime nada. Si cerraste CloudShell y perdiste las variables, repite `REGION=eu-north-1` y `RULE=crypto-cada-minuto` antes. Para una frecuencia real usa `rate(1 hour)`. Las expresiones `cron(...)` de EventBridge van en **UTC**. ## Apagado automático Con el script de tu variante, `programar` se apaga sola a las 4 horas (`--horas N`, `--permanente`; `extender` amplía el plazo): la función lee su variable de entorno `APAGAR_TRAS` y, al vencer, **desactiva su propia regla** (sin borrarla). Está explicado en el README de tu carpeta (05.03, 05.04 o 05.05). **A mano no hay apagado automático:** una regla creada con los comandos de arriba corre para siempre. Límitala tú: - **Desactívala al terminar la demostración** (la regla sigue existiendo, pero deja de invocar la función) y reactívala si la necesitas: ```bash aws events disable-rule --name $RULE --region $REGION aws events enable-rule --name $RULE --region $REGION aws events describe-rule --name $RULE --region $REGION --query State --output text # ENABLED o DISABLED ``` - **Bórrala en la limpieza** (paso 3): una regla desactivada también hay que borrarla: sigue existiendo (y apuntando a tu función) hasta que lo hagas. - Si cierras CloudShell con la regla activa, **sigue activa**: antes de irte comprueba con `aws events list-rules --region eu-north-1 --query "Rules[].[Name,State]" --output text`. ## Errores frecuentes - **`Status 429` o `HTTP Error 429` en los logs o en el destino sin datos nuevos.** CoinGecko limita las peticiones (el límite es bajo: tras unas 5 seguidas desde la misma IP). Una regla de cada minuto, sumada a tus pruebas a mano y a las del resto de la clase, lo supera. No es culpa de tu código: borra la regla (paso 3) y reintenta pasado un rato. - **`ResourceConflictException` en `add-permission` (`The statement id (ev-crypto-cada-minuto) provided already exists`).** Ya creaste el permiso antes. No hace falta repetirlo: continúa con `put-targets`. Si quieres empezar de cero: `aws lambda remove-permission --function-name $FN --statement-id ev-$RULE --region $REGION`. - **No aparecen datos nuevos.** Comprueba que `FN` es el nombre exacto de tu función (`aws lambda list-functions --region eu-north-1 --query "Functions[].FunctionName"`) y que `put-targets` dijo `"FailedEntryCount": 0`. - **`$FN` o `$RULE` vacíos.** Las variables se pierden al cerrar CloudShell: vuelve a definirlas. ## Limpieza Esta carpeta **solo** crea la regla, así que la limpieza es el paso 3 de arriba. Compruébalo y bórrala si sigue existiendo: ```bash aws events list-rules --region eu-north-1 --query "Rules[].Name" --output text aws events remove-targets --rule NOMBRE_DE_LA_REGLA --ids 1 --region eu-north-1 aws events delete-rule --name NOMBRE_DE_LA_REGLA --region eu-north-1 ``` La primera orden lista los nombres (puede incluir reglas de otros temas: borra solo las tuyas de este laboratorio). Si una regla la creaste por consola (por ejemplo la, con nombre aleatorio), bórrala allí: **EventBridge → Rules → Delete**. El permiso añadido a la función (`ev-crypto-cada-minuto`) desaparece cuando borras la función (`eliminar` del script de tu variante). **Cada variante tiene su regla y sus datos propios, para que no se pisen si se lanzan en momentos distintos:** 05.03 usa la regla `crypto-cada-minuto` (la de esta guía) y la carpeta `crypto/` del bucket; 05.04, la regla `crypto-dynamodb-cada-minuto` (y su tabla de DynamoDB); 05.05, la regla `crypto-rds-cada-minuto` y la carpeta `crypto-rds/` del bucket (y su tabla en la RDS). Con el script de tu variante, la limpieza es `./gestionar-crypto-s3.sh desprogramar` (o el equivalente de 05.04 / 05.05); y `eliminar` (carpetas 05.03, 05.04, 05.05) ya borra antes que nada **todas** las reglas que apunten a su función. **Haz esta limpieza antes que la de las carpetas 05.03, 05.04 o 05.05**, para que la regla deje de invocar la función (con `eliminar` ya queda ordenado). **La infraestructura base (carpeta [05.01](05.01-infraestructurabase/README.md)) se borra la última.** ## Cómo sabes que has terminado - [ ] `put-rule`, `add-permission` y `put-targets` respondieron sin error (`"FailedEntryCount": 0`). - [ ] Viste datos nuevos en el destino de tu variante pasados un par de minutos. - [ ] Borraste la regla (`remove-targets` y `delete-rule`) y `aws events list-rules` no muestra `crypto-cada-minuto`. --- Anterior: [Tema 5 · 5 · CoinGecko a S3 y RDS](05.05-cryptoas3yrds/README.md) · Siguiente: [Tema 5 · 7 · Adicional A (REE)](05.07-adicionalaree/README.md)