首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spot-instances ec2问题

spot-instances ec2问题
EN

Stack Overflow用户
提问于 2013-12-04 02:05:19
回答 2查看 2.5K关注 0票数 1

尝试在一个简单的脚本中启动几个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)指定额外的启动实例信息。

代码语言:javascript
复制
   JSON Syntax:

       {
         "ImageId": "string",
         "KeyName": "string",
         }, ....
         "EbsOptimized": true|false,
         "SecurityGroupIds": ["string", ...],
         "SecurityGroups": ["string", ...]
       }

我已经尝试了以下所有可能的组合,添加和移动括号、引号、更改选项等,但都没有用。下面的变量$launch的正确格式是什么才能起作用?其他命令变体-- "ec2-request-spot-instances“在我的环境中不起作用,如果我尝试用-p替换--spot-price,它也不起作用。

代码语言:javascript
复制
#!/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

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2013-12-09 10:46:24

在这种情况下,您必须使用列表:

代码语言:javascript
复制
"SecurityGroups": ["string", ...]

所以

代码语言:javascript
复制
"SecurityGroups":"launch-wizard-6"

成为

代码语言:javascript
复制
"SecurityGroups":["launch-wizard-6"]

无论如何,我现在正在处理CLI,我发现使用外部JSON更有用

下面是一个使用Python的示例:

代码语言:javascript
复制
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

输出结果为:

代码语言:javascript
复制
"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/“

票数 1
EN

Stack Overflow用户

发布于 2013-12-04 03:07:05

这里的第一个问题是引用和格式化:

代码语言:javascript
复制
$ launch="{"ImageId":"ami-a999999","InstanceType":"c1.medium"} "SecurityGroups":"launch-wizard-6""

这将不会生成有效的JSON,因为您从帮助文件复制的块包含一个来自未包含的嵌套对象的虚假右大括号,右大括号丢失,未转义的双引号消失。

但我们并没有真正达到验证json的地步,因为在最后一个括号后的空格中,cli假设SecurityGroups和launch-wizard-6是--launch-specification参数后面的更多命令行选项:

代码语言:javascript
复制
$ echo $launch
{ImageId:ami-a999999,InstanceType:c1.medium} SecurityGroups:launch-wizard-6

这可能不是你所期望的..。因此,在json有效之后,我们将修复引号,使其看起来像一个长参数:

从只生成有效的json结构(不一定是内容)的角度来看,根据文档,您最有可能尝试发送的数据实际上如下所示:

代码语言:javascript
复制
{"ImageId":"ami-a999999","InstanceType":"c1.medium","SecurityGroups":["launch-wizard-6"]}

检查它在结构上有效的JSON,here

修复大括号、逗号和括号后,CLI将停止引发该错误,并采用以下格式:

代码语言:javascript
复制
$ 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发送任何内容的地步;这是命令行工具中的本地验证失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20358439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档