amazon ec2 - east - Programando un trabajo en AWS EC2
aws tags (7)
Tengo un sitio web ejecutándose en AWS EC2. Necesito crear un trabajo nocturno que genere un archivo de mapa del sitio y cargue los archivos en varios navegadores. Estoy buscando una utilidad en AWS que permita esta funcionalidad. He considerado lo siguiente:
1) Generar una solicitud al servidor web que lo activa para hacer esta tarea
- No me gusta este enfoque porque ata un hilo de servidor y usa ciclos de CPU en el host
2) Cree un trabajo cron en la máquina en la que se ejecuta el servidor web para ejecutar esta tarea
- De nuevo, no me gusta este enfoque porque quita ciclos de CPU del servidor web
3) Crear otra instancia EC2 y configurar una tarea cron para ejecutar la tarea
- Esto resuelve los problemas de recursos del servidor web, pero ¿por qué pagar una instancia adicional de EC2 para ejecutar un trabajo durante <5 minutos? ¡Perdida de dinero!
¿Hay más opciones? ¿Es este un trabajo para ElasticMapReduce?
AWS DataPipeline
Puede utilizar AWS Data Pipeline para programar una tarea con un período determinado. La acción puede ser cualquier comando cuando configura su Pipeline con ShellCommandActivity .
Incluso puede usar su instancia EC2 existente para ejecutar el comando: Configurar Task Runner en su instancia EC2 y establecer el campo workerGroup
al configurar ShellCommandActivity ( doc ) en su DataPipeline:
{
"pipelineId": "df-0937003356ZJEXAMPLE",
"pipelineObjects": [
{
"id": "Schedule",
"name": "Schedule",
"fields": [
{ "key": "startDateTime", "stringValue": "2012-12-12T00:00:00" },
{ "key": "type", "stringValue": "Schedule" },
{ "key": "period", "stringValue": "1 hour" },
{ "key": "endDateTime", "stringValue": "2012-12-21T18:00:00" }
]
}, {
"id": "DoSomething",
"name": "DoSomething",
"fields": [
{ "key": "type", "stringValue": "ShellCommandActivity" },
{ "key": "command", "stringValue": "echo hello" },
{ "key": "schedule", "refValue": "Schedule" },
{ "key": "workerGroup", "stringValue": "yourWorkerGroup" }
]
}
]
}
Límites : el intervalo mínimo de programación es de 15 minutos.
Precio : alrededor de $ 1.00 por mes.
Amazon acaba de lanzar [1] nuevas funciones para Elastic Beanstalk. Ahora puede crear un entorno de trabajo que contenga cron.yaml que configure las tareas de programación que invocan una URL con la sintaxis de CRON: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers .html # worker-periodictasks
Debería considerar CloudWatch Event y Lambda ( http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html ). Usted solo paga por las carreras reales. Supongo que los trabajadores mantenidos por Elastic beanstalk aún cuestan algo de dinero, incluso cuando están inactivos.
Actualización: encontré este lindo artículo ( http://brianstempin.com/2016/02/29/replacing-the-cron-in-aws/ )
Puede usar AWS Opswork para configurar trabajos cron para su aplicación. Para obtener más información, lea su guía de usuario en AWS OpsWork. Encontré una página que explica cómo configurar trabajos cron: http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-extend-cron.html
Si esta tarea se puede realizar con una máquina, recomiendo arrancar una instancia mediante programación usando la gema de niebla escrita en ruby.
Después de iniciar una instancia, puede ejecutar un comando a través de ssh. Una vez que lo hayas completado, puedes apagarlo también con niebla.
Amazon EMR también es una buena solución si su tarea se puede escribir de una manera reducida. EMR se encargará de iniciar / detener instancias. La herramienta cli elástica mapreduce-ruby puede ayudarlo a automatizarlo
Si estuviera en su lugar, probablemente comenzaría tratando de ejecutar el trabajo cron en el servidor web cada noche durante la bajamar y supervisaría el uso de recursos para asegurarme de que no interfiera con el servidor web.
Si encuentra que no funciona bien, o si tiene estándares altos para la elegancia de su arquitectura (puedo admirar eso), entonces probablemente necesite ejecutar una instancia por separado.
Estoy de acuerdo en que parece un desperdicio ejecutar una instancia las 24 horas del día para un trabajo que solo necesita ejecutar una vez por noche.
Aquí hay un enfoque: el trabajo cron en su máquina primaria (actualmente un servidor web) podría iniciar una nueva instancia para ejecutar la tarea. Podría pasar en un script de datos de usuario que se ejecuta cuando se inicia la instancia, y la instancia podría cerrarse cuando complete la tarea (donde el comportamiento iniciado por la instancia-apagado se estableció en "terminar").
Desafortunadamente, esto no cumple con su deseo de imponer la separación de preocupaciones, se complica cuando comienza a escalar a múltiples servidores web, y requiere que su servidor web esté activo para que el trabajo se ejecute.
Hace un par de meses, se me ocurrió un enfoque diferente para ejecutar una instancia en un cronograma cron, confiando totalmente en las características existentes de AWS y sin la necesidad de tener otros servidores en ejecución.
La idea básica es utilizar Auto Scaling de Amazon con una acción recurrente que escala el grupo de "0" a "1" en un momento específico cada noche. La instancia puede finalizar por sí misma cuando se realiza el trabajo, y la Escala automática puede limpiarse mucho más tarde para asegurarse de que haya finalizado.
He proporcionado más detalles y un ejemplo de trabajo en este artículo:
Ejecución de instancias de EC2 en un programa recurrente con escalado automático
http://alestic.com/2011/11/ec2-schedule-instance
Suponiendo que esté ejecutando una versión * nix de EC2, le sugiero que la ejecute en cron utilizando el comando nice.
agradable cambia la prioridad del trabajo. Puede hacer que sea una prioridad mucho menor, por lo que si su servidor web está ocupado, el trabajo cron tendrá que esperar a la CPU.
Cuanto mayor sea el número agradable, menor será la prioridad. Las bondades oscilan entre -20 (programación más favorable) y 19 (menos favorable).