bash 获取使用 ec2-api-tools 新启动的实例的 ID
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2644742/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Getting ID of an instance newly launched with ec2-api-tools
提问by Jonik
I'm launching an EC2 instance, by invoking ec2-run-instancesfrom simple a bash script, and want to perform further operations on that instance (e.g. associate elastic IP), for which I need the instance id.
我正在通过ec2-run-instances从简单的 bash 脚本调用来启动 EC2 实例,并希望对该实例执行进一步的操作(例如关联弹性 IP),为此我需要实例 ID。
The command is something like ec2-run-instances ami-dd8ea5a9 -K pk.pem -C cert.pem --region eu-west-1 -t c1.medium -n 1, and its output:
该命令类似于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
In this example, i-945af9e3is the id I'm after.
在这个例子中,i-945af9e3是我想要的 id。
So, I'd need a simple way to parse the id from what the command returns - how would you go about doing it? My AWK is a little rusty... Feel free to use any tool available on a typical Linux box. (If there's a way to get it directly using EC2-API-tools, all the better. But afaik there's no EC2 command to e.g. return the id of the most recently launched instance.)
所以,我需要一种简单的方法来从命令返回的内容中解析 id - 你会怎么做?我的 AWK 有点生疏……随意使用典型 Linux 机器上可用的任何工具。(如果有办法直接使用 EC2-API 工具获取它,那就更好了。但是 afaik 没有 EC2 命令来例如返回最近启动的实例的 id。)
采纳答案by Jonik
Ok, at least something like this should work:
好的,至少这样的事情应该有效:
instance_id=$(ec2-run-instances ami-dd8ea5a9 [...] | awk '/INSTANCE/{print }')
Admittedly I was a bit lazy thinking that it's quicker to ask on SO than to relearn some AWK basics... :-)
诚然,我有点懒惰,认为询问 SO 比重新学习一些 AWK 基础知识更快...... :-)
Edit: simplified AWK usage as Dennis suggested. Also, using $()instead of `` for clarity, and got rid of intermediate variable.
编辑:按照丹尼斯的建议简化了 AWK 的使用。此外,$()为了清楚起见,使用代替 ``,并去掉了中间变量。
回答by bortzmeyer
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.
完成您的正确答案,这里是一个 shell 脚本,它创建一个实例,运行一些命令并删除该实例。它以与您相同的方式使用 awk。
#!/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 <[email protected]>
# 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 }')
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 }')
# 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 }')
NAME=$(echo "$description" | awk '/^INSTANCE/ {print }')
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}
回答by Alexey Vazhnov
As an alternative to ec2-run-instances, you can create one ec2 instance and get InstanceId by one line by awscli run-instances:
作为 的替代方法ec2-run-instances,您可以创建一个 ec2 实例并通过 awscli run-instances一行获取 InstanceId :
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)
回答by user2305615
No need to use awk:
无需使用 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
来自http://www.hulen.com/post/22802124410/unattended-amazon-ec2-install-script
回答by Aakash Kag
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/"$//'

