Aws-cli: كيف يمكن وصف الحالات من جميع المناطق؟

تم إنشاؤها على ٨ فبراير ٢٠١٦  ·  17تعليقات  ·  مصدر: aws/aws-cli

أحاول تبديل سير العمل الخاص بي إلى cli من لوحة تحكم aws ، لكنني واجهت مشكلة غريبة جدًا. أعرف كيفية وصف الحالات الموجودة داخل منطقة ما ، ولكن كيف يمكنني وصف جميع المثيلات الخاصة بي بغض النظر عن المناطق؟ أو على الأقل أحصل على مخرجات من جميع مناطق ec2 حتى أتمكن من القيام بذلك برمجيًا واحدًا تلو الآخر (أي شيء مثل aws ec2 list-regions ).

إنه أمر غريب جدًا لأن cli يبدو أنه يستخدم أسماء مناطق مختلفة عن لوحة التحكم. أولاً ، يبدو أن جميع مثيلاتي بدأت في المنطقة "us-west-2" (على الأقل حتى الآن) ، لكن لا يمكنني العثور على هذه السلسلة في أي مكان في لوحة التحكم. في الواقع ، لا يمكنني العثور على أي مكان يسرد منطقتي الافتراضية على الإطلاق.

هل هناك أمر داخل aws يقوم بهذا؟

التعليق الأكثر فائدة

بالنسبة للأشخاص الذين يصلون إلى هنا من 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

ال 17 كومينتر

لا تسمح لك وحدة التحكم بسرد جميع المثيلات بغض النظر عن المنطقة ، لكنها تخفي معرفات المنطقة بنص وصفي أكثر. us-west-2 هو مركز البيانات الموجود في ولاية أوريغون ، على سبيل المثال. توجد قائمة منسدلة في الجزء العلوي الأيمن من صفحة وحدة التحكم تتيح لك تحديد منطقة (في الصورة أدناه).

بالنسبة لمعظم الخدمات ، لا توجد حاليًا طريقة آلية لاكتشاف المناطق المتاحة ، ولذا ستحتاج إلى الرجوع إلى هذه القائمة . EC2 هو أحد الاستثناءات ، على الرغم من أنه يوفر الدالة describe-regions . نظرًا لأن CLI عبارة عن غلاف فوق واجهات برمجة تطبيقات الخدمة ، فلا يمكننا إجراء عمليات بحث متعددة المناطق إلا إذا كانت الخدمة تدعمها (S3 ، على سبيل المثال ، في الغالب لا تعرف المنطقة). سيتعين عليك تزويد المنطقة بالوسيطة --region للاستعلام في منطقة مختلفة.

تقع منطقتك الافتراضية في ملف التكوين الخاص بك ( ~/.aws/config على أنظمة UNIX) ، ويمكن عرضها وتعيينها باستخدام الأمر aws configure .

regions

بالنسبة للأشخاص الذين يصلون إلى هنا من 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]' - إخراج النص
فعله

------انتاج-------

./get-instances.sh

حالات الاستيلاء في جميع المناطق ، يرجى الانتظار ..

تشغيل t2.micro 54.93.120.174 eu-central-1b

تشغيل t2.micro 54.86.91.202 us-east-1d

بالنسبة لأولئك منكم الذين لا يرغبون أيضًا في تحليل 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
فعله

image

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات