代码之家  ›  专栏  ›  技术社区  ›  Jonik

获取使用ec2api工具新启动的实例的ID

  •  16
  • Jonik  · 技术社区  · 16 年前

    ec2-run-instances

    命令类似于 ec2-run-instances ami-dd8ea5a9 -K pk.pem -C cert.pem --region eu-west-1 -t c1.medium -n 1 ,及其输出:

    RESERVATION r-b6ea58c1    696664755663    default
    INSTANCE    i-945af9e3    ami-dd8ea5b9    pending    0    c1.medium    2010-04-15T10:47:56+0000    eu-west-1a    aki-b02a01c4    ari-39c2e94d   
    

    在这个例子中, i-945af9e3

    所以,我需要一个简单的方法来解析命令返回的id-你会怎么做呢?我的AWK有点生锈了。。。在一个典型的Linux机器上,您可以随意使用任何可用的工具(如果有办法直接使用ec2api工具获得它,那就更好了。但是afaik没有EC2命令来返回最近启动的实例的id。)

    5 回复  |  直到 16 年前
        1
  •  22
  •   bortzmeyer    14 年前

    #!/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}
    
        2
  •  12
  •   Jonik    16 年前

    好吧,至少这样的方法应该行得通:

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

    诚然,我有点懒散,认为这样问比重新学习一些AWK基础知识更快…:-)

    :简化了AWK的用法,如Dennis建议的那样。另外,使用 $()

        3
  •  8
  •   Alexey Vazhnov subhajit das    7 年前

    作为替代 ec2-run-instances ,您可以创建一个ec2实例,并通过awscli一行获取InstanceId 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)
    
        4
  •  3
  •   user2305615    13 年前

    无需使用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
    

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

        5
  •  -1
  •   Aakash Kag    9 年前
    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/"$//'