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?
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
.
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
}
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
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
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
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
saat membaca wilayah; melakukan
echo "Mengeksekusi " $@ " pada " $region ":"
aws --wilayah $wilayah $@
selesai
rm /tmp/regions.txt
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
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.
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
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):