如何查看所有区域中所有正在运行的Amazon EC2实例?


112

我经常在不同区域之间切换实例,有时我忘记从其他区域关闭正在运行的实例。我找不到任何方法可以在Amazon控制台上查看所有正在运行的实例。
有什么方法可以显示所有正在运行的实例(无论区域如何)?


47
AWS GUI不仅可以让您列出所有实例,这一事实确实非常愚蠢。
Dan Dascalescu

4
不理想,绝对不明显,但是您可以将其Resource Groups > Tag Editor用作GUI选项。请参阅下面的答案。
Heinrich Filter

3
您确定@DanDascalescu吗?您认为AWS从诸如OP的人那里忘了关闭正在运行的实例,从而赚了多少钱?
smartcaveman

2
@DanDascalescu作为smartcaveman表示,如果在$ zok滴答声为Bezos滴答滴答的情况下,实例散布到许多地区并被遗忘,这绝不是愚蠢的事情。
Eduard Rozenberg

2
@DanDascalescu如果他们只是显示正在运行的内容,他们将如何因忘记实例而向人们收费。
EralpB

Answers:


122

一个非显而易见的GUI选项是Resource Groups > Tag Editor。在这里,您可以找到所有区域中的所有实例,即使未标记实例也是如此。 屏幕截图


编辑:此屏幕最近经过了重新设计,现在具有新外观和“所有区域”选项。


2
谢谢,谢谢!
罗伯·麦克唐纳

1
这又改变了。我不再在此工具中看到“区域”块。相反,它仅显示“当前区域”中的所有内容。上帝只知道那是什么地方...假设我有二十和五百台机器,我就会对这些白痴感到厌烦。
断点

1
@breakpoint看起来像它们现在重新添加了指向以前的支持多区域搜索的标签编辑器的链接。
Heinrich Filter

1
伙计,这是救生员!感谢分享!:-D
劳伦斯

1
如果aws具有针对“所有区域”或类似地区的内置下拉菜单,那就太好了
stevec

62

我认为您当前无法在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


13
为避免出现这种情况cut,您可以使用:aws ec2 describe-regions --query Regions[*].[RegionName] --output text
stefansundin

如果使用配置文件,则在两个 aws ec2命令中添加--profile profile-name 。
卡尔顿

您可以在Windows 10 CMD上使用此命令 FOR /F %G IN ('aws ec2 describe-regions --query Regions[*].[RegionName] --output text') DO (aws ec2 describe-instances --region %G)
Manjula

这似乎不是现在的工作- You must specify a region. You can also configure your region by running "aws configure".-好像指定区域是什么,我想反其道而行之
威尔谢泼德

@WillSheppard您必须首先配置您的区域。例如aws configure set region us-east-1。然后,当您运行时aws ec2 describe-regions,应该没有问题。请参阅答案:stackoverflow.com/a/46577479/360840以及相关问题下的其他答案。
Sabuncu

19

@imTachu解决方案效果很好。要通过AWS控制台执行此操作...

  • AWS控制台
  • 服务
  • 网络与内容交付
  • VPC
  • 查找一个名为“ Running Instances”的块,它将向您显示当前区域
  • 点击下方的“查看所有区域”链接

现在“服务”下没有“网络和内容交付”
Will Sheppard

2
在AWS控制台中:单击“服务”>在文本框中键入“ vpc”,然后选择
VPC

卡尔顿的工作很棒@谢谢
诺伊

他们再次更新了它。EC2仪表板中现在有一个快捷方式。转到实例部分,然后单击“实例”。它将向您显示所选区域中的所有正在运行的实例。
Mindfulgeek

17
  1. 首先转到AWS管理控制台,然后单击资源组:

    在此处输入图片说明

  2. 然后找到Network and Content Delivery并单击VPC

    在此处输入图片说明

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

    在此处输入图片说明


13

在控制台中

转到VPC仪表板https://console.aws.amazon.com/vpc/home,然后单击Running instances-> See all regions

在此处输入图片说明

在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'..

8

每次创建资源时,都使用名称标记它,现在您可以使用资源组在所有区域中使用名称标记查找所有类型的资源。


如果您厌倦了手动标记,请使用Terraform :)
sobi3ch

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

该脚本aws ec2 describe-instances为每个区域(现在为15!)并行运行,并从json输出中仅提取相关位(状态,标签,可用性区域)。在set +m需要这样的时候开始/结束后台进程不报告。

输出示例:

{
  "type": "t2.micro",
  "state": "stopped",
  "tags": [
    {
      "Key": "Name",
      "Value": "MyEc2WebServer"
    },
  ],
  "zone": "eu-central-1b"
}

4

在阅读完所有解决方案并尝试了一堆东西之后,对我有用的是-

  1. 项目清单
  2. 转到资源组
  3. 标签编辑器
  4. 选择所有地区
  5. 在资源类型中选择EC2实例
  6. 点击搜索资源

解决方案快照


3

你可以跑 DescribeInstances()在所有地区。

此外,您可以:

  • 通过Lambda和Cloud watch使它自动化。
  • 使用Lambda和api网关创建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()可以被调用。
函数getInstances(region){
            EC2.describeInstances(params,function(err,data){
                如果(err)返回console.log(“连接到AWS时出错,找不到这样的实例!”);
                data.Reservations.forEach(function(reservation){
                //执行任何预期的操作
      });
    }

当然,当然也可以使用ES6及更高版本。

我编写了一个lambda函数,以获取处于任何状态(运行,已停止)且来自任何区域的所有实例,还提供了有关实例类型和各种其他参数的详细信息。

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

您只需要使用run-time创建一个lambda函数nodejs。您甚至可以从中创建API并在需要时使用它。

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


1

我创建了一个开源脚本,可以帮助您列出所有AWS实例。https://github.com/Appnroll/aws-ec2-instances

这是脚本的一部分,该脚本列出了一个配置文件的实例,并使用jqjson解析将其记录到postgreSQL数据库中:

DATABASE="aws_instances"
TABLE_NAME="aws_ec2"
SAVED_FIELDS="state, name, type, instance_id, public_ip, launch_time, region, profile, publicdnsname"
# collects the regions to display them in the end of script
REGIONS_WITH_INSTANCES=""

for region in `aws ec2 describe-regions --output text | cut -f3`
do
   # this mappping depends on describe-instances command output
   INSTANCE_ATTRIBUTES="{
        state: .State.Name,
        name: .KeyName, type: .InstanceType,
        instance_id: .InstanceId,
        public_ip: .NetworkInterfaces[0].Association.PublicIp,
        launch_time: .LaunchTime,
        \"region\": \"$region\",
        \"profile\": \"$AWS_PROFILE\",
        publicdnsname: .PublicDnsName
   }"

   echo -e "\nListing AWS EC2 Instances in region:'$region'..."
   JSON=".Reservations[] | ( .Instances[] | $INSTANCE_ATTRIBUTES)"
   INSTANCE_JSON=$(aws ec2 describe-instances --region $region)

   if echo $INSTANCE_JSON | jq empty; then
      # "Parsed JSON successfully and got something other than false/null"
      OUT="$(echo $INSTANCE_JSON | jq $JSON)"

      # check if empty
      if [[ ! -z "$OUT" ]] then
        for row in $(echo "${OUT}" | jq -c "." ); do
          psql -c "INSERT INTO $TABLE_NAME($SAVED_FIELDS) SELECT $SAVED_FIELDS from json_populate_record(NULL::$TABLE_NAME, '${row}') ON CONFLICT (instance_id)
            DO UPDATE
            SET state = EXCLUDED.state,
            name = EXCLUDED.name,
            type = EXCLUDED.type,
            launch_time = EXCLUDED.launch_time,
            public_ip = EXCLUDED.public_ip,
            profile = EXCLUDED.profile,
            region = EXCLUDED.region,
            publicdnsname = EXCLUDED.publicdnsname
            " -d $DATABASE
        done

        REGIONS_WITH_INSTANCES+="\n$region"
      else
        echo "No instances"
      fi
   else
        echo "Failed to parse JSON, or got false/null"
   fi
done

1

我的以下脚本基于本文和其他地方的各种技巧。该脚本比起长长的命令行更容易(至少对我来说)。

该脚本假定凭据配置文件存储在文件中,~/.aws/credentials如下所示:

[default]
aws_access_key_id = foobar
aws_secret_access_key = foobar

[work]
aws_access_key_id = foobar
aws_secret_access_key = foobar

脚本:

#!/usr/bin/env bash

#------------------------------------#
# Script to display AWS EC2 machines #
#------------------------------------#

# NOTES:
# o Requires 'awscli' tools (for ex. on MacOS: $ brew install awscli)
# o AWS output is tabbed - we convert to spaces via 'column' command


#~~~~~~~~~~~~~~~~~~~~#
# Assemble variables #
#~~~~~~~~~~~~~~~~~~~~#

regions=$(aws ec2 describe-regions --output text | cut -f4 | sort)

query_mach='Reservations[].Instances[]'
query_flds='PrivateIpAddress,InstanceId,InstanceType'
query_tags='Tags[?Key==`Name`].Value[]'
query_full="$query_mach.[$query_flds,$query_tags]"


#~~~~~~~~~~~~~~~~~~~~~~~~#
# Output AWS information #
#~~~~~~~~~~~~~~~~~~~~~~~~#

# Iterate through credentials profiles
for profile in 'default' 'work'; do

    # Print profile header
    echo -e "\n"
    echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    echo -e "Credentials profile:'$profile'..."
    echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

    # Iterate through all regions
    for region in $regions; do

        # Print region header
        echo -e "\n"
        echo -e "Region: $region..."
        echo -e "--------------------------------------------------------------"

        # Output items for the region
        aws ec2 describe-instances    \
          --profile $profile          \
          --region  $region           \
          --query   $query_full       \
          --output  text              \
          | sed     's/None$/None\n/' \
          | sed     '$!N;s/\n/ /'     \
          | column  -t -s $'\t'

    done
done

1
如果您尚未这样做,建议您使这些凭据无效。
Thiago

@Thiago谢谢,但是这些凭据还是伪造的占位符:)。
爱德华·罗森伯格

1

要并行运行作业并使用多个配置文件,请使用此脚本。

#!/ bin / bash
对于我在profile1 profile2中
做
    OWNER_ID =`aws iam get-user --profile $ i-输出文本| awk -F':''{print $ 5}'`
    tput setaf 2;回显“配置文件:$ i”; tput sgr0
    tput setaf 2;回显“ OwnerID:$ OWNER_ID”; tput sgr0
    for aaws --profile $ i ec2 describe-regions --output text中的区域| 切-f4`
    做
        tput setaf 1; echo“区域$ region中的列出实例”; tput sgr0
        AWS EC2 describe-instances --query'Reservations [*]。Instances [*]。[Tags [?Key ==`Name`] .Value,InstanceId]'--profile $ i --region $ region-输出文本
    完成&
做完了
等待

屏幕截图:

屏幕截图


0

基于@hansaplast代码,我创建了Windows友好版本,该版本支持多个配置文件作为参数。只需将该文件另存为cmd或bat文件即可。您还需要有jq命令。

@echo off 
setlocal enableDelayedExpansion

set PROFILE=%1
IF "%1"=="" (SET PROFILE=default)

echo checkin instances in all regions for %PROFILE% account
FOR /F "tokens=* USEBACKQ" %%F IN (`aws ec2 describe-regions --query Regions[*].[RegionName] --output text --profile %PROFILE%`) DO (
echo === region: %%F
aws ec2 describe-instances --region %%F --profile %PROFILE%| jq ".Reservations[].Instances[] | {type: .InstanceType, state: .State.Name, tags: .Tags, zone: .Placement.AvailabilityZone}"
)

0

您可以使用设计用于枚举云资源(跨区域和跨帐户扫描)的cli工具-https: //github.com/scopely-devops/skew

简短配置后,您可以使用以下代码列出美国所有AWS区域中的所有实例(假设123456789012是您的AWS帐号)。

from skew import scan

arn = scan('arn:aws:ec2:us-*:123456789012:instance/*')
for resource in arn:
    print(resource.data)

0

CRUD AWS资源的好工具。在所有区域中找到[EC2 | RDS | IAM ..]。可以对过滤器结果进行运算(停止)。

python3 awsconsole.py ec2 all // return list of all instances
python3 awsconsole.py ec2 all -r eu-west-1
python3 awsconsole.py ec2 find -i i-0552e09b7a54fa2cf --[terminate|start|stop]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.