จะดูอินสแตนซ์ Amazon EC2 ที่ใช้งานอยู่ในทุกภูมิภาคได้อย่างไร


114

ฉันสลับอินสแตนซ์ระหว่างภูมิภาคต่างๆบ่อยครั้งและบางครั้งฉันลืมปิดอินสแตนซ์ที่กำลังทำงานอยู่จากภูมิภาคอื่น ฉันไม่พบวิธีใดในการดูอินสแตนซ์ที่กำลังทำงานอยู่ทั้งหมดบนคอนโซล Amazon
มีวิธีใดในการแสดงอินสแตนซ์ที่กำลังทำงานอยู่โดยไม่คำนึงถึงภูมิภาคหรือไม่


50
ความจริงที่ว่า AWS GUI ไม่เพียง แต่ให้คุณแสดงรายการอินสแตนซ์ทั้งหมดนั้นเป็นเรื่องโง่จริงๆ
Dan Dascalescu

4
ไม่เหมาะและไม่ชัดเจน แต่คุณสามารถใช้Resource Groups > Tag Editorเป็นตัวเลือก GUI ได้ ดูคำตอบของฉันด้านล่าง
Heinrich Filter

3
@DanDascalescu แน่ใจเหรอ? คุณคิดว่า AWS ทำเงินได้เท่าไหร่จากคนอย่าง OP ที่ลืมปิดอินสแตนซ์ที่กำลังทำงานอยู่?
smartcaveman

2
@DanDascalescu ในฐานะ smartcaveman กล่าวว่าตอนนี้มันอาจจะโง่ถ้าอินสแตนซ์เกลื่อนไปทั่วหลายภูมิภาคและลืมไปแล้วในขณะที่ $ ติ๊กติ๊กติ๊กติ๊กเกอร์สำหรับ Bezos
Eduard Rozenberg

2
@DanDascalescu พวกเขาจะเรียกเก็บเงินจากผู้คนที่ลืมอินสแตนซ์ได้อย่างไรหากพวกเขาแสดงให้เห็นว่ามีอะไรทำงานอยู่ .. ?
EralpB

คำตอบ:


126

ตัวเลือก GUI Resource Groups > Tag Editorไม่ใช่เห็นได้ชัดคือ คุณสามารถค้นหาอินสแตนซ์ทั้งหมดในทุกภูมิภาคได้ที่นี่แม้ว่าอินสแตนซ์จะไม่ถูกแท็กก็ตาม การจับภาพหน้าจอของ


แก้ไข: หน้าจอนี้ได้รับการออกแบบใหม่เมื่อเร็ว ๆ นี้และตอนนี้มีรูปลักษณ์ใหม่และตัวเลือก "ทุกภูมิภาค"


3
ขอบคุณแฮ็คที่ยอดเยี่ยม!
Rob MacDonald

1
นี่เปลี่ยนอีกแล้ว ฉันไม่เห็นบล็อก "ภูมิภาค" ในเครื่องมือนี้อีกต่อไป แต่จะแสดงทุกอย่างใน "ภูมิภาคปัจจุบัน" แทน พระเจ้าเท่านั้นที่รู้ว่ามันถูกกำหนดไว้ที่ใด ... ฉันรู้สึกเบื่อหน่ายกับความงี่เง่าเหล่านี้โดยสมมติว่าฉันมีพนักงานยี่สิบและ 500 เครื่อง
จุดพัก

1
@breakpoint ดูเหมือนว่าตอนนี้พวกเขาได้เพิ่มลิงค์กลับไปยัง Tag Editor ก่อนหน้านี้ที่รองรับการค้นหาแบบหลายภูมิภาค
Heinrich Filter

1
ผู้ชายคนนี้ช่วยชีวิต! ขอบคุณสำหรับการแบ่งปัน! :-D
Lawrence

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 ในฟิลด์ที่ 4: cut -f4


13
เพื่อหลีกเลี่ยงcutคุณสามารถใช้:aws ec2 describe-regions --query Regions[*].[RegionName] --output text
stefansundin

หากใช้โปรไฟล์ให้เพิ่ม --profile profile-name ให้กับคำสั่ง aws ec2 ทั้งสอง
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

ตอนนี้ดูเหมือนจะใช้ไม่ได้แล้ว - You must specify a region. You can also configure your region by running "aws configure".- ดูเหมือนว่าการระบุภูมิภาคจะตรงข้ามกับสิ่งที่ฉันต้องการทำ
Will Sheppard

@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- ทรัพยากรบนคลาวด์ที่แยกออกมา
nir weiner

พวกเขาได้อัปเดตอีกครั้ง ขณะนี้มีทางลัดในแดชบอร์ด EC2 ไปที่ส่วนอินสแตนซ์และคลิกที่ "อินสแตนซ์" มันจะแสดงอินสแตนซ์ที่กำลังทำงานอยู่ทั้งหมดในพื้นที่ที่เลือก
Mindfulgeek

17
  1. ขั้นแรกไปที่คอนโซลการจัดการ AWSแล้วคลิกที่กลุ่มทรัพยากร:

    ป้อนคำอธิบายภาพที่นี่

  2. จากนั้นค้นหาNetwork and Content Deliveryและคลิกที่VPC:

    ป้อนคำอธิบายภาพที่นี่

  3. จากนั้นค้นหาอินสแตนซ์ที่กำลังทำงานอยู่และขยายดูภูมิภาคทั้งหมด ที่นี่คุณสามารถค้นหาอินสแตนซ์ที่กำลังทำงานอยู่ทั้งหมดของทุกภูมิภาค:

    ป้อนคำอธิบายภาพที่นี่


13

ในคอนโซล

ไป VPC แดชบอร์ดhttps://console.aws.amazon.com/vpc/homeและคลิกที่->Running instancesSee 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 แต่มีรายละเอียดน้อยกว่าและเร็วกว่า คุณต้องติดตั้งjqและaws-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 Instance ในประเภททรัพยากร
  6. คลิกค้นหาทรัพยากร

ภาพรวมของโซลูชัน


3

คุณสามารถวิ่งได้DescribeInstances()ทั่วทุกภูมิภาค

นอกจากนี้คุณสามารถ:

  • ทำงานอัตโนมัติผ่านนาฬิกา Lambda และ Cloud
  • สร้าง api endpoint โดยใช้ Lambda และ api gateway และใช้ในโค้ดของคุณ

ตัวอย่างใน NodeJS:

  • สร้างและอาร์เรย์ของภูมิภาค (จุดสิ้นสุด) [ยังสามารถใช้ AWScribRegions () ]
var regionNames = ['us-west-1', 'us-west-2', 'us-east-1', 'eu-west-1', 'eu-central-1', 'sa-east-1 ',' ap-southeastern-1 ',' ap-southeastern-2 ',' ap-Northeast-1 ',' ap-Northeast-2 '];

    regionNames.forEach (ฟังก์ชัน (ภูมิภาค) {
        getInstances (ภูมิภาค);
    });

  • จากนั้นในgetInstancesฟังก์ชันDescribeInstances()สามารถเรียกใช้ได้
ฟังก์ชัน getInstances (ภูมิภาค) {
            EC2.describeInstances (พารามิเตอร์ฟังก์ชัน (ข้อผิดพลาดข้อมูล) {
                ถ้า (err) ส่งคืน console.log ("ข้อผิดพลาดในการเชื่อมต่อกับ AWS ไม่พบอินสแตนซ์ดังกล่าว!");
                data.Reservations.forEach (ฟังก์ชัน (การจอง) {
                // ดำเนินการใด ๆ ที่ตั้งใจไว้
      });
    }

และนอกสนามอย่าลังเลที่จะใช้ ES6 ขึ้นไป

ฉันเขียนฟังก์ชันแลมบ์ดาเพื่อให้คุณได้รับอินสแตนซ์ทั้งหมดในสถานะใด ๆ [กำลังทำงานหยุด] และจากภูมิภาคใด ๆ จะให้รายละเอียดเกี่ยวกับประเภทอินสแตนซ์และพารามิเตอร์อื่น ๆ อีกมากมาย

สคริปต์ทำงานในภูมิภาค AWS และการโทร DescribeInstances()ทั้งหมดเพื่อรับอินสแตนซ์

nodejsคุณเพียงแค่ต้องสร้างฟังก์ชั่นแลมบ์ดากับเวลาทำงาน คุณยังสามารถสร้าง API จากมันและใช้เป็นและเมื่อจำเป็น

นอกจากนี้คุณสามารถดูเอกสารอย่างเป็นทางการของ AWS For DescribeInstancesเพื่อสำรวจตัวเลือกอื่น ๆ อีกมากมาย


1

ฉันสร้างสคริปต์โอเพนซอร์สที่ช่วยให้คุณแสดงรายการอินสแตนซ์ 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

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 ขอบคุณ แต่ข้อมูลประจำตัวเหล่านั้นเป็นตัวยึดตำแหน่งที่หลอกลวง :)
Eduard Rozenberg

1

ในการรันงานพร้อมกันและใช้หลายโปรไฟล์ให้ใช้สคริปต์นี้

#! / bin / ทุบตี
สำหรับฉันในโปรไฟล์ 1 โปรไฟล์ 2
ทำ
    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
    สำหรับภูมิภาคใน `aws --profile $ i ec2 อธิบายภูมิภาค - ข้อความเอาต์พุต | ตัด -f4`
    ทำ
        tput setaf 1; echo "Listing Instances in region $ region"; tput sgr0
        aws ec2 อธิบายอินสแตนซ์ --query 'Reservations [*]. Instances [*]. [Tags [? key == `Name`] .Value, InstanceId]' --profile $ i --region $ region - output text
    เสร็จแล้ว &
เสร็จแล้ว
รอ

ภาพหน้าจอ:

ภาพหน้าจอ


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]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.