我在AWS中使用了许多“一次性”服务器,我们正在努力降低这些服务器的成本。
最初,我们正在寻找一个相当基本的'awsec2 stop all'命令,从我们知道将全天候运行的服务器按计划运行。
在检查AWS记录的内容后,我们需要提取所有当前正在运行的实例,获取这些实例的ID,然后将它们传递到命令中,而不是简单地声明我希望所有实例都关闭。
是否有更好的方法来收集这些ID,例如只是能够发出'全部停止'?
感谢帮助。
答案 0 :(得分:6)
AWS CLI使用--query选项提供内置JSON解析。此外,您可以使用--filter选项仅对正在运行的实例执行stop命令。
aws ec2 describe-instances \
--filter Name=instance-state-name,Values=running \
--query 'Reservations[].Instances[].InstanceId' \
--output text | xargs aws ec2 stop-instances --instance-ids
答案 1 :(得分:3)
这是未经测试的,但应该使用AWS Tools for Powershell:
@(Get-EC2Instance) | % {$_.RunningInstance} | % {Stop-EC2Instance $_.InstanceId}
用简单的英语,上面的行获取EC2实例对象的集合(Amazon.EC2.Model.Reservation),为每个对象(与实例相关的各种属性的集合)获取RunningInstance属性,并使用它来获取每个InstanceId并停止实例。
这些功能映射如下:
请务必查看Stop-EC2Instance
的帮助...有一些您可能感兴趣的有用参数,例如-Terminate
和-Force
。
答案 2 :(得分:2)
这个单行将停止所有的实例:
for i in $(aws ec2 describe-instances | jq '.Reservations[].Instances[].InstanceId'); do aws ec2 stop-instances --instance-ids $i; done
本发明提供:
AWS-CLI
已成群(http://aws.amazon.com/cli/)jq
json解析器。 (http://stedolan.github.io/jq/)..是的,上面的语法是针对Linux Bash shell特有的。你可以模仿windows上的powershell,并找出解析json的powersehll方法。
答案 3 :(得分:0)
如果有人想做通过AWS DataPipeline描述的 Peter Moon :
aws ec2 describe-instances --region eu-west-1 --filter Name=instance-state-name,Values=running --query 'Reservations[].Instances[].InstanceId' --output text | xargs aws ec2 stop-instances --region eu-west-1 --instance-ids
它基本上是相同的命令,但您必须在--region
之后和describe-instances
之后添加stop-instances
才能使其正常工作。注意通常包含在区域名称中的a / b / c。如果包含在这里,这似乎会导致错误。