¿Es posible forzar la recreación de EC2 :: Instance o RDS :: DBInstance en amazon cloudformation?

16

¿Es posible forzar la recreación de una instancia EC2 o RDS utilizando pilas de formación en la nube?

Mi pila se atasca en un punto donde simplemente destruir y crear el recurso lo arreglará, en lugar de eso tuve que eliminar toda la pila para continuar trabajando.

editar:

Este problema me golpeó dos veces. Primero creé una instancia de AWS :: RDS :: con algunos valores predeterminados y luego intenté degradarla a "EngineVersion": "5.5". Se supone que cambiar esto ocurre con alguna interrupción, pero las instancias mysql no se pueden degradar de 5.6 a 5.5, por lo que la pila se dejó en estado UPDATE_FAILED y no puedo volver a crear RDS sin un truco desagradable.

La otra ocurrencia fue que tengo varios "AWS :: EC2 :: Instance" que descargan y ejecutan un script desde sus "UserData", obviamente, si Y cambia el script descargado, debo recrear la instancia, y no hay forma de hacerlo. Una vez más uso el mismo truco desagradable para recrear la máquina.

El truco desagradable:

En lugar de usar un grupo de escalado automático de una máquina, resolví ambos problemas cambiando la zona de disponibilidad en las propiedades ... pero me dejó con mal gusto

teísta
fuente
Necesita más información para responder. ¿Sus instancias se congelan al inicio? ¿Un servicio deja de responder? Si está buscando recrear manualmente una instancia EC2, puede crear un grupo de escala automática con una instancia. Cuando finalice la instancia, se creará otra.
Edwin
editado para aclarar. También pregunté aquí: forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0
teísta
Esto no responde directamente a su pregunta, pero para volver a ejecutar los scripts de UserData cuando se modifique , puede consultar cfn-hup: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
Reed Kraft-Murphy

Respuestas:

10

Para las instancias de EC2 respaldadas por la tienda, un truco es agregar un comentario al script de datos del usuario que contenga un número de versión, fecha o similar, y luego cambiarlo cada vez que desee recrear la instancia:

{
    "Resources" : {
        "MyEC2Instance" : {
            "Type" : "AWS::EC2::Instance",
            "Properties" : {
                // ... other properties ...
                "UserData": { 
                    "Fn::Base64" : {
                        "Fn::Join" : [ ":", [
                        "#!/bin/bash\n",
                        "# Version: 1.0\n",
                        // ... rest of user data ...
                    ]]}
            }
        }
    }
}

Cualquier cambio en UserDatahará que la instancia sea reemplazada (es decir, regenerada). Sin embargo, el comportamiento del script de datos del usuario debe ser el mismo, ya que la única modificación es un comentario. Tenga en cuenta que esto no funciona para instancias respaldadas por EBS.

Para RDS, puede tomar una instantánea de la base de datos de la instancia actual de RDS y luego modificar su plantilla para usar esa instantánea con DBSnapshotIdentifier:

{
    "Resources" : {
        "MyDB" : {
        "Type" : "AWS::RDS::DBInstance",
        "Properties" : {
            // ... other properties ...
            "DBSnapshotIdentifier": "<db snapshot ID>"
        }
    }    
}

Cada vez que DBSnapshotIdentifierse cambie, la instancia de la base de datos será reemplazada. El uso de instantáneas también le permitirá conservar los datos de cuando se realizó la instantánea. (Si desea borrar los datos, puede crear una instantánea vacía y pasarla como entrada. O eliminar y volver a crear toda la pila de CloudFormation).

Un enfoque más genérico es cambiar el nombre lógico del recurso. Desde Modificar una plantilla de pila en los documentos de CloudFormation:

Para la mayoría de los recursos, cambiar el nombre lógico de un recurso es equivalente a eliminar ese recurso y reemplazarlo por uno nuevo. Cualquier otro recurso que dependa del recurso renombrado también debe actualizarse y podría provocar su reemplazo. Otros recursos requieren que actualice una propiedad (no solo el nombre lógico) para activar una actualización.

Markusk
fuente
Parece que la única solución es hacer "trucos sucios" llegué a una solución similar (forzando cambios zonas de disponibilidad) algún tiempo después de preguntar :)
teísta
44
Solo quiero señalar que la instancia se reemplaza y, por lo tanto, los datos de usuario se ejecutan cuando la instancia EC2 está respaldada por el almacenamiento de la instancia. Si está respaldado por EBS, el cambio de UserData solo hará que la instancia se reinicie y UserData no se ejecute nuevamente. Puede usar cfn-hup para volver a ejecutar UserData incluso en este caso, pero la instancia permanece igual.
Kaitsu
@Kaitsu: Gracias, esa es una aclaración muy valiosa. Actualicé mi respuesta en consecuencia.
markusk
@Kaitsu, pero si vuelve a ejecutar manualmente el script (ubicado en / var / lib / cloud / instance / scripts / part-001) debe asegurarse de que el script sea defensivo para ejecutar los mismos comandos varias veces :(
c24w
1

Si lo coloca en un AutoScalingGroup, puede editar el AutoScalingGroup min / max / default a 0, luego, tan pronto como comience a destruir la instancia anterior, puede poner el min / max / default a 1/1/1 y presto: nueva instancia.

Tim Bassett
fuente
0

Si su EC2 está en un AutoScalingGroup, puede establecer la AutoScalingGroupNamepropiedad con un número de versión.

Cada vez que cambie ese número de versión, CFN: 1. creará un nuevo grupo de autoescalado y activará las instancias deseadas 2. matará las instancias en el antiguo grupo de autoescalado y lo eliminará

Aquí hay un código de mi pila donde uso esta técnica para forzar a un gran número de máquinas EC2 a recrear y extraer automáticamente un nuevo software de S3.

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
marcopeg
fuente