¿Cómo puedo cambiar automáticamente una nueva imagen en un AWS Auto Scaling Group?

21

Tengo una configuración de aplicación web con un equilibrador de carga y un grupo de escala automática para administrar la escala. El código fuente está en un repositorio git, así que no tengo que actualizar las imágenes cuando cambia el código, pero ocasionalmente el entorno cambia, por lo que creamos una nueva imagen. Luego, esa imagen debe ciclarse en el grupo de escalado automático.

¿Hay alguna forma de alternar las imágenes automáticamente? En este momento programo una acción de ampliación y reducción que elimina las instancias anteriores.

plataformas
fuente
2
Probablemente sea más eficiente si, después de crear su nueva configuración de inicio y actualizar su grupo de escalado automático, marca cada instancia como no saludable (por ejemplo, usando as-set-instance-health), de modo que el escalado automático simplemente la reemplaza con una nueva instancia.
cyberx86

Respuestas:

10

Me gustaría sugerir "AWS-HA-Release" para hacer esto, la forma en que funciona AWS-HA-Release:

  1. Si el grupo de escalado automático actual y ELB informan 5 instancias que están en buen estado,
  2. AWS-HA-Release trae una nueva instancia a producción y espera a que el ELB la identifique como saludable (eleva el número total de instancias saludables a 6)
  3. Elimina una instancia anterior (total hasta 5)
  4. Trae otra instancia al servicio (total de 6)
  5. Elimina una instancia anterior (total hasta 5)
  6. y así sucesivamente hasta que todas las instancias hayan sido reemplazadas

En este caso, puede enviar un nuevo código o nuevas versiones de AMI sin tiempo de inactividad y tener el beneficio de instancias completamente nuevas. La herramienta AWS-HA-Release está disponible en https://github.com/colinbjohnson/aws-missing-tools .

Colin Johnson
fuente
9

La forma más fácil es aumentar el número de instancias mínimas en el Grupo de autoescalado (ASG) al doble de su recuento actual, espere cuando se inicien todas y luego cambie ese número mínimo de instancias a lo que era. ELB matará instancias más antiguas y dejará instancias más nuevas con código. Para lograr esa política de terminación debe establecerse en ' OldestInstance ' para que funcione según lo previsto. La política de terminación predeterminada puede tener efectos secundarios no deseados.

Puede ver los parámetros y ejemplos de AWS CLI aquí: http://docs.aws.amazon.com/cli/latest/reference/autoscaling/update-auto-scaling-group.html

Sergey Kuznetsov
fuente
Saludos, este es un método súper conveniente y sin complicaciones.
Elad Nava
1
Esto no siempre funcionará, según los documentos de AWS, incluso al seleccionar una política de terminación personalizada, el ASG mantendrá equilibrados los AZ antes de aplicar la política de terminación. Entonces, duplicar y reducir a la mitad el tamaño puede dejarlo con un par de instancias antiguas. Esto es especialmente probable cuando se utiliza un ASG con múltiples tipos de instancias y opciones de compra, ya que el ASG mantendrá equilibradas las opciones AZ y la opción de mercado (spot frente a demanda) antes de aplicar la política 'OldestInstance': docs.aws.amazon.com / autoscaling / ec2 / userguide / ...
Shahad
6

La forma en que administro este escenario es usar la función UpdatePolicy del objeto AWS :: AutoScaling :: AutoScalingGroup en la formación de nubes. cuando se actualiza la pila de formación de nubes, administrará el ciclo de las instancias.

algunas referencias http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy .html

graeme
fuente
Gracias una tonelada @graeme. No tenía idea de que Cloudformation ofrecía esta funcionalidad.
AJB
Exactamente lo que estaba buscando. Implementamos nuestras pilas a través de Jenkins a medida que se bloquean los cambios a través de la consola de AWS.
Greg Biles
3

También eche un vistazo a la herramienta Netflix Asgard que ahora es de código abierto. No solo puede configurar Grupos de Auto Scaling, sino que también puede realizar lanzamientos continuos de nuevas imágenes AMI para un grupo de instancias.

plataformas
fuente
Te refieres a "Netflix Asgard"
44
Netflix Asgard ahora está en desuso, se reemplaza con Netflix Spinnaker
dlaidlaw
0

En realidad, no hay una forma realmente buena de hacerlo para ser honesto. La mejor manera de hacerlo es poner una versión en el nombre ASG. Cada vez que actualizo el AMI, creo una nueva configuración de inicio ASG + con la nueva versión para que no entre en conflicto con el otro grupo. Luego termino todas las instancias en el grupo anterior.

Si se requiere una implementación más tolerante a fallas, recomiendo agregar otro paso involucrando la creación de un nuevo balanceador de carga también. Esto le permite tener ambos ASG aislados entre sí. También le permite tener un área de "Puesta en escena" para probar sus cambios por última vez antes de actualizar. Luego, cuando esté listo para cambiar, actualice los registros DNS y finalice todas las instancias en el grupo anterior.

bwight
fuente
0

Como publiqué aquí (pregunta similar, solo con Terraform), no está integrado en ASG de ninguna manera, excepto si usa la formación en la nube. Luché con eso también, así que terminé escribiendo un "rodillo" que mira múltiples ASG, verifica su estado y actualizaciones. Siempre feliz de recibir comentarios. http://github.com/deitch/aws-asg-roller

deitch
fuente