使用Python自动创建EC2

时间:2015-03-25 15:04:20

标签: windows python-2.7 amazon-web-services amazon-ec2 subprocess

我正在尝试使用Python脚本和Windows任务计划程序在EC2上自动创建Windows映像。到目前为止,我将此作为我的工作基线代码。

awsstring1 = 'aws ec2 create-image --instance-id i-49a0a7b3 --name "Node.Js.ServerTest " --output text  --description "Node.Js.ServerTest" --no-reboot'
subprocess.call(awsstring1)

现在我想在描述和名称上附加日期和时间作为附加信息。见下文

datestring = time.strftime("%c")
awsstring1 = 'aws ec2 create-image --instance-id i-49a0a7b3 --name "Node.Js.ServerTest %s" --output text  --description "Node.Js.ServerTest %s" --no-reboot' %(datestring, datestring))
subprocess.call(awsstring1)

现在代码运行时没有错误,但它不会创建图像。是因为我创建awsstring1的方式吗?如果是这样,有没有解决这个问题?

此外,有没有办法在运行subprocess.call命令后获取输出?例如,我想捕获

的输出
subprocess.call('ls -a')

编辑: 当运行下面的代码时,它应该具有所创建图像的输出。

 awsstring1 = 'aws ec2 create-image --instance-id i-9bedb4b4 --name "rwong_TestInstance" --output text  --description "rwong_TestInstance" --no-reboot' 
 subprocess.call(awsstring1)

输出:

 {
   "ImageId": "ami-5731123e"
 }

我需要那个ami-5731123e部分。如果有办法将它发送到一个很棒的文本文件。当我需要运行类似的命令来获取IP地址时,获取输出也会对我有所帮助。

Edit2:我编写了这段代码,用于将输出保存到文本文件,但是我收到“返回非零退出状态255”的错误。没有开头'和结束'的命令将在命令行上运行。是否有关于如何使用subprocess.check_call格式化这样的字符串的指南?

test = 'aws ec2 create-image --instance-id i-563b6379 --name "rwong_TestInstance" --output text  --description "rwong_TestInstance" --no-reboot'
test2 = r' > "V:\rwong\Work Files\Python\test.txt"' 
subprocess.check_call(test + test2)

1 个答案:

答案 0 :(得分:0)

如果您阅读docs for subprocess.call,则会发现您必须将多个参数作为list传递,而不是作为subprocess.call的字符串传递。

这意味着您应该执行以下操作:

awsstring1 = 'aws ec2 create-image --instance-id i-49a0a7b3 --name "Node.Js.ServerTest" --output text --description "Node.Js.ServerTest" --no-reboot'
subprocess.call(awsstring1.split())

请注意,这假设您希望按空格分割参数,这是shell默认工作的方式。或者,您可以通过将subprocess.call作为关键字参数传递来强制shell=True使用shell。默认值为False。但是,这是不安全的,因为它会让你接受shell注入攻击。

另外,为了在不使用shell的情况下工作,你可能需要删除你的内部双引号,除非你希望那些字面上传递给aws命令,我怀疑。

此外,我会使用subprocess.check_call代替subprocess.call来验证命令是否成功运行,而不是报告错误代码。

通常,要调试这些类型的问题,您应该在执行之前立即print完整命令。然后尝试在命令行上手动执行它。如果手动执行它不起作用,则需要修复命令。如果手动执行它确实有效,那么它可能与用户或环境有关。在这两种情况下,请确保您以同一用户身份运行。您还可以使用env命令打印出当前的环境变量。然后使用diff进行比较。另一种可能性是提示与否的shell转义之间的差异,这就是为什么我之前提到双引号。

最后,要回答有关捕获输出的问题:subprocess.check_output将执行您想要的操作。