Salta al contenuto

Come posso risolvere l'errore "Failed to receive X resource signal(s) within the specified duration" in AWS CloudFormation?

5 minuti di lettura
0

Ricevo il seguente errore: "Failed to receive X resource signal(s) within the specified duration" per le istanze Amazon Elastic Compute Cloud (Amazon EC2) Linux in AWS CloudFormation.

Breve descrizione

Si verifica questo errore quando CloudFormation non riceve correttamente i segnali per le risorse che hanno un attributo CreationPolicy specificato con un ResourceSignal al suo interno. L'errore potrebbe verificarsi per un'istanza Amazon EC2, un gruppo Auto Scaling o una AWS::CloudFormation::WaitCondition.

Nota: la seguente risoluzione si applica solo agli stack di CloudFormation creati con istanze Linux. Per le istanze Windows, consulta How do I resolve the error "Failed to receive X resource signal(s) within the specified duration" for EC2 Windows instances in AWS CloudFormation? (Come posso risolvere l'errore "Failed to receive X resource signal(s) within the specified duration" per le istanze EC2 Windows in AWS CloudFormation?)

Risoluzione

In base al caso d'uso, utilizza i seguenti passaggi per risolvere il problema.

Nota: per evitare il rollback dello stack, scegli Mantieni le risorse con il provisioning riuscito per le Opzioni di errore dello stack nella console CloudFormation. Questa opzione significa che non è previsto alcun rollback in caso di errore e l'istanza non viene arrestata finché non elimini lo stack.

Lo script cfn-signal non è installato nell'istanza dello stack di CloudFormation

Per verificare se lo script cfn-signal è installato nell'istanza configurata per inviare segnali allo stack, completa i seguenti passaggi:

  1. Utilizza la modalità SSH per connetterti all'istanza Linux.
  2. Utilizza uno dei seguenti script per verificare se lo script cfn-signal è installato.
    Per verificare se lo script cfn-signal si trova nella directory, esegui questo comando:
    $ sudo find / -name cfn-signal/opt/aws/bin/cfn-signal/opt/aws/apitools/cfn-init-1.4-30.amzn2/bin/cfn-sign
    Per verificare se il pacchetto di script di supporto di CloudFormation che contiene lo script cfn-signal è installato, esegui questo comando:
    $ sudo rpm -q aws-cfn-bootstrapaws-cfn-bootstrap-1.4-30.amzn2.noarch
    Importante: il comando precedente funziona solo sulle distribuzioni che utilizzano RPM Package Manager (RPM). Per ulteriori informazioni su RPM Package Manager, consulta Chaper 1. Introduction to RPM (Capitolo 1. Introduzione a RPM) sul sito web Red Hat. Per impostazione predefinita, gli script di supporto di CloudFormation sono installati in Amazon Machine Image (AMI) Amazon Linux. Per installare gli script di supporto, consulta Riferimento agli script di supporto di CloudFormation.

Sono presenti errori di sintassi o valori errati nel modello AWS CloudFormation

Per individuare errori e valori errati, completa i seguenti passaggi:

  1. In un editor di codice, apri il modello per lo stack. Quindi trova la sezione della proprietà UserData.
  2. Verifica la presenza di errori di sintassi, spazi mancanti, errori di ortografia e altri errori di battitura.
  3. Verifica che i valori per le proprietà dello stack, della risorsa e della Regione AWS siano corretti.
    Nota: controlla lo script di bootstrap incluso nella proprietà UserData. Lo script chiama cfn-signal. Verifica la presenza di errori di sintassi o valori errati.

Se il segnale è all'interno di comandi cfn-init, verifica se sono presenti informazioni che lo riguardano nei log di cfn-init. Per cercare errori nei log di cloud-init o cfn-init, utilizza SSH per connetterti all'istanza. Quindi utilizza la parola chiave error o failure per cercare messaggi di errore dettagliati nei seguenti log:

/var/log/cloud-init-output.log
/var/log/cloud-init.log
/var/log/cfn-init.log
/var/log/cfn-init-cmd.log
/var/log/cfn-wire.log

Per analizzare tutte le occorrenze della parola error o failure nei file /var/log/cfn o /var/log/cloud-init, esegui questo comando:

grep -ni 'error\|failure' $(sudo find /var/log -name cfn\* -or -name cloud-init\*)

Nota: il comando precedente restituisce il nome del file, il numero di riga e il messaggio di errore.

Il valore della proprietà timeout per l'attributo CreationPolicy è troppo basso

L'attributo CreationPolicy definisce il valore della proprietà timeout. Verifica che il valore sia sufficientemente alto per eseguire le attività prima che lo script cfn-signal invii segnali alle risorse di CloudFormation.

Per controllare il valore della proprietà timeout e confrontare i timestamp di segnalazione e di errore delle risorse, completa i seguenti passaggi:

  1. In un editor di codice, apri il modello di CloudFormation per lo stack per trovare il valore della proprietà timeout.
    Nota: il valore della proprietà timeout è il tempo massimo in cui CloudFormation attende un segnale prima di restituire un errore.
  2. Per avere una stima del momento in cui è stato attivato lo script cfn-signal, utilizza SSH per connetterti all'istanza. Quindi esegui questo comando:
    less /var/log/cfn-init.log
    Il file di log mostra un timestamp quando alle risorse CloudFormation viene inviato il segnale SUCCESS.
  3. Apri la console CloudFormation.
  4. Scegli la vista Eventi.
  5. Scegli Codice stato. Espandi la riga relativa all'evento con il codice dello stato "Failed to receive X resource signal(s) within the specified duration" (Non è stato possibile ricevere X segnali di risorse entro la durata specificata).
  6. Confronta il timestamp del segnale con quello dell'errore della risorsa.
    Nota: per un corretto completamento, lo script deve inviare il segnale prima che l'istanza venga creata o prima di non riuscire a crearla.

L'istanza non invia il segnale cfn

Verifica che il segnale ricevuto da CloudFormation sia provenuto dall'istanza. Controlla il log cfn wire disponibile in /var/log/cfn-wire.log. Se la risposta non è 200, potrebbe trattarsi di un problema di connettività tra l'istanza e l'endpoint di CloudFormation.

Quando invii segnali da una posizione che non corrisponde all'istanza, utilizza l'API SignalResource. Ad esempio, puoi utilizzare una funzione AWS Lambda per chiamare l'API SignalResource e poi inviare il segnale allo stack. Se ricevi un errore, utilizza CloudWatch Logs per controllare i log di Lambda e capire perché il segnale non è stato inviato allo stack.

AWS UFFICIALEAggiornata un anno fa