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: función
crypto-price-tracker. - 05.04 · CoinGecko a DynamoDB: función
crypto-price-tracker-dynamodb. - 05.05 · CoinGecko a S3 y RDS: función
crypto-price-tracker-rds(y por tanto la infraestructura base de la 05.01).
- 05.03 · CoinGecko a S3: función
- 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):
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:
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:
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:
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 429oHTTP Error 429en 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.ResourceConflictExceptionenadd-permission(The statement id (ev-crypto-cada-minuto) provided already exists). Ya creaste el permiso antes. No hace falta repetirlo: continúa conput-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
FNes el nombre exacto de tu función (aws lambda list-functions --region eu-north-1 --query "Functions[].FunctionName") y queput-targetsdijo"FailedEntryCount": 0. $FNo$RULEvací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:
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).
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) se borra la última.
Cómo sabes que has terminado
- [ ]
put-rule,add-permissionyput-targetsrespondieron sin error ("FailedEntryCount": 0). - [ ] Viste datos nuevos en el destino de tu variante pasados un par de minutos.
- [ ] Borraste la regla (
remove-targetsydelete-rule) yaws events list-rulesno muestracrypto-cada-minuto.
Anterior: Tema 5 · 5 · CoinGecko a S3 y RDS · Siguiente: Tema 5 · 7 · Adicional A (REE)