بناء تقرير مفصل عن استخدام Azure باستخدام PowerShell

أحد أهم جوانب تشغيل الأعباء في أزور هو تتبع المصاريف. كيف تفعل ذلك هو من خلال تتبع استخدام الموارد باستخدام تقرير استخدام أزور المفصل. في هذا المقال، ستتعلم كيفية إنشاء سكريبت بويرشيل للاستعلام بسهولة عن استخدام الموارد والرسوم في أزور عبر جميع مواردك في أزور حسب التاريخ.

الموارد في أزور تعمل باستمرار على زيادة فاتورتك بطرق عديدة مختلفة. على الرغم من أنه يمكنك رؤية استخدام الموارد عبر بوابة الويب، إلا أنه محدود. ولكن باستخدام بعض الأوامر في بويرشيل، يمكنك بناء تقرير مفيد ليمنحك نظرة عامة على أنواع الاستخدام (وبالتالي المصاريف) التي تقوم بها مواردك في أزور.

تم إنشاء هذا المقال استنادًا إلى فيديو على يوتيوب من TechSnips. إذا كنت متعلمًا بشكل بصري أكثر، فلا تتردد في مشاهدة الفيديو. في غير ذلك، استمر في القراءة!

تحميل التقارير عبر مركز الحسابات في أزور

يمكنك تنزيل العديد من تقارير الاستخدام المختلفة من مركز حساب Azure. مركز حساب Azure هو بوابة ويب تتيح لك عرض تاريخ دورة الفوترة الخاصة بك ، وتنزيل الفواتير ، وعرض نظرة عامة على اشتراك Azure الخاص بك.

على الرغم من أنه يمكنك تنزيل تقارير استخدام Azure عبر مركز حساب Azure ، إلا أنه لا يوجد مرونة في اختيار نطاق التواريخ. لا يمكنك تحديد استخدام لنطاق تواريخ معين لأن التواريخ محددة لتتزامن مع دورة الفوترة الخاصة بك.

يمكنك أن ترى أدناه مثالًا على فترة فوترة وروابط لتنزيل تقارير الاستخدام.

Azure Account Center usage reports

يحتوي هذه التقارير على الكثير من المعلومات الأخرى التي قد لا تحتاجها.

ربما تحتاج إلى تقارير استخدام لآخر 60 يومًا. للحصول على هذه المعلومات باستخدام مركز حساب Azure ، يجب عليك تنزيل تقارير الاستخدام لمدة ثلاثة دورات فوترة على الأقل لتغطية جميع التواريخ المطلوبة.

بعد تنزيل التقارير، سيتعين عليك إزالة البيانات الزائدة. بعد ذلك، ستحتاج إلى إيجاد وسيلة لتجميع تلك البيانات بطريقة ما. لا، شكرًا! هذا فوق الحد.

باستخدام PowerShell ، يمكنك بناء نص أو وظيفة أو وحدة قابلة لإعادة الاستخدام لاستحضار تقارير استخدام موارد Azure. يمكن تشغيل هذه التقارير يدويًا ببضعة أسطر من الأوامر، أو كمهمة مجدولة لتلقائيتها.

المتطلبات الأساسية

هذه مقالة توجيه. لمتابعة، ستحتاج إلى وجود بعض الأمور في مكانها.

كيفية الحصول على بيانات استخدام الموارد

قبل إنشاء النص البرمجي، دعنا نناقش الأساسيات أولاً باستخدام أمر Get-UsageAggregates. هذا هو أمر يسمح لك بجلب استخدام موارد Azure حسب نطاق التاريخ، والمقاييس مثل الساعة أو اليوم وغيرها. أمر Get-UsageAggregates هو الأمر الرئيسي الذي يقوم بمعظم الأعمال السحرية التي ستتعلمها في هذه المقالة.

لتوضيح أمر Get-UsageAggregates، دعنا نقول أنه يتعين عليك العثور على استخدام موارد Azure من 1 أبريل 2019 إلى 12 سبتمبر 2019. يمكن استخدام نفس التقنية لأي نطاق تاريخي. أدناه سترى مقتطفًا للعثور على بيانات الاستخدام استنادًا إلى تلك التواريخ.

$params = @{
    ReportedStartTime = '04-01-19'
    ReportedEndTime = '09-12-19'
    AggregationGranularity = 'Hourly'
    ShowDetails = $true
}
$usageData = Get-UsageAggregates @params
Parameter Value Usage Explanation
ReportStartTime 04-01-19 This is the oldest date you want to retrieve.

(شهر يوم سنة)

ReportEndTime 09-12-19 This is the latest date you want to retrieve.

(شهر يوم سنة)

AggregationGranularity Hourly The granularity of data to return. Valid values are “Daily” and “Hourly”
ShowDetails $True Indicates whether the instance-level details are expanded

إذا كانت هناك بيانات مُرجعة، يجب أن تحصل على النتائج المماثلة لهذا الشاشة أدناه. يمكنك أن ترى أن بيانات الاستخدام الفعلية مخزنة في خاصية UsageAggregations.

Raw UsageAggregations output properties

التعامل مع الصفحة في Get-UsageAggregates

في الجزء الذي يسبق، من الممكن أن يُرجع الأمر العديد من الكائنات خاصةً لفترات تاريخية طويلة. لمنع الضغط الزائد على واجهة برمجة التطبيقات، يعيد أمر Get-UsageAggregates فقط حدًا أقصى يبلغ 1000 نتيجة. إذا كنت قد حفظت المتغير $usageData كما تم شرحه في القسم السابق، يمكنك التحقق من ذلك عن طريق تشغيل هذا الأمر $usageData.UsageAggregations.count.

ماذا لو كان هناك أكثر من 1000 نتيجة؟ ستحتاج إلى بذل مزيد من الجهد.

عند دراسة الخصائص التي يعيدها الأمر Get-UsageAggregates، ستلاحظ وجود خاصية تسمى ContinuationToken كما هو موضح أدناه. يمكنك رؤية أن هذا الرمز هو سلسلة طويلة من الأحرف.

Usage aggregates continuation token

يعمل ContinuationToken كمؤشر إلى مجموعة النتائج التالية. تعمل هذه الخاصية كعلامة مرجعية لمعرفة من أي صفحة يجب الحصول على الدفعة التالية من النتائج.

للتوضيح، احصل على العنصر الأخير في النتيجة السابقة باستخدام $usageData.UsageAggregations[-1] كما هو موضح أدناه. لاحظ أوقات بدء الاستخدام وانتهائه.

First usage object

الآن قم بتمرير نفس المعلمات إلى الأمر Get-UsageAggregates مرة أخرى. ولكن في هذه المرة، استخدم معلمة ContinuationToken واستخدم قيمة خاصية ContinuationToken التي تمت إرجاعها سابقًا. فيما يلي يمكنك رؤية مثال عن كيفية القيام بذلك.

$params = @{
    ReportedStartTime      = '04-01-19'
    ReportedEndTime        = '09-12-19'
    AggregationGranularity = 'Hourly'
    ShowDetails            = $true
    ContinuationToken      = $usageData.ContinuationToken
}
$usageData = Get-UsageAggregates @params

الآن احصل على العنصر الأخير في مصفوفة خاصية UsageAggregations باستخدام $usageData.UsageAggregations[-1]. قارنه بالنتيجة السابقة للتأكد من أن النتائج الجديدة مختلفة.

يجب أن يكون التماثل مشابهًا لتلك التي تراها أدناه. لاحظ أن فترات التواريخ تبعد بينها سبعة أيام. باستخدام ContinuationToken، استعدت الصفحة الثانية من النتائج.

Second page of usage reports
First page of usage reports

إنشاء وظيفة تقارير استخدام موارد Azure

يجب أن تعرف كيف يعمل التصفح وكيفية استخدام خاصية ومعلمة ContinuationToken. ولكن ماذا لو كان هناك عشرات أو حتى مئات الآلاف من النتائج لاسترجاعها؟ لا يمكن أن يكون استخدام الرمز يدويا بهذه الطريقة أمرًا جيدًا.

لنقم ببناء سكربت PowerShell يدير هذا الطلب التصفحي لنا ويتيح لنا بعض المرونة الإضافية. سيسمح لك هذا السكربت بتوفير معلماتك الخاصة ومعالجة متطلبات التصفح. كما سيمنحك المرونة لتوسيعه في المستقبل لأداء مهام أخرى إذا لزم الأمر.

بناء المعلمات

ابنِ أولا بعض أطُر المهام. فيما يلي مثال على وظيفة تسمى Get-AzureUsage. تحتوي هذه الوظيفة على ثلاث معلمات قد تكون مألوفة.

كانت هذه المعلمات محددة سابقًا في cmdlet Get-UsageAggregates نفسه. أنت الآن تقوم ببناء وظيفة “تعليف” التي ستمرر القيم إلى هذا الcmdlet.

Function Get-AzureUsage {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$FromTime,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$ToTime,
 
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Hourly', 'Daily')]
        [string]$Interval = 'Daily'
    )

فيما يلي جدول يقدم مزيدًا من المعلومات حول كل هذه المعلمات.

Parameter Usage
FromTime This is a mandatory parameter that accepts a DateTime value. The value represents the oldest date of the report.
ToTime This is a mandatory parameter that accepts a DateTime value. The value represents the latest date of the report.
Interval This is a non-empty parameter that accepts two possible values: ‘Daily’ and ‘Hourly’. The default value is Daily. This represents the granularity of the report to return.

استعلام استخدام الموارد

بمجرد إنشاء الوظيفة وتحديد جميع المعلمات، حان الوقت لملء بقية الوظيفة.

يمكنك أن ترى بقية وظيفة Get-AzureUsage أدناه. تأكد من النظر إلى التعليقات لفهم أعماق ما يقوم به الكود.

Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    ## بدء حلقة do/while للتعامل تلقائيًا مع رمز الاستمرارية
    do {    
        ## تعريف جميع المعلمات لتمريرها إلى Get-UsageAggregates
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        ## استخدم معلمة ContinuationToken فقط إذا كان هذا ليس أول تشغيل
        if ((Get-Variable -Name usageData -ErrorAction Ignore) -and $usageData) {
            Write-Verbose -Message "Querying usage data with continuation token $($usageData.ContinuationToken)..."
            $params.ContinuationToken = $usageData.ContinuationToken
        }
        $usageData = Get-UsageAggregates @params
        $usageData.UsageAggregations | Select-Object -ExpandProperty Properties
    } while ('ContinuationToken' -in $usageData.psobject.properties.name -and $usageData.ContinuationToken)
}

النص النهائي للنص (قابل للنسخ واللصق)

بعد وضع المعلمات والشفرة الوظيفية معًا، ستحصل على نص كامل كما هو موضح أدناه. يمكنك الآن نسخ هذا إلى النص الخاص بك أو مباشرةً إلى نافذة PowerShell للاختبار.

Function Get-AzureUsage {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$FromTime,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$ToTime,
 
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Hourly', 'Daily')]
        [string]$Interval = 'Daily'
    )
    
    Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    do {    
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        if ((Get-Variable -Name usageData -ErrorAction Ignore) -and $usageData) {
            Write-Verbose -Message "Querying usage data with continuation token $($usageData.ContinuationToken)..."
            $params.ContinuationToken = $usageData.ContinuationToken
        }
        $usageData = Get-UsageAggregates @params
        $usageData.UsageAggregations | Select-Object -ExpandProperty Properties
    } while ('ContinuationToken' -in $usageData.psobject.properties.name -and $usageData.ContinuationToken)
}

استعلام استخدام الموارد باستخدام وظيفتنا

حان الوقت الآن لاختبار الوظيفة. يمكنك إما لصق الشفرة أعلاه في نص و نقطة المصدر في جلسة PowerShell الحالية الخاصة بك أو نسخ الشفرة مباشرةً إلى جلسة PowerShell الخاصة بك.

نصيحة: إذا كنت تستخدم PowerShell ISE أو Visual Studio Code، يمكنك تحديد الشفرة التي تريد استيرادها والضغط على F8. في غير ذلك الحال، من الأسهل نسخ ولصق الشفرة في جلسة PowerShell.

الآن قم بتشغيل الوظيفة بتقديم قيمة لـ FromTime و ToTime والفاصل الزمني الذي ترغب في رؤية النتائج على شكله. يمكنك رؤية مثال أدناه على كيفية استدعاء هذه الوظيفة.

$usage = Get-AzureUsage -FromTime '08-12-19' -ToTime '09-12-19' -Interval Hourly -Verbose

بمجرد تشغيل هذا، ستظهر لك بعض الرسائل الشاملة إذا اخترت استخدام البارامتر الاختياري Verbose. كما يمكنك أن ترى من المثال أدناه، فإن عدد تقارير الاستخدام هو 4،659. ستلاحظ أيضًا أن الدالة قامت بتشغيل الدالة Get-UsageAggregates أربع مرات للحصول على الصفحة التالية من النتائج في كل مرة. تمكنت الدالة من القيام بذلك لأنها استخدمت قيمة ContinuationToke الصحيحة لكل استدعاء.

Automatically handling the continuation token

تصفية التقرير

في هذه المرحلة، يتضمن التقرير تفاصيل الاستخدام لجميع أنواع الموارد المتاحة. ولكن يمكنك تصفية التقرير لعرض فقط المورد الذي ترغب فيه. للقيام بذلك، يمكنك إما توسيع الدالة للسماح بتلك الوظائف أو توجيه الإخراج إلى سكربتات PowerShell الأخرى.

إن الإخراج من الدالة Get-Azure يعيد جميع أنواع الموارد ولكنه يشتمل على خاصية تسمى MeterCategory. تحدد هذه الخاصية نوع المورد الذي تمثله الصف. على سبيل المثال، للحصول على تقارير استخدام آلات افتراضية Azure فقط، يمكنك تجميع جميع الكائنات التي لها MeterCategory بقيمة Virtual Machines باستخدام سكربت Group-Object.

سيعيد سكربت Group-Object عدد الصفوف الموجودة في الإخراج كخاصية Count. ثم، عند تحديد الإخراج ليكون فقط لخاصية Count و Name (قيمة MeterCategory)، يمكنك رؤية عدد صفوف تقارير الاستخدام الموجودة لجميع أنواع الموارد Azure.

كما يمكنك رؤية في الصورة أدناه ، هناك 768 إدخالًا لـ الآلات الافتراضية في التقرير.

Azure Virtual Machines resource usage

لتوسيع مفهوم عملية التصفية هذه قليلاً ، يمكنك أيضًا الاستفادة من الخصائص المحسوبة لإنشاء إخراج أكثر ودية كما هو موضح أدناه.

$usage | Where-Object {$_.MeterCategory -eq 'Virtual Machines'} | `
Format-Table UsageStartTime,UsageEndTime,@{n="VM Name";e={(($_.InstanceData | `
ConvertFrom-Json).'Microsoft.Resources'.resourceURI -split "/")[-1]}},Quantity,Unit

عند تشغيل مقتطف الشفرة أعلاه ، يجب أن ترى إخراجًا مشابهًا لما تراه أدناه.

Advanced filtering for Get-AzureUsage

أفكار لتوسيع التقرير

باستخدام الشفرة في هذه المقالة ، يمكنك توسيع وظائف الأداة التي تم إنشاؤها بعدة طرق مختلفة.

يمكنك تصدير الناتج إلى ملف CSV والتلاعب بالبيانات في Excel أو إنشاء تقرير HTML باستخدام ConvertTo-HTML أو وحدة القوة EnhancedHTML2.

توسيع الأمور قليلاً وإضافة إخطار بالبريد الإلكتروني إلى النتيجة أيضًا باستخدام cmdlet Send-MailMessage. العالم مفتوح لك!

ملخص

في هذه المقالة ، تعلمت كيفية استرداد تقارير استخدام الموارد من Azure. كما تعلمت كيفية بناء وظيفة PowerShell مخصصة لتوتير العملية واستخدام تلك الوظيفة للتلاعب في الناتج.

المرة القادمة التي تواجه فيها فاتورة Azure غير متوقعة، ليس لديك أي عذر! قم ببناء وظيفة PowerShell للاستعلام عن استخدام موارد Azure في أي وقت لمراقبة تلك الفاتورة.

قراءة متعمقة

Source:
https://adamtheautomator.com/azure-detailed-usage-report/