בנה דוח שימוש מפורט של Azure עם PowerShell

אחד הנושאים החשובים ביותר בהפעלת עומסי עבודה ב-Azure הוא לעקוב אחר ההוצאות. איך אפשר לעשות זאת? דרך מעקב אחר שימוש במשאבים עם דוח שימוש מפורט של Azure. במאמר זה, תלמד כיצד ליצור סקריפט PowerShell כדי לשאול בקלות את שימוש המשאבים והחיובים ב-Azure על ידי תאריך.

משאבים ב-Azure רצים תמיד את החשבון שלך בדרכים רבות. אם כי, ניתן לראות את שימוש המשאבים דרך פורטל אינטרנט, זה מוגבל. אך באמצעות כמה פקודות PowerShell, ניתן לבנות דוח שימוש שיעניק לך מבט כללי על סוגי השימוש (וכך גם הוצאות) של משאבי ה-Azure שלך.

מאמר זה נוצר מתוך סרטון YouTube של TechSnips. אם אתה לומד טוב יותר באופן חזותי, תרגיש חופשי לבדוק את הסרטון. אחרת, תמשיך לקרוא!

הורדת דוחות דרך מרכז החשבון של Azure

שים לב שאתה יכול להוריד דוחות שונים רבים של שימוש ממרכז החשבון של חשבון Azure. מרכז החשבון של Azure הוא פורטל אינטרנט המאפשר לך לראות את ההיסטוריה של מחזור החיוב שלך, להוריד חשבוניות ולראות סקירה כללית של המינוי שלך ב-Azure.

אם כי ניתן להוריד דוחות שימוש של Azure דרך מרכז החשבון של Azure, אין גמישות בבחירת טווח תאריכים. אין אפשרות להגביל את השימוש לטווח תאריכים מסוים משום שהתאריכים קבועים להתאמה עם מחזור החיוב שלך.

תוכל לראות למטה דוגמה לתקופת חיוב וקישורים להורדת דוחות שימוש.

Azure Account Center usage reports

בתוך דוחות השימוש הללו יש המון מידע אחר שאולי אינך זקוק אליו.

אולי תזדקק לדוחות שימוש ל60 הימים האחרונים. כדי לקבל את המידע הזה דרך מרכז החשבון של Azure, יהיה עליך להוריד דוחות שימוש לפחות שלושה מחזורי חיוב כדי לכסות את כל התאריכים הנדרשים שלך.

לאחר הורדת הדוחות, יהיה עליך להסיר את הנתונים המיותרים. לאחר מכן, יהיה עליך למצוא דרך לאחד את הנתונים באופן כלשהו. לא תודה! זה יותר מדי עומס.

באמצעות PowerShell, ניתן לבנות סקריפט, פונקציה או מודול שימושי למשימת הוצאת דוחות שימוש במשאבי Azure. אלו, בתמורה, יכולים להירץ ידנית עם מספר שורות של פקודות, או כמשימה מתוזמנת להפעלה אוטומטית.

דרישות מקדימות

זהו מאמר הליך. כדי להמשיך, יהיה עליך להכין כמה דברים מראש.

איך לקבל נתוני שימוש במשאבים

לפני שניצור את התסריט, בואו נדבר תחילה על היסודות באמצעות פקודת cmdlet Get-UsageAggregates. זו פקודת cmdlet שמאפשרת לך למשוך את שימוש המשאבים ב-Azure לפי טווח תאריכים, מדדים כמו שעתי או יומי ועוד. פקודת cmdlet Get-UsageAggregates היא הפקודת cmdlet הראשית שמשיכה רוב הקסמים שתלמדו במאמר זה.

כדי להדגים את פקודת ה-cmdlet 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

בסעיף שמעלה, נפוץ לקבל הרבה אובייקטים בעיקר בטווחי תאריכים ארוכים. כדי למנוע עמוסה ב-API, הפקודת cmdlet Get-UsageAggregates מחזירה רק עד 1000 תוצאות. אם שמרת את המשתנה $usageData ככל שנדונה בסעיף הקודם, אתה יכול לאשר זאת באמצעות הרצת הפקודה הזו $usageData.UsageAggregations.count.

כמה יהיו התוצאות אם יש יותר מ-1000 תוצאות? תצטרך לעשות קצת יותר עבודה.

כאשר אתה בודק את המאפיינים שנמסרו על ידי Get-UsageAggregates, תשים לב למאפיין הנקרא ContinuationToken כפי שמוצג למטה. ניתן לראות שה-token הוא מחרוזת ארוכה של תווים.

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

עליך לדעת איך פיענוח הדפים עובד וכיצד להשתמש במאפיין קודם המשך ובפרמטר. אבל מה קורה אם יש עשרות או אפילו מאות אלפי תוצאות לשחזור? שימוש ידני באסון באמצעות הקוד בדרך כלל לא יעבוד היטב.

בואו נבנה סקריפט PowerShell שמתייחס לדרישת הדפים עבורנו ומאפשר גם גמישות נוספת. סקריפט זה יאפשר לך לספק את הפרמטרים המותאמים אישית שלך ולטפל בדרישת הדפים. זה יעניק לך גם את הגמישות להרחיבו בעתיד כדי לבצע משימות נוספות אם יהיה צורך.

בניית הפרמטרים

ראשית, צרו מסגרת פונקציה. להלן תוכלו לראות דוגמה לפונקציה בשם Get-AzureUsage. לפונקציה זו יש שלושה פרמטרים שעשויים להיראות מוכרים.

בעבר, פרמטרים אלו הוגדרו על ידי הפקודה Get-UsageAggregates עצמה. אתה כעת בונה פונקציה "מעטפת" שתעביר ערכים לפקודה זו.

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 כדי לטפל באופן אוטומטי באמצעות ה-token המשך
    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)
}

שאילתת שימוש במשאבים עם הפונקציה שלנו

כעת הגיע הזמן לבדוק את הפונקציה. תוכל להדביק את הקוד לעיל בתוך תסריט ו־להשתמש בפונקציית dot source אותו במהלך הסשן הנוכחי של 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 או מודול הפוורשל PowerShell EnhancedHTML2.

אפשר גם לקחת את הדברים קצת יותר רחוק ולהוסיף התראת אימייל לתוצאה עם פקודת Send-MailMessage. העולם מולך!

סיכום

בפוסט זה, למדת איך לקבל דוחות שימוש במשאבים מ-Azure. גם למדת איך לבנות פונקציה מותאמת אישית ב-PowerShell כדי לאוטומציה של התהליך ולהשתמש בפונקציה זו לעיבוד הפלט.

שום בעיה!

Further Reading

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