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

218

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


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

3
AWS最近推出了Amazon EC2全局视图,最初支持实例、VPC、子网、安全组和卷。
要查看所有正在运行的实例,请转到EC2或VPC控制台,并单击左上角的“EC2全局视图”。

enter image description here

然后点击“全局搜索”选项卡,并按“资源类型”筛选并选择“实例”。不幸的是,这将显示所有状态的实例:
pending
running
stopping
stopped
shutting-down
terminated

enter image description here


2
我的脚本如下,基于这篇文章和其他地方的各种提示。对于我来说,这个脚本比长长的命令行更容易理解。
该脚本假设凭据配置文件存储在~/.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谢谢你,但那些凭据无论如何都是虚假的占位符 :)。 - Ed R

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

#!/bin/bash
for i in profile1 profile2
do
    OWNER_ID=`aws iam get-user --profile $i --output text | awk -F ':' '{print $5}'`
    tput setaf 2;echo "Profile : $i";tput sgr0
    tput setaf 2;echo "OwnerID : $OWNER_ID";tput sgr0
    for region in `aws --profile $i ec2  describe-regions --output text | cut -f4`
    do
        tput setaf 1;echo  "Listing Instances in region $region";tput sgr0
        aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Tags[?Key==`Name`].Value , InstanceId]' --profile $i --region $region --output text
    done &
done
wait

截图:

screenshot


1

1

1
我创建了一个开源脚本,帮助您列出所有AWS实例。https://github.com/Appnroll/aws-ec2-instances 这是脚本的一部分,它可以为一个配置文件列出实例,并使用jq进行JSON解析将它们记录到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

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]

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

您可以使用专为枚举云资源(跨区域和跨账户扫描)设计的命令行工具 - 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)

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