如何查看跨所有区域的所有正在运行的亚马逊EC2实例?

218

我经常在不同的区域之间切换实例,有时候会忘记关闭来自其他区域的正在运行的实例。我找不到任何方法在Amazon控制台上查看所有正在运行的实例。
是否有一种方式可以显示所有正在运行的实例,而不考虑其所在的区域?


4
不是最理想的选择,也不是显而易见的方法,但你可以使用“资源组 > 标记编辑器”作为图形用户界面选项。请参考下面的答案。 - Heinrich Filter
3
@DanDascalescu 你确定吗?你认为像OP这样忘记关闭运行实例的人给AWS赚了多少钱?请注意,本翻译仅涉及内容翻译,不包含任何解释。 - smartcaveman
2
@DanDascalescu,就像smartcaveman所说的那样,如果实例在许多地区分散并被遗忘,而$计时器为Bezos不断滴答滴答地计时,这绝对不是愚蠢的做法。 - Ed R
2
@DanDascalescu如果他们只显示正在运行的实例,那么他们如何向忘记关闭实例的人收费呢? - EralpB
19个回答

207

2021年11月更新:AWS最近推出了Amazon EC2 Global View,初步支持实例、VPC、子网、安全组和卷。

请查看公告文档以获取更多详细信息。


资源组控制台中一个不明显的GUI选项是标签编辑器(Tag Editor)。在这里,您可以找到所有跨所有区域的实例,即使这些实例没有被打上标签。 屏幕截图


1
@breakpoint 看起来他们现在又添加了一个链接到之前支持多区域搜索的标签编辑器。 - Heinrich Filter
2
如果AWS有一个内置的下拉菜单,可以选择“所有区域”或类似选项,那就太好了。 - stevec
2
@user5783745,屏幕最近已经更新,并添加了“所有区域”选项。 - Heinrich Filter
2021年7月:https://eu-west-3.console.aws.amazon.com/resource-groups/tag-editor/find-resources - chris
似乎仍然没有可用的AWS CLI或Python SDK命令(不需要通过所有区域循环) - fabiog1901
显示剩余3条评论

88

我认为目前在AWS GUI中无法这样做。但是以下是使用AWS CLI列出您所有区域内实例的方法:

for region in `aws ec2 describe-regions --region us-east-1 --output text | cut -f4`
do
     echo -e "\nListing Instances in region:'$region'..."
     aws ec2 describe-instances --region $region
done

摘自此处(如果您想查看完整的讨论)。

此外,如果您遇到如下信息:

必须指定区域。 您还可以通过运行“aws configure”配置您的区域。

您可以使用 aws configure set region us-east-1 进行设置,感谢 @Sabuncu 提供的评论。

更新

现在(2019 年),应该在第四个字段上使用 cut 命令:cut -f4


15
为了避免“截断”(cut),您可以使用以下命令:aws ec2 describe-regions --query Regions[*].[RegionName] --output text - stefansundin
如果使用配置文件,请在两个aws ec2命令中都添加--profile profile-name。 - Carlton
您可以在Windows 10 CMD上使用此命令:FOR /F %G IN ('aws ec2 describe-regions --query Regions[*].[RegionName] --output text') DO (aws ec2 describe-instances --region %G) - Manjula
现在似乎无法运行--“您必须指定一个地区。 您也可以通过运行“aws configure”来配置您的地区。”--似乎指定一个地区与我想要做的相反。 - Will Sheppard
@WillSheppard,您首先需要配置您的区域,例如 aws configure set region us-east-1。然后,当您运行 aws ec2 describe-regions 时,就不应该有任何问题了。请参见答案:https://dev59.com/r14b5IYBdhLWcg3wbA-B#46577479,以及相关问题下的其他答案。 - Sabuncu
显示剩余2条评论

65

在控制台中

前往VPC控制台https://console.aws.amazon.com/vpc/home,点击运行的实例 -> 查看所有区域.

输入图片说明

在CLI中

添加这个命令到.bashrc。重新加载它:source ~/.bashrc,然后运行它。

注意:除了aws CLI外,您还需要安装jq

function aws.print-all-instances() {
  REGIONS=`aws ec2 describe-regions --region us-east-1 --output text --query Regions[*].[RegionName]`
  for REGION in $REGIONS
  do
    echo -e "\nInstances in '$REGION'..";
    aws ec2 describe-instances --region $REGION | \
      jq '.Reservations[].Instances[] | "EC2: \(.InstanceId): \(.State.Name)"'
  done
}

示例输出:

$ aws.print-all-instances 

Listing Instances in region: 'eu-north-1'..
"EC2: i-0548d1de00c39f923: terminated"
"EC2: i-0fadd093234a1c21d: running"

Listing Instances in region: 'ap-south-1'..

Listing Instances in region: 'eu-west-3'..

Listing Instances in region: 'eu-west-2'..

Listing Instances in region: 'eu-west-1'..

Listing Instances in region: 'ap-northeast-2'..

Listing Instances in region: 'ap-northeast-1'..

Listing Instances in region: 'sa-east-1'..

Listing Instances in region: 'ca-central-1'..

Listing Instances in region: 'ap-southeast-1'..

Listing Instances in region: 'ap-southeast-2'..

Listing Instances in region: 'eu-central-1'..

Listing Instances in region: 'us-east-1'..

Listing Instances in region: 'us-east-2'..

Listing Instances in region: 'us-west-1'..

Listing Instances in region: 'us-west-2'..

3
在2021年,VPC管理控制台是我发现所有运行EC2实例的地区最好的方法。感谢sobi3ch。 - Paul Watson
喜欢它!谢谢! - undefined

32

VPC 仪表板:

  1. 首先前往VPC 仪表板

  2. 然后找到运行中的实例并展开查看所有区域。在这里,您可以找到所有区域的正在运行的实例:

    图片描述

EC2 全局视图:


此菜单已更改。我找不到正在运行的实例。 - Reza Taba
@RezaTaba 我不知道你为什么找不到,但我仍然可以看到“运行中的实例”。我已经更新了我的回答,希望它能有所帮助。 - Md Riadul Islam
1
非常感谢。我猜问题出在我试图在手机上访问它。在电脑上找到了它。 - Reza Taba

22

@imTachu 的解决方案很好。通过AWS控制台进行操作...

  • AWS控制台
  • 服务
  • 网络和内容传递
  • VPC
  • 查找名为“正在运行的实例”的块,这将显示您当前的区域
  • 点击下面的“查看所有区域”链接

1
现在“服务”下没有“网络和内容传递”。 - Will Sheppard
2
在 AWS 控制台:点击“服务”> 在文本框中输入“vpc”,然后选择 VPC- 隔离的云资源。 - nir weiner
他们又更新了。现在在EC2仪表板中有一个快捷方式。进入实例部分,然后点击“实例”。它会显示您在所选区域中所有正在运行的实例。 - Mindfulgeek
抱歉Will - 它在那里!但你可以直接进入VPC。 Mindfulgeek - 你错过了重点:“按地区”在EC2中一直存在,但OP想要跨所有地区查看。 VPC方法允许您查看是否在各个地区都有。 - MikeW

10
每次创建资源时,请给它打上一个名称标签,现在您可以使用“资源组”功能,在所有区域中查找带有名称标签的所有类型的资源。

这是做到的方式。没有疯狂的循环或多个查询。资源组将为您整合所有这些! - rusty

8

阅读了所有解决方案并尝试了许多方法后,对我有效的一个方法是:

  1. 列出项目
  2. 进入资源组
  3. 标记编辑器
  4. 选择所有区域
  5. 在资源类型中选择EC2实例
  6. 单击搜索资源

解决方案快照


7

基于imTachus的答案但更简洁,而且更快。您需要安装jqaws-cli

set +m
for region in $(aws ec2 describe-regions --query "Regions[*].[RegionName]" --output text); do 
  aws ec2 describe-instances --region "$region" | jq ".Reservations[].Instances[] | {type: .InstanceType, state: .State.Name, tags: .Tags, zone: .Placement.AvailabilityZone}" &
done; wait; set -m

脚本在每个区域(现在有15个!)并行运行aws ec2 describe-instances,并从JSON输出中提取仅相关部分(状态、标记、可用区)。需要使用set +m,以便背景进程在开始/结束时不报告。 示例输出:
{
  "type": "t2.micro",
  "state": "stopped",
  "tags": [
    {
      "Key": "Name",
      "Value": "MyEc2WebServer"
    },
  ],
  "zone": "eu-central-1b"
}

5
您可以在所有地区运行DescribeInstances()
此外,您还可以:
  • 通过Lambda和Cloud watch自动化它。
  • 使用Lambda和api gateway创建api端点并在您的代码中使用它。
NodeJS示例:
var regionNames = ['us-west-1', 'us-west-2', 'us-east-1', 'eu-west-1', 'eu-central-1', 'sa-east-1', 'ap-southeast-1', 'ap-southeast-2', 'ap-northeast-1', 'ap-northeast-2'];
regionNames.forEach(function(region) { getInstances(region); });
  • 然后,在getInstances函数中,可以调用DescribeInstances()
function getInstances(region) {
            EC2.describeInstances(params, function(err, data) {
                if (err) return console.log("连接AWS出错,未找到此实例!");
                data.Reservations.forEach(function(reservation) {
                //进行任何操作
      });
    }

当然,可以使用ES6及以上版本。

我编写了一个Lambda函数,可以获取所有状态[running,stopped]和来自任何区域的实例,还将提供有关实例类型和各种其他参数的详细信息。

脚本在所有AWS区域上运行,并调用DescribeInstances()来获取实例。

您只需要创建一个运行时为nodejs的Lambda函数即可。 您甚至可以将其创建为API,并根据需要使用它。

此外,您可以查看AWS官方文档DescribeInstances以探索更多选项。


请阅读以下链接的代码以理解本文内容:https://github.com/jparasha/Get_All_Ec2_Instances_Across_All_Regions/blob/master/getInstances.js - stuart

4

一个快速的bash单行命令,可以打印出所有区域中的所有实例ID:

$ aws ec2 describe-regions --query "Regions[].{Name:RegionName}" --output text |xargs -I {} aws ec2 describe-instances --query Reservations[*].Instances[*].[InstanceId] --output text --region {}

# Example output
i-012344b918d75abcd
i-0156780dad25fefgh
i-0490122cfee84ijkl
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接