Tenemos una tarea que carga algunos archivos de configuración de una fuente de datos externa. Después de cargar la configuración, nos gustaría poder reiniciar todas las tareas en un servicio para que la configuración se propague a todas las instancias.
¿Cuál es la mejor manera de reiniciar todos los servicios?
Tenemos una 'solución' que implica establecer el 'número de tareas' en 0 y luego hacer una copia de seguridad, pero definitivamente no es así como se supone que debe hacerse y tiene tiempo de inactividad.
amazon-web-services
docker
amazon-ecs
Dennkster
fuente
fuente
Respuestas:
Usando la herramienta AWS CLI:
fuente
Lo que desea hacer es esencialmente lo mismo que volver a implementar el Servicio.
Para volver a implementar el servicio sin tiempo de inactividad:
Esto debería lanzar nuevas tareas para la nueva definición de tarea y luego eliminar las viejas tareas para la antigua definición de tarea, reiniciando efectivamente las tareas sin tiempo de inactividad.
Ver: UpdateService
fuente
esto funcionó para mí:
las tareas luego se recrean en las mismas instancias.
si necesita nuevas instancias, use esto:
fuente
La tarea como bloque de construcción de ECS se puede detener mediante la llamada StopTask . El servicio se compone de tareas subyacentes que se pueden detener con la misma llamada API. Aquí solo falta parte de los resultados de la llamada ListTasks con el parámetro de familia definido . Escribí una función simple de Lambda que puede ayudarte con esto.
fuente
Estoy ampliando la respuesta de @ user326608 anterior (¡gracias por la información!).
Esto reiniciará TODAS LAS TAREAS DE TODOS LOS SERVICIOS PARA UN CLÚSTER al detener todas sus tareas. Cada servicio lanzará automáticamente una
X
cantidad de tareas nuevas, donde seX
encuentra el serviciodesired task count
.fuente
Según la documentación de Amazon, parece que debería poder realizar un script de las operaciones en cuestión utilizando las llamadas a la API UpdateService . Hay algunos ejemplos de código disponibles en el enlace anterior, parece posible que pueda adaptarse. Parece que escribir un script para encargarse de volver a cargar los servicios utilizando la definición de tarea adecuada después de que las actualizaciones de las configuraciones de la tarea serían la solución más elegante para el problema.
Hay más documentación sobre el uso de AWS CLI con ECS, que parece ser la forma más fácil de lidiar con la secuencia de comandos por lotes para reiniciar los servicios.
fuente
Funciona muy bien https://github.com/fdfk/ecsServiceRestart
fuente
He estado trabajando en esto. Sería bastante útil poder reiniciar una tarea a la vez de manera confiable. El siguiente script es lo que estoy usando ahora. Es muy cauteloso. Requiere que pulses volver para cada tarea. Hay un comando para esperar a que el servicio sea estable, pero eso no significa que la tarea sea correcta. Y pude poner un retraso de tiempo. Pero al final, si las cosas van mal, el script simplemente mataría lentamente la aplicación. Entonces...
fuente
Tengo un script python boto3 que hace el ff:
ecs_client.list_tasks(cluster=mycluster,serviceName=myservice,desiredStatus='RUNNING')
ecs_client.stop_task(cluster=mycluster,task=mytask)
ecs_client.describe_services(cluster=mycluster,services=[myservice])
while myservice['services'][0]['runningCount'] < myservice['services'][0]['desiredCount']:
Si el ciclo while ya no es verdadero, lo que significa que tanto el conteo en ejecución como el deseado son iguales, detenga la siguiente tarea en la lista.
Este es el flujo real y no puedo mostrar el código real, ya que todavía estoy empleado en mi trabajo actual y todo mi código les pertenece :)
fuente