在使用 bash 脚本停止其中一个 aws ec2 之前禁用服务

问题描述

我需要停止启动多个 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

我的问题是:

  1. 如何停止/启动多个 ec2。

  2. 如何获取特定的 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