[英]aws ec2 request-spot-instances CLI issues
尝试在一个简单的脚本中启动几个spot实例,并且AWS文档中提供的语法和aws ec2 request-spot-instances帮助输出以JAVA或JSON语法列出。 如何从shell脚本中输入JSON语法下的参数?
aws --version
aws-cli / 1.2.6 Python / 2.6.5 Linux / 2.6.21.7-2.fc8xen
aws ec2 request-spot-instances帮助 - 在“启动规范”的开头,它列出了JSON语法
--launch-specification(structure)指定其他启动实例信息。
JSON Syntax:
{
"ImageId": "string",
"KeyName": "string",
}, ....
"EbsOptimized": true|false,
"SecurityGroupIds": ["string", ...],
"SecurityGroups": ["string", ...]
}
我已经尝试了以下所有可能的组合,添加和移动括号,引号,更改选项等,都无济于事。 下面的变量$ launch的正确格式是什么? 其他命令变体 - “ec2-request-spot-instances”在我的环境中不起作用,如果我尝试用-p替换--spot-price,它也不起作用。
#!/bin/bash
launch="{"ImageId":"ami-a999999","InstanceType":"c1.medium"} "SecurityGroups":"launch-wizard-6""
echo $launch
aws ec2 request-spot-instances --spot-price 0.01 --instance-count 1 --type c1.small --launch-specification $launch
这提供了结果:未知选项:SecurityGroups:launch-wizard-6
替换安全组编号具有相同的结果。
aws ec2 describe-instances运行完美,aws ec2 start-instance也是如此,因此环境和帐户信息设置正确,但我需要利用现货定价。
事实上,此用户文档中没有列出任何工作: http : //docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-RequestSpotInstances.html
谢谢,
我知道这是一个老问题,但万一有人碰到它。 我最近在CLI上遇到了同样的问题。 很难让所有参数对请求点实例正常工作
#!/bin/bash
AWS_DEFAULT_OUTPUT="text"
UserData=$(base64 < userdata-current)
region="us-west-2"
price="0.03"
zone="us-west-2c"
aws ec2 request-spot-instances --region $region --spot-price $price --launch-specification "{ \"KeyName\": \"YourKey\", \"ImageId\": \"ami-3d50120d\" , \"UserData\": \"$UserData\", \"InstanceType\": \"r3.large\" , \"Placement\": {\"AvailabilityZone\": \"$zone\"}, \"IamInstanceProfile\": {\"Arn\": \"arn:aws:iam::YourAccount:YourProfile\"}, \"SecurityGroupIds\": [\"YourSecurityGroupId\"],\"SubnetId\": \"YourSubnectId\" }"
基本上我必须做的是将我的用户数据放在外部文件中,将其加载到UserData变量中,然后在命令行上传递它。 尝试在命令行上获取所有内容或使用ec2-request-spot-instances的外部文件只是保持失败。 请注意,其他命令工作得很好,因此这是ec2-request-spot-instances特有的。
我详细介绍了我最终在这里做的事情。
这里的第一个问题是引用和格式化:
$ launch="{"ImageId":"ami-a999999","InstanceType":"c1.medium"} "SecurityGroups":"launch-wizard-6""
这不会生成有效的JSON,因为您从帮助文件中复制的块包含来自嵌套对象的虚假右括号,您没有包含该闭括号,缺少右括号,未转义的双引号正在消失。
但是我们并没有真正达到json实际被验证的程度,因为在最后一个大括号之后的那个空间,cli假设SecurityGroups和launch-wizard-6是更多的命令行选项,参数为--launch-specification
:
$ echo $launch
{ImageId:ami-a999999,InstanceType:c1.medium} SecurityGroups:launch-wizard-6
这可能不是你所期望的......所以我们将修复引用,使其看起来像一个长参数,在json有效之后:
从仅生成有效的json 结构 (不一定是内容)的角度来看,基于文档,您最有可能尝试发送的数据实际上看起来像这样:
{"ImageId":"ami-a999999","InstanceType":"c1.medium","SecurityGroups":["launch-wizard-6"]}
在此处检查结构有效的JSON。
修复支撑,逗号和括号,CLI停止抛出该错误,使用以下格式:
$ launch='{"ImageId":"ami-a999999","InstanceType":"c1.medium","SecurityGroups":["launch-wizard-6"]}'
$ echo $launch
{"ImageId":"ami-a999999","InstanceType":"c1.medium","SecurityGroups":["launch-wizard-6"]}
这并不是说由于其他不正确或缺失的原因,API可能不会随后拒绝该请求,但您实际上从未实际向API发送任何内容; 这是在命令行工具中失败的本地验证。
在这种情况下,您必须使用列表:
"SecurityGroups": ["string", ...]
所以
"SecurityGroups":"launch-wizard-6"
成为
"SecurityGroups":["launch-wizard-6"]
无论如何,我现在正在处理CLI,我发现使用外部JSON更有用
以下是使用Python的示例:
myJson="file:///Users/xxx/Documents/Python/xxxxx/spotInstanceInformation.json"
x= subprocess.check_output(["/usr/local/bin/aws ec2 request-spot-instances --spot-price 0.2 --launch-specification "+myJson],shell=True)
print x
输出是:
"SpotInstanceRequests": [
{
"Status": {
"UpdateTime": "2013-12-09T02:41:41.000Z",
"Code": "pending-evaluation",
"Message": "Your Spot request has been submitted for review, and is pending evaluation."
etc etc ....
Doc在这里: http : //docs.aws.amazon.com/cli/latest/reference/ec2/request-spot-instances.html
仅供参考 - 我正在追加文件:///,因为我正在使用MAC。 如果要使用Linux启动bash脚本,可以使用myJson =“/ path / to / file /”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.