Aws-cli: Bagaimana cara mendeskripsikan instance dari semua wilayah?

Dibuat pada 8 Feb 2016  ·  17Komentar  ·  Sumber: aws/aws-cli

Saya mencoba mengalihkan alur kerja saya ke cli dari panel kontrol aws, tetapi saya mengalami masalah yang sangat aneh. Saya tahu cara mendeskripsikan instance dalam suatu wilayah, tetapi bagaimana cara menjelaskan semua instance saya terlepas dari wilayah? Atau setidaknya dapatkan output dari semua wilayah EC2 sehingga saya dapat melakukan ini secara terprogram satu per satu (yaitu sesuatu seperti aws ec2 list-regions ).

Ini sangat aneh karena cli tampaknya menggunakan nama yang berbeda untuk wilayah daripada panel kontrol. Pertama, tampaknya semua instance saya sedang dimulai di wilayah "us-west-2" (setidaknya sejauh ini), tetapi saya tidak dapat menemukan string itu di mana pun di panel kontrol. Bahkan, sepertinya saya tidak dapat menemukan di mana pun yang mencantumkan wilayah default saya sama sekali.

Apakah ada perintah di dalam aws yang melakukan ini?

Komentar yang paling membantu

Untuk orang-orang yang tiba di sini dari Google, berikut adalah satu cara untuk membuat daftar semua instans Anda di semua wilayah dengan AWS CLI (berdasarkan diskusi di atas):

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

Semua 17 komentar

Konsol tidak memungkinkan Anda untuk membuat daftar semua instance terlepas dari wilayah, tetapi menyembunyikan pengidentifikasi wilayah dengan teks yang lebih deskriptif. us-west-2 adalah pusat data yang terletak di Oregon, misalnya. Ada drop-down di kanan atas halaman konsol yang memungkinkan Anda memilih wilayah (gambar di bawah).

Untuk sebagian besar layanan, saat ini tidak ada cara terprogram untuk menemukan wilayah mana yang tersedia, sehingga Anda perlu merujuk ke daftar ini . EC2 adalah salah satu pengecualian, karena menyediakan fungsi describe-regions . Karena CLI adalah pembungkus API layanan, kami tidak dapat melakukan pencarian multi-wilayah kecuali jika layanan mendukungnya (S3, misalnya, sebagian besar agnostik wilayah). Anda harus memberikan argumen --region kepada region untuk melakukan kueri di region yang berbeda.

Wilayah default Anda terletak di file konfigurasi Anda ( ~/.aws/config pada sistem UNIX), dan dapat ditampilkan dan disetel dengan perintah aws configure .

regions

Untuk orang-orang yang tiba di sini dari Google, berikut adalah satu cara untuk membuat daftar semua instans Anda di semua wilayah dengan AWS CLI (berdasarkan diskusi di atas):

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

Bagi Anda yang juga tidak ingin mengurai JSON dengan bola mata Anda, berikut adalah versi tambahan yang menggunakan jq untuk memberi Anda ringkasan yang lebih langsung.

for region in `aws ec2 describe-regions --output text | cut -f3`
do
     echo -e "\nListing Instances in region:'$region'..."
     aws ec2 describe-instances --region $region | jq '.Reservations[] | ( .Instances[] | {state: .State.Name, name: .KeyName, type: .InstanceType, key: .KeyName})'
done

Contoh keluaran:

Listing Instances in region:'us-west-1'...
{
  "state": "stopped",
  "name": "scanner-1",
  "type": "t2.micro",
  "key": "scan1"
}
{
  "state": "stopped",
  "name": "cors",
  "type": "t2.micro",
  "key": "cors"
}
{
  "state": "stopped",
  "name": "scanner-2",
  "type": "t2.medium",
  "key": "scan2"
}

@nonbeing Bagus! Jika Anda sering menggunakannya, Anda harus mempertimbangkan untuk menjadikannya alias .

Opsi lainnya adalah menggunakan modul AWS PowerShell .NET Core, yang berjalan secara native di Linux, Mac, dan Windows.

foreach ($Region in (Get-AWSRegion)) {
  Get-EC2Instance -Region $Region.Region
}

Hasil

GroupNames    : {}
Groups        : {}
Instances     : {asdf}
OwnerId       : 123
RequesterId   : 123
ReservationId : r-asdf

GroupNames    : {}
Groups        : {}
Instances     : {asdf}
OwnerId       : 123
RequesterId   : 123
ReservationId : r-asdf

GroupNames    : {}
Groups        : {}
Instances     : {asdf}
OwnerId       : 123
RequesterId   : 123
ReservationId : r-asdf

Output menggunakan Format-Tabel

Secara default, dalam versi modul AWS PowerShell saat ini, instans EC2 dikembalikan dalam format "daftar" PowerShell. Namun, ini mudah diubah ke format tabel, menggunakan perintah Format-Table .

$InstanceList = @()
foreach ($Region in (Get-AWSRegion)) {
  $InstanceList += Get-EC2Instance -Region $Region.Region -ProfileName CIDBTest
}
$InstanceList | Format-Table

Hasil

GroupNames Groups Instances   OwnerId      RequesterId  ReservationId       RunningInstance
---------- ------ ---------   -------      -----------  -------------       ---------------
{}         {}     {asdf222}   123          123                  r-123               {asdf222}
{}         {}     {asdf222}   123          123                  r-123               {asdf222}
{}         {}     {asdf222}   123          123                  r-123               {asdf222}

Anda dapat menggunakan jq , jika Anda ingin menambahkan lebih banyak dependensi, atau cukup gunakan --query bawaan di AWS CLI:
aws --profile whatever ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType]' [ [ "running", "t2.small" ], [ "running", "t2.small" ], [ "running", "m3.medium" ] ]

saat membaca -rr ; daerah awal gema : $r ; lakukan saat membaca -ri ; lakukan echo instance-id: $i 2>&1 ; done < <(aws ec2 mendeskripsikan-instance --query "Reservations[].Instances[].InstanceId" --region $r --profile prd|perl -nl -e 's/\s+/\n/g;print '); echo "wilayah hentikan: $r" ; selesai < <(aws ec2 mendeskripsikan-wilayah --output teks --profil prd| cut -f 3)


for region in `aws ec2 describe-regions --output text | cut -f3`
do
     echo -e "\nListing Instances in region:'$region'..."
     aws ec2 describe-instances --region $region | jq '.Reservations[] | ( .Instances[] | {state: .State.Name, name: .KeyName, Tag_Name: .Tags[].Value,type: .InstanceType, key: .KeyName})'
done

Hanya solusi lain yang baru saja saya tulis!
Skrip kecil ini dapat menjalankan perintah di semua wilayah
Contoh penggunaan:
sudo ./aws-x.sh ec2 mendeskripsikan-contoh
sudo ./aws-x.sh ec2 mendeskripsikan-instance | grep PrivateDnsName

!/bin/bash

echo "Mendapatkan Wilayah yang Tersedia AWS:"
sudo aws ec2 mendeskripsikan-wilayah --region eu-west-2 |grep RegionName |cut -d '"' -f 4 > /tmp/regions.txt
cat /tmp/regions.txt

Mulai eksekusi

saat membaca wilayah; melakukan
echo "Mengeksekusi " $@ " pada " $region ":"
aws --wilayah $wilayah $@
selesai

membersihkan

rm /tmp/regions.txt

!/bin/bash

echo Meraih instance di semua wilayah, harap tunggu..
untuk wilayah di aws ec2 describe-regions --output text | cut -f3
melakukan
aws ec2 mendeskripsikan-instance --region $region --query 'Reservations[].Instances[].[State.Name,InstanceType,PublicIpAddress,Placement.AvailabilityZone]' --output text
selesai

------keluaran-------

./get-instances.sh

Mengambil instance di semua wilayah, harap tunggu..

menjalankan t2.micro 54.93.120.174 eu-central-1b

menjalankan t2.micro 54.86.91.202 us-east-1d

Bagi Anda yang juga tidak ingin mengurai JSON dengan bola mata Anda, berikut adalah versi tambahan yang menggunakan jq untuk memberi Anda ringkasan yang lebih langsung.

aws cli mendukung parameter "query" , yang melakukan hal ini sebagai bawaan.

Terima kasih obijan! Saya mulai menggunakan jq beberapa bulan yang lalu dan itu mengubah hidup saya :)

Perhatikan bahwa AWS Cli Docs masih merekomendasikan JQ untuk penggunaan lebih lanjut:

Jika Anda membutuhkan lebih banyak fitur lanjutan yang mungkin tidak dapat dilakukan dengan --query, Anda dapat memeriksa jq, prosesor JSON baris perintah. Anda dapat mengunduhnya dan menemukan tutorial resminya di http://stedolan.github.io/jq/

IMHO, --query masih layak untuk dilihat jika berfungsi untuk kasus penggunaan kueri Anda karena didukung secara asli oleh AWS CLI. Opsi ini telah ditambahkan di aws cli v. 1.2.0 yang dirilis pada 2013/10/18 , jadi Anda harus memiliki opsi ini kecuali Anda memiliki CLI versi lama.

Jika Anda lebih suka menggunakan param --query , perhatikan bahwa ia menggunakan JMESPath sebagai bahasa kuerinya (halaman beranda memiliki penguji JMESPath langsung). Tutorialnya juga layak untuk dilihat.


Contoh Perbandingan dari kueri serupa

Kueri berikut mencantumkan instans RDS di wilayah default menggunakan aws cli, mem-parsing output json darinya menggunakan JQ dan JMESPath

Misalnya, kueri serupa tampaknya jauh lebih mudah dibaca OOTB di JMESPath:

# Using Jquery
aws  rds describe-db-instances --output json | jq -r '.DBInstances[] | "\(.DBInstanceIdentifier) -> \(.DBInstanceStatus) ( \(.DBInstanceClass), \(.Endpoint.Address):\(.Endpoint.Port)  ) "  '

## Outputs
someinstancename -> available ( db.t2.small, xxxxx.rds.amazonaws.com:1234 )
## Show a list of properties for DBInstances which have a status containing the word 'avail' 
aws rds describe-db-instances --output json --query "DBInstances[?contains(DBInstanceStatus, 'avail')].[DBInstanceIdentifier, DBInstanceClass, DBInstanceStatus, Endpoint.[Address, Port]]"

## Outputs
[
    [
        "someinstancename",
        "db.t2.small",
        "available",
        [
            "xxxxx.rds.amazonaws.com",
            1234
        ]
    ]
]

Jika opt-in-not-required adalah kolom keluaran ke-3 saat Anda menjalankan aws ec2 describe-regions --output text , Anda dapat mengubah cut -f3 menjadi cut -f4 seperti:

for region in `aws ec2 describe-regions --output text | cut -f4`
do

done

Mungkin cara yang lebih kuat adalah dengan menggunakan kueri JMESPath sebagai berikut:

for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text)
do

done

Anda juga dapat melakukan penguraian lebih lanjut untuk memfilter ke wilayah yang Anda inginkan dengan grep .
Misalnya, setelah menginstal awscli-aliases , tambahkan berikut ini ke ~/.aws/cli/alias untuk membuat daftar instance Anda:

list-instances =
  !f() {
    echo "Filtering by \`$1\`"
    for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text | tr "\t" "\n" | grep "$1")
      do
        echo "\nListing Instances in region:'$region'..."
        aws ec2 describe-instances --region $region \
          --output table \
          --query "Reservations[*].Instances[*].{
                    Instance:InstanceId,
                    Type:InstanceType,
                    AZ:Placement.AvailabilityZone,
                    KeyName:KeyName,
                    Name:Tags[?Key==\`Name\`]|[0].Value,
                    Project:Tags[?Key==\`project\`]|[0].Value,
                    IP:PublicIpAddress,
                    State:State.Name,
                    CPUcores:CpuOptions.CoreCount,
                    CPUThreads:CpuOptions.ThreadsPerCore
                }"
      done
  }; f

Penggunaan:

$ aws list-instances

Terapkan filter ke kode wilayah, misalnya us untuk wilayah AS:

$ aws list-instances 'us'

untuk wilayah di aws ec2 describe-regions --output text | cut -f3
melakukan
echo -e "\nMendaftarkan Instance di region:'$region'..."
aws ec2 mendeskripsikan-instance --region $region | grep berjalan > file.txt
file kucing.txt | wc -l
selesai

image

Apakah halaman ini membantu?
0 / 5 - 0 peringkat