问题描述
我需要停止启动多个 ec2 并在前后运行几个命令,在同一管理服务器上使用 bash,因此无需 ssh。我知道如何启动和停止 ec2,例如:
启动实例:
#! /bin/bash
aws ec2 start-instances --instance-ids i-1a1234
停止实例:
#! /bin/bash
aws ec2 stop-instances --instance-ids i-1a1234
我想出了如何通过运行列出所有 ec2 id :i.e.:
aws ec2 describe-instances --filters "Name=tag:Name,Values=Test: Instance 1" --query 'Reservations[].Instances[].[InstanceId] --output text
我的问题是:
-
如何停止/启动多个 ec2。
-
如何获取特定的 ec2 并运行命令以在停止之前禁用服务并在 ec2 启动后启用它。
解决方法
就像:
aws ec2 describe-instances --filters "Name=tag:Name,Values=Test: Instance 1" --query 'Reservations[].Instances[].[InstanceId] --output text
列出 aws 上的实例。以下将显示实例的公共 DNS 名称
aws ec2 describe-instances --filters "Name=tag:Name,Values=Test: Instance 1" --query 'Reservations[].Instances[].[PublicDnsName] --output text
如果实例在没有公共访问权限的情况下运行,则可以为私有 IP 地址列表运行以下命令:
aws ec2 describe-instances --filters "Name=tag:Name,Values=Test: Instance 1" --query 'Reservations[].Instances[].[PrivateIpAddress] --output text
然后可以在循环中使用 aws 命令来处理每个条目:
for var in $(aws ec2 describe-instances --filters "Name=tag:Name,Values=Test: Instance 1" --query 'Reservations[].Instances[].[PrivateIpAddress] --output text)
do
ssh -i somekey.pem "ec2-user@$var" ......... # Loop through each IP address and run ssh
done
for var in $(aws ec2 describe-instances --filters "Name=tag:Name,Values=Test: Instance 1" --query 'Reservations[].Instances[].[InstanceId] --output text)
do
aws ec2 stop-instances --instance-ids "$var" # Loop through each instance id and stop.
done