È possibile forzare la ricostruzione di EC2 :: Instance o RDS :: DBInstance nella cloudformation di Amazon?


16

È possibile forzare la ricostruzione di un'istanza EC2 o RDS utilizzando stack di cloudformation?

Il mio stack si blocca in un punto in cui semplicemente la distruzione e la creazione della risorsa lo risolveranno, invece di dover eliminare l'intero stack per continuare a lavorare.

modificare:

Questo problema mi ha colpito due volte. Prima ho creato un'istanza AWS :: RDS :: con alcune impostazioni predefinite e poi ho provato a ridimensionarlo a "EngineVersion": "5.5". La modifica di questo si suppone accada con qualche interruzione, ma le istanze mysql non possono essere declassate da 5.6 a 5.5, quindi lo stack è stato lasciato nello stato UPDATE_FAILED e non posso essere in grado di ricreare RDS senza un brutto trucco.

L'altra occorrenza è stata che ho diversi "AWS :: EC2 :: Instance" che scaricano ed eseguono uno script dal suo "UserData" ovviamente se Y cambio lo script scaricato devo cancellare l'istanza e non c'è modo di farlo. Ancora una volta uso lo stesso brutto trucco per ricreare la macchina.

Il brutto trucco:

Invece di utilizzare un gruppo con scalabilità automatica di una macchina, ho risolto entrambi i problemi cambiando la zona di disponibilità nelle proprietà ... ma mi ha lasciato di cattivo gusto


Hai bisogno di maggiori informazioni per rispondere. Le tue istanze si bloccano all'avvio? Un servizio non risponde? Se stai cercando di ricreare manualmente un'istanza EC2, puoi creare un gruppo di ridimensionamento automatico con un'istanza. Quando si termina l'istanza, ne verrà creata un'altra.
Edwin,

modificato per chiarire. Ho anche chiesto qui: forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0
teista

Questo non risponde direttamente alla tua domanda, ma per rieseguire gli script UserData una volta modificati, puoi esaminare cfn-hup: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
Reed Kraft-Murphy

Risposte:


10

Per le istanze EC2 supportate dall'archivio, un trucco è aggiungere un commento allo script dei dati utente contenente un numero di versione, una data o simile, quindi modificarlo ogni volta che si desidera ricreare l'istanza:

{
    "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 ...
                    ]]}
            }
        }
    }
}

Qualsiasi modifica a UserData farà sì che l'istanza venga sostituita (ovvero rigenerata). Il comportamento dello script dei dati utente dovrebbe essere lo stesso, tuttavia, poiché l'unica modifica è un commento. Si noti che questo non funziona per le istanze supportate da EBS.

Per RDS, è possibile eseguire uno snapshot DB dell'istanza RDS corrente, quindi modificare il modello per utilizzare lo snapshot con DBSnapshotIdentifier:

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

Ogni volta che DBSnapshotIdentifierviene modificato, l'istanza del database verrà sostituita. L'uso delle istantanee ti consentirà anche di mantenere i dati dal momento in cui è stata creata l'istantanea. (Se si desidera cancellare i dati, è possibile creare uno snapshot vuoto e passarlo come input. O eliminare e ricreare l'intero stack CloudFormation.)

Un approccio più generico è quello di cambiare il nome logico della risorsa. Dalla modifica di un modello di stack nei documenti CloudFormation:

Per la maggior parte delle risorse, cambiare il nome logico di una risorsa equivale a eliminare quella risorsa e sostituirla con una nuova. Anche qualsiasi altra risorsa che dipende dalla risorsa rinominata deve essere aggiornata e potrebbe essere sostituita. Altre risorse richiedono l'aggiornamento di una proprietà (non solo il nome logico) per attivare un aggiornamento.


Sembra che l'unica soluzione sia fare "trucchi sporchi" Ho raggiunto una soluzione simile (forzando i cambiamenti delle zone di disponibilità) qualche tempo dopo aver chiesto :)
Theist

4
Voglio solo sottolineare che l'istanza è stata sostituita e quindi UserData eseguito quando l'istanza EC2 è supportata dall'archivio delle istanze. Se è supportato da EBS, la modifica di UserData farà solo riavviare l'istanza e UserData non verrà più eseguito. È possibile utilizzare cfn-hup per riavviare UserData anche in questo caso, ma l'istanza rimane invariata.
Kaitsu,

@Kaitsu: Grazie, è un chiarimento molto prezioso. Ho aggiornato la mia risposta di conseguenza.
markusk,

@Kaitsu ma se riesegui manualmente lo script (che si trova in / var / lib / cloud / instance / scripts / part-001) devi assicurarti che lo script sia difensivo per eseguire gli stessi comandi più volte :(
c24w

1

Se lo metti in un gruppo AutoScaling, puoi modificare AutoScalingGroup min / max / default su 0, quindi non appena inizia a distruggere la vecchia istanza, puoi quindi inserire min / max / default su 1/1/1 e presto: nuova istanza.


0

Se l'EC2 si trova in un gruppo AutoScaling, è possibile impostare la AutoScalingGroupNameproprietà con un numero di versione al suo interno.

Ogni volta che modifichi quel numero di versione CFN: 1. creerà un nuovo gruppo di ridimensionamento automatico e farà girare le istanze desiderate 2. ucciderà le istanze nel vecchio gruppo di ridimensionamento automatico ed eliminerà

Ecco un pezzo di codice dal mio stack in cui utilizzo questa tecnica per forzare un gran numero di macchine EC2 a ricreare e estrarre automaticamente nuovo software da S3.

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.