簡體   English   中英

如何查看所有區域中所有正在運行的 Amazon EC2 實例?

[英]How to see all running Amazon EC2 instances across all regions?

我經常在不同區域之間切換實例,有時我忘記關閉來自不同區域的正在運行的實例。 我找不到任何方法來查看亞馬遜控制台上所有正在運行的實例。
有什么方法可以顯示所有正在運行的實例而不考慮區域?

2021 年 11 月編輯:AWS 最近推出了Amazon EC2 全局視圖,初步支持實例、VPC、子網、安全組和卷。

有關詳細信息,請參閱公告文檔


一個不明顯的 GUI 選項是資源組控制台中的標記編輯器 在這里,您可以找到所有區域的所有實例,即使這些實例沒有被標記。 的屏幕截圖

我認為您目前無法在 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 年)應該在第 4 個字段上應用 cut 命令: cut -f4

在控制台中

轉到 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'..
  1. 首先轉到AWS 管理控制台並單擊資源組:

    在此處輸入圖像描述

  2. 然后找到Network and Content Delivery並點擊VPC

    在此處輸入圖像描述

  3. 然后找到正在運行的實例並展開查看所有區域。 在這里您可以找到所有區域的所有正在運行的實例:

    在此處輸入圖像描述

@imTachu 解決方案效果很好。 要通過 AWS 控制台執行此操作...

  • AWS 控制台
  • 服務
  • 網絡和內容交付
  • 專有網絡
  • 查找名為“Running Instances”的塊,這將顯示當前區域
  • 點擊下方的“查看所有地區”鏈接

每次創建資源時,使用名稱標記它,現在您可以使用資源組在所有區域中查找具有名稱標記的所有類型的資源。

在閱讀了所有解決方案並嘗試了一堆東西之后,對我有用的是 -

  1. 項目清單
  2. 轉到資源組
  3. 標簽編輯器
  4. 選擇所有地區
  5. 在資源類型中選擇 EC2 實例
  6. 點擊搜索資源

解決方案快照

基於 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"
}

您可以跨所有區域運行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()
function getInstances(region) {
            EC2.describeInstances(params, function(err, data) {
                if (err) return console.log("Error connecting to AWS, No Such Instance Found!");
                data.Reservations.forEach(function(reservation) {
                //do any operation intended
      });
    }

當然,請隨意使用 ES6 及更高版本。

我編寫了一個 lambda 函數來獲取處於任何狀態 [運行、停止] 和來自任何區域的所有實例,還將提供有關實例類型和各種其他參數的詳細信息。

該腳本跨所有 AWS 區域運行並調用DescribeInstances()以獲取實例。

您只需要使用運行時nodejs創建一個 lambda 函數。 您甚至可以從中創建 API 並在需要時使用它。

此外,您可以查看 AWS 官方文檔,了解DescribeInstances以探索更多選項。

下面是我的腳本,基於這篇文章和其他地方的各種提示。 該腳本比長命令行更容易理解(至少對我而言)。

該腳本假定憑證配置文件存儲在文件~/.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

一個快速的bash oneliner命令,用於打印所有區域中的所有實例 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
...

AWS 最近推出了 Amazon EC2 Global View,初步支持實例、VPC、子網、安全組和卷。

要查看所有正在運行的實例,請轉到 EC2 或 VPC 控制台,然后單擊左上角的EC2 Global View

在此處輸入圖像描述

然后單擊Global Search選項卡並按Resource type過濾並選擇Instance 不幸的是,這將顯示所有狀態的實例:

pending
running
stopping
stopped
shutting-down
terminated

在此處輸入圖像描述

我創建了一個開源腳本,可以幫助您列出所有 AWS 實例。 https://github.com/Appnroll/aws-ec2-instances

這是腳本的一部分,它列出了一個配置文件的實例,將它們記錄到 postgreSQL 數據庫中,並使用jq進行 json 解析:

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

要並行運行作業並使用多個配置文件,請使用此腳本。

#!/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

截屏:

截屏

不知道這個選項在這里多久了,但是您可以通過搜索EC2 Global View所有內容的全局視圖

https://console.aws.amazon.com/ec2globalview/home#

全局視圖搜索

使用bash-my-aws

region-each instances

基於@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}"
)

您可以使用專為枚舉雲資源(跨區域和跨帳戶掃描)而設計的 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)

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]

我經常在不同區域之間切換實例,有時我忘記從其他區域關閉正在運行的實例。 我找不到任何方法可以在Amazon控制台上查看所有正在運行的實例。
有什么方法可以顯示所有正在運行的實例,而不管其區域是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM