أحاول تبديل سير العمل الخاص بي إلى cli من لوحة تحكم aws ، لكنني واجهت مشكلة غريبة جدًا. أعرف كيفية وصف الحالات الموجودة داخل منطقة ما ، ولكن كيف يمكنني وصف جميع المثيلات الخاصة بي بغض النظر عن المناطق؟ أو على الأقل أحصل على مخرجات من جميع مناطق ec2 حتى أتمكن من القيام بذلك برمجيًا واحدًا تلو الآخر (أي شيء مثل aws ec2 list-regions
).
إنه أمر غريب جدًا لأن cli يبدو أنه يستخدم أسماء مناطق مختلفة عن لوحة التحكم. أولاً ، يبدو أن جميع مثيلاتي بدأت في المنطقة "us-west-2" (على الأقل حتى الآن) ، لكن لا يمكنني العثور على هذه السلسلة في أي مكان في لوحة التحكم. في الواقع ، لا يمكنني العثور على أي مكان يسرد منطقتي الافتراضية على الإطلاق.
هل هناك أمر داخل aws يقوم بهذا؟
لا تسمح لك وحدة التحكم بسرد جميع المثيلات بغض النظر عن المنطقة ، لكنها تخفي معرفات المنطقة بنص وصفي أكثر. us-west-2
هو مركز البيانات الموجود في ولاية أوريغون ، على سبيل المثال. توجد قائمة منسدلة في الجزء العلوي الأيمن من صفحة وحدة التحكم تتيح لك تحديد منطقة (في الصورة أدناه).
بالنسبة لمعظم الخدمات ، لا توجد حاليًا طريقة آلية لاكتشاف المناطق المتاحة ، ولذا ستحتاج إلى الرجوع إلى هذه القائمة . EC2 هو أحد الاستثناءات ، على الرغم من أنه يوفر الدالة describe-regions
. نظرًا لأن CLI عبارة عن غلاف فوق واجهات برمجة تطبيقات الخدمة ، فلا يمكننا إجراء عمليات بحث متعددة المناطق إلا إذا كانت الخدمة تدعمها (S3 ، على سبيل المثال ، في الغالب لا تعرف المنطقة). سيتعين عليك تزويد المنطقة بالوسيطة --region
للاستعلام في منطقة مختلفة.
تقع منطقتك الافتراضية في ملف التكوين الخاص بك ( ~/.aws/config
على أنظمة UNIX) ، ويمكن عرضها وتعيينها باستخدام الأمر aws configure
.
بالنسبة للأشخاص الذين يصلون إلى هنا من Google ، إليك طريقة واحدة لسرد جميع مثيلاتك عبر جميع المناطق باستخدام AWS CLI (بناءً على المناقشة أعلاه):
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
بالنسبة لأولئك منكم الذين لا يرغبون أيضًا في تحليل JSON باستخدام مقل العيون ، إليك نسخة ملحقة تستخدم jq لمنحك ملخصًا أكثر دقة.
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
مثال الإخراج:
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"
}
تضمين التغريدة إذا كنت تستخدم ذلك كثيرًا ، فيجب أن تفكر في جعله اسمًا مستعارًا .
هناك خيار آخر يتمثل في استخدام الوحدة النمطية AWS PowerShell .NET Core ، والتي تعمل أصلاً على Linux و Mac و 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
افتراضيًا ، في الإصدار الحالي من وحدة AWS PowerShell النمطية ، يتم إرجاع مثيلات EC2 بتنسيق "قائمة" PowerShell. ومع ذلك ، يمكن تغيير هذا بسهولة إلى تنسيق جدولي ، باستخدام الأمر 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}
يمكنك استخدام jq
، إذا كنت ترغب في إضافة المزيد من التبعيات ، أو استخدم فقط --query
المدمج في AWS CLI:
aws --profile whatever ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType]'
[
[
"running",
"t2.small"
],
[
"running",
"t2.small"
],
[
"running",
"m3.medium"
]
]
أثناء القراءة -rr ؛ منطقة بدء الصدى: $ r ؛ تفعل أثناء القراءة -ri ؛ فعل معرّف مثيل الصدى: $ i 2> & 1؛ تم <<(aws ec2 وصف الحالات - الاستعلام "الحجز []. المثيلات []. InstanceId" - المنطقة $ r --profile prd | perl -nl -e 's / \ s + / \ n / g؛ print ') ؛ صدى "منطقة التوقف: $ r" ؛ تم <<(aws ec2 وصف المناطق - إخراج النص - الملف الشخصي prd | قص -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
مجرد حل آخر كتبته للتو!
يمكن لهذا البرنامج النصي الصغير تنفيذ الأوامر في جميع المناطق
أمثلة الاستخدام:
sudo ./aws-x.sh ec2 وصف الحالات
sudo ./aws-x.sh ec2 وصف الحالات | grep PrivateDnsName
صدى "الحصول على مناطق AWS Avaiable:"
sudo aws ec2 وصف المناطق - المنطقة eu-west-2 | grep RegionName | cut -d '"" -f 4> /tmp/regions.txt
cat /tmp/regions.txt
أثناء قراءة المنطقة ؛ فعل
صدى "تنفيذ" $ @ "على" $ region ":"
aws - المنطقة $ المنطقة $ @
فعله
rm /tmp/regions.txt
حالات انتزاع الصدى في جميع المناطق ، يرجى الانتظار ..
للمنطقة بـ aws ec2 describe-regions --output text | cut -f3
فعل
وصف aws ec2 -ثيلات - المنطقة $ المنطقة - الاستعلام 'الحجوزات []. المثيلات []. [State.Name، InstanceType، PublicIpAddress، Placement.AvailabilityZone]' - إخراج النص
فعله
بالنسبة لأولئك منكم الذين لا يرغبون أيضًا في تحليل JSON باستخدام مقل العيون ، إليك نسخة ملحقة تستخدم jq لمنحك ملخصًا أكثر دقة.
يدعم aws cli معلمة "الاستعلام" ، والتي تقوم بهذه الأشياء كبناء.
شكرا obijan! لقد بدأت في استخدام jq قبل بضعة أشهر وغيرت حياتي :)
لاحظ أن AWS Cli Docs لا تزال توصي باستخدام JQ لاستخدام أكثر تقدمًا:
إذا كنت بحاجة إلى المزيد من الميزات المتقدمة التي قد لا تكون ممكنة مع --query ، فيمكنك التحقق من jq ، وهو معالج JSON بسطر الأوامر. يمكنك تنزيله والعثور على البرنامج التعليمي الرسمي على http://stedolan.github.io/jq/
IMHO ، --query
لا يزال يستحق البحث عما إذا كان يعمل لحالة استخدام الاستعلام الخاصة بك لأنه مدعوم أصلاً بواسطة AWS CLI. تمت إضافة هذا الخيار 2013/10/18 ، لذلك يجب أن يكون لديك بالتأكيد هذا الخيار ما لم يكن لديك إصدار قديم من CLI.
إذا كنت تفضل استخدام المعلمة --query
، فلاحظ أنها تستخدم البرنامج التعليمي يستحق الاهتمام أيضًا.
تسرد الاستعلامات التالية مثيلات RDS في المنطقة الافتراضية باستخدام aws cli ، مع تحليل إخراج json منه باستخدام JQ و JMESPath
على سبيل المثال ، يبدو أن طلب بحث مشابه أكثر قابلية للقراءة في 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
]
]
]
إذا كان opt-in-not-required
هو العمود الثالث للمخرجات عند تشغيل aws ec2 describe-regions --output text
، يمكنك تغيير cut -f3
إلى cut -f4
كما يلي:
for region in `aws ec2 describe-regions --output text | cut -f4`
do
done
ربما تكون الطريقة الأكثر فعالية هي استخدام استعلام JMESPath على النحو التالي:
for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text)
do
done
يمكنك أيضًا إجراء بعض التحليل الإضافي لتصفية المناطق التي تريدها باستخدام grep
.
على سبيل المثال ، بعد تثبيت الأسماء المستعارة لـ awscli ، أضف ما يلي إلى ~/.aws/cli/alias
لسرد مثيلاتك :
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
استعمال:
$ aws list-instances
قم بتطبيق عامل تصفية على رمز المنطقة ، على سبيل المثال us
لمناطق الولايات المتحدة:
$ aws list-instances 'us'
للمنطقة بـ aws ec2 describe-regions --output text | cut -f3
فعل
echo -e "\ n سرد المثيلات في المنطقة: '$ region' ..."
أوس ec2 وصف الحالات - المنطقة $ المنطقة | grep تشغيل> file.txt
cat file.txt | مرحاض -l
فعله
التعليق الأكثر فائدة
بالنسبة للأشخاص الذين يصلون إلى هنا من Google ، إليك طريقة واحدة لسرد جميع مثيلاتك عبر جميع المناطق باستخدام AWS CLI (بناءً على المناقشة أعلاه):