2015-02-17 17 views
6

Sto utilizzando uno script bash per creare un'istanza AWS tramite CLI e un modello cloudformation. Voglio che il mio script attenda fino al completamento della creazione dell'istanza prima di passare al mio script. In questo momento, sto usando un ciclo while per "descrivere-stack" ogni 5 secondi e uscire dal ciclo quando lo stato = "CREATE_COMPLETE" o qualche stato di errore. Qualcuno sa di un modo più elegante per fare questo?Come attendere nello script bash fino al completamento della creazione dell'istanza AWS

stackStatus="CREATE_IN_PROGRESS" 

while [[ 1 ]]; do 
    echo "${AWS_CLI_PATH}" cloudformation describe-stacks --region "${CfnStackRegion}" --stack-name "${CfnStackName}" 
    response=$("${AWS_CLI_PATH}" cloudformation describe-stacks --region "${CfnStackRegion}" --stack-name "${CfnStackName}" 2>&1) 
    responseOrig="$response" 
    response=$(echo "$response" | tr '\n' ' ' | tr -s " " | sed -e 's/^ *//' -e 's/ *$//') 

    if [[ "$response" != *"StackStatus"* ]] 
    then 
     echo "Error occurred creating AWS CloudFormation stack. Error:" 
     echo " $responseOrig" 
     exit -1 
    fi 

    stackStatus=$(echo $response | sed -e 's/^.*"StackStatus"[ ]*:[ ]*"//' -e 's/".*//') 
    echo " StackStatus: $stackStatus" 

    if [[ "$stackStatus" == "ROLLBACK_IN_PROGRESS" ]] || [[ "$stackStatus" == "ROLLBACK_COMPLETE" ]] || [[ "$stackStatus" == "DELETE_IN_PROGRESS" ]] || [[ "$stackStatus" == "DELETE_COMPLETE" ]]; then 
     echo "Error occurred creating AWS CloudFormation stack and returned status code ROLLBACK_IN_PROGRESS. Details:" 
     echo "$responseOrig" 
     exit -1 
    elif [[ "$stackStatus" == "CREATE_COMPLETE" ]]; then 
     break 
    fi 

    # Sleep for 5 seconds, if stack creation in progress 
    sleep 5 
done 
+1

Niente di sbagliato in questo approccio, basta assicurarsi di non sedersi a dormire per sempre - si può decidere di pausa dopo una lunga * * tempo comunque. Ci sono soluzioni più eleganti, ma probabilmente oltre lo scopo di 'bash' – arco444

+0

Mi piacerebbe anche vedere una soluzione più elegante! (principalmente per evitare spamming aws api ...) – Cyberwiz

risposta

0

Ecco come ho fatto. Dopo l'avvio di esempio Aspetto IP pubblico:

INSTANCE_ID="$(aws ec2 run-instances --cli-input-json "${LAUNCH_SPEC}" | jq -r '.Instances[0].InstanceId')" 
echo "Instance id ${INSTANCE_ID}" 

while true; do 
    PUBLIC_IP="$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} | jq -r '.Reservations[0].Instances[0].PublicIpAddress')" 
    if [[ "${PUBLIC_IP}" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then break; fi 
    sleep 1 
    echo -n '.' 
done 

LAUNCH_SPEC definito in precedenza

2

AWS CLI fornisce un sottocomando wait per la maggior parte dei comandi che creano risorse. Per lo scenario, è possibile utilizzare il wait sottocomando di aspettare il stack-create-complete evento:

aws cloudformation wait stack-create-complete --stack-name myStackName 
+0

Sebbene questo codice possa aiutare a risolvere il problema, non spiega _why_ e/o _how_ che risponde alla domanda. Fornire questo contesto aggiuntivo migliorerebbe significativamente il suo valore educativo a lungo termine. Si prega di [modificare] la risposta per aggiungere una spiegazione, compresi quali limitazioni e ipotesi si applicano. –

Problemi correlati