Getting ID of an instance newly launched with ec2-api-tools

前端 未结 5 1222
没有蜡笔的小新
没有蜡笔的小新 2020-12-14 09:46

I\'m launching an EC2 instance, by invoking ec2-run-instances from simple a bash script, and want to perform further operations on that instance (e.g. associate elastic IP)

相关标签:
5条回答
  • 2020-12-14 10:00

    Ok, at least something like this should work:

    instance_id=$(ec2-run-instances ami-dd8ea5a9 [...] | awk '/INSTANCE/{print $2}') 
    

    Admittedly I was a bit lazy thinking that it's quicker to ask on SO than to relearn some AWK basics... :-)

    Edit: simplified AWK usage as Dennis suggested. Also, using $() instead of `` for clarity, and got rid of intermediate variable.

    0 讨论(0)
  • 2020-12-14 10:04
    http://www.tothenew.com/blog/how-to-parse-json-by-command-line-in-linux/
    best tool to parse json in shell
    
    #get instance id 
    cat sample.json | jq '.Instances[0].InstanceId'|sed -e 's/^"//' -e 's/"$//' 
    #check instances is running or not 
    cat status.json | jq '.InstanceStatuses[0].InstanceState.Name'|sed -e 's/^"//' -e 's/"$//' 
    
    0 讨论(0)
  • 2020-12-14 10:20

    No need to use awk:

    # create the instance and capture the instance id
    echo "Launching instance..."
    instanceid=$(ec2-run-instances --key $pemkeypair --availability-zone $avzone $ami | egrep ^INSTANCE | cut -f2)
    if [ -z "$instanceid" ]; then
        echo "ERROR: could not create instance";
        exit;
    else
        echo "Launched with instanceid=$instanceid"
    fi
    

    from http://www.hulen.com/post/22802124410/unattended-amazon-ec2-install-script

    0 讨论(0)
  • 2020-12-14 10:22

    As an alternative to ec2-run-instances, you can create one ec2 instance and get InstanceId by one line by awscli run-instances:

    export MyServerID=$(aws ec2 run-instances --image-id AMI --count 1 --instance-type t2.micro --key-name "my_ssh_key" --security-group-ids sg-xxx --subnet-id subnet-yyy --query 'Instances[0].InstanceId' --output text)
    
    0 讨论(0)
  • 2020-12-14 10:24

    Completing your correct answer, here is a shell script which creates an instance, runs some commands and deletes the instance. It uses awk in the same way as yours.

    #!/bin/sh
    
    # Creates an Amazon EC2 virtual machine (an instance) and runs some
    # shell commands on it before terminating it. Just an example.
    # Stephane Bortzmeyer <stephane+amazon@bortzmeyer.org>
    
    # Parameters you can set.
    # Choose an AMI you like (ami-02103876 is a Debian "lenny")
    AMI=ami-02103876
    # Create your key pair first, for instance on the Web interface
    KEY=test-b
    KEYDIR=.
    # The user name to use depends on the AMI. "root" is common but check
    # the documentation of the AMI.
    USERNAME=root
    # Needs to be a legal Unix group of commands
    COMMANDS="(uname -a; df -h; cat /etc/debian_version)"
    MAX_CONNECTS=4
    MAX_TESTS=6
    
    # If you want to change from the default region, set the environment
    # variable EC2_URL for instance 'export
    # EC2_URL=https://ec2.eu-west-1.amazonaws.com' to use the 'eu-west-1'
    # region
    
    # Also, be sure your default security group allows incoming SSH.
    
    if [ "${EC2_PRIVATE_KEY}" = "" ] || [ "${EC2_CERT}" = "" ]; then
        echo "You need to have X.509 certificate and private key locally, and to set the environment variables EC2_PRIVATE_KEY and EC2_CERT to indicate their locations" 1>&2
        exit 1
    fi
    
    start=$(ec2-run-instances --key ${KEY} $AMI)
    if [ $? != 0 ]; then
        echo "Machine did not start" 1>&2
        exit 1
    fi
    
    AMI_E=$(echo "$start" | awk '/^INSTANCE/ {print $3}')
    if [ "$AMI_E" != "$AMI" ]; then
        echo "AMI does not match (got $AMI_E instead of $AMI), the machine probably did not start" 1>&2
        exit 1
    fi
    INSTANCE=$(echo "$start" | awk '/^INSTANCE/ {print $2}')
    
    # I do not find a way to block until the machine is ready. We
    
    # apparently have to poll.
    OVER=0
    TESTS=0
    while [ $OVER != 1 ] && [ $TESTS -lt $MAX_TESTS ]; do
        description=$(ec2-describe-instances ${INSTANCE})
        STATE=$(echo "$description" | awk '/^INSTANCE/ {print $6}')
        NAME=$(echo "$description" | awk '/^INSTANCE/ {print $4}')
        if [ "$NAME" = "" ]; then
            echo "No instance ${INSTANCE} available. Crashed or was terminated." 1>&2
            exit 1
        fi
        if [ $STATE = "running" ]; then
            OVER=1
        else
            # I like bc but 'echo $(( TESTS+=1 ))' should work, too. Or expr.
            TESTS=$(echo $TESTS+1 | bc)
            sleep 2
        fi
    done
    if [ $TESTS = $MAX_TESTS ]; then
        echo "${INSTANCE} never got to running state" 1>&2
        ec2-terminate-instances ${INSTANCE}
        exit 1
    fi
    echo "$INSTANCE is running, name is $NAME"
    # The SSH server does not seem reachable immediately. We again have to poll
    OVER=0
    TESTS=0
    while [ $OVER != 1 ] && [ $TESTS -lt $MAX_CONNECTS ]; do
        ssh -o "StrictHostKeyChecking no" -i ${KEYDIR}/${KEY}.pem ${USERNAME}@$NAME "${COMMANDS}"
        if [ $? != 255 ]; then
            # It means we connected successfully (even if the remote command failed)
            OVER=1
        else
            TESTS=$(echo $TESTS+1 | bc)
            sleep 3
        fi
    done
    if [ $TESTS = $MAX_CONNECTS ]; then
        echo "Cannot connect to ${NAME}" 1>&2
    fi
    ec2-terminate-instances ${INSTANCE}
    
    0 讨论(0)
提交回复
热议问题