2015-02-17 5 views
6

Ich verwende ein Bash-Skript, um eine AWS-Instanz über CLI und eine Cloud-Vorlage zu erstellen. Ich möchte, dass mein Skript wartet, bis die Erstellung der Instanz abgeschlossen ist, bevor ich in meinem Skript weitermache. Im Moment benutze ich eine while-Schleife, um alle 5 Sekunden "zu beschreiben-stacks" und bricht die Schleife ab, wenn der Status = "CREATE_COMPLETE" oder ein Fehlerstatus ist. Kennt jemand einen eleganteren Weg, dies zu tun?Warten im Bash-Skript, bis die Erstellung der AWS-Instanz abgeschlossen ist

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

Nichts falsch mit diesem Ansatz, so stellen Sie sicher, dass Sie schlafen nicht ewig sitzen - Sie können nach einer * lange brechen wollen * Zeit sowieso. Es gibt elegantere Lösungen, aber wahrscheinlich außerhalb des Rahmens von "bash" – arco444

+0

würde ich gerne eine elegantere Lösung auch sehen! (in erster Linie um Spam zu vermeiden aws api ...) – Cyberwiz

Antwort

0

Das ist, wie ich es tat. Nach dem Start der Instanz warten ich für die öffentliche IP:

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 zuvor

definiert
2

Die aws cli ein wait subcommand für die meisten Befehle, die Ressourcen erstellen. Für Ihr Szenario können Sie die wait subcommand verwenden für die stack-create-complete Ereignis warten:

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

Obwohl dieser Code helfen kann, das Problem zu lösen, erklärt es nicht _why_ und/oder _how_ es beantwortet die Frage. Die Bereitstellung dieses zusätzlichen Kontextes würde seinen langfristigen Bildungswert erheblich verbessern. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung hinzuzufügen, einschließlich der Einschränkungen und Annahmen. –