亚马逊网络服务

试图在一个简单的脚本中启动两个Spot实例,AWS文档和aws ec2 request-spot-instances帮助输出中提供的语法以JAVA或JSON语法列出。 如何从shell脚本中输入JSON语法下的参数?

aws - 版本

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" }"

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

$ launch="{"ImageId":"ami-a999999","InstanceType":"c1.medium"} "SecurityGroups":"launch-wizard-6""

这不会生成有效的JSON,因为您从帮助文件中复制的块包含一个来自嵌套对象的虚假结束大括号,您没有包含该结尾大括号,结束大括号缺失,并且未转义的双引号正在消失。

但是,我们没有真正得到到的JSON实际上是被验证了一点,因为与最后一个大括号后的空间,CLI是假设SecurityGroups并推出精灵-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

仅供参考 - 我正在追加file:///,因为我使用的是MAC。 如果你使用Linux启动你的bash脚本,你可以使用myJson =“/ path / to / file /”

链接地址: http://www.djcxy.com/p/67163.html

上一篇: amazon web services

下一篇: AWS EC2 Spot Instance PHP add tag when making spot request