尝试在一个简单的脚本中启动几个spot实例,在AWS文档和aws spot- instances帮助输出中提供的语法以ec2或JSON语法列出。如何从shell脚本中输入符合JSON语法的参数?
aws --版本
aws-cli/1.2.6 Python/2.6.5 Linux/2.6.21.7-2.fc8xen
aws spot-instances帮助--在“启动规范”的开头列出了ec2语法
-- 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
替换安全组号的结果相同。
亚马逊网络服务ec2 describe-instance和亚马逊网络服务ec2启动实例工作得很好,所以环境和账户信息都是正确设置的,但我需要利用现货定价。
实际上,用户文档中列出的任何内容都不能正常工作:http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-RequestSpotInstances.html
谢谢,
发布于 2013-12-09 10:46:24
在这种情况下,您必须使用列表:
"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
仅供参考-我附加file:///是因为我使用的是MAC。如果你使用Linux启动你的bash脚本,你可以使用myJson="/path/to/file/“
发布于 2013-12-04 03:07:05
这里的第一个问题是引用和格式化:
$ 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,here。
修复大括号、逗号和括号后,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发送任何内容的地步;这是命令行工具中的本地验证失败。
https://stackoverflow.com/questions/20358439
复制相似问题