A skill that analyzes Azure Advisor recommendations and cost trends, and generates a simple monthly report (Markdown + PowerPoint) for customers.
When to Use
- When you want to summarize Advisor recommendations for a customer's Azure environment in a report
- When you want to visualize cost trends and breakdown by service
- When you want to report security and reliability recommendations with priorities
When NOT to Use
- Azure environment construction/change work (this skill is only for read-only report generation)
- Internal detailed analysis (this skill is specialized for customer-facing reports)
Input Parameters
| Parameters | Required | Description |
|---|---|---|
| Subscription ID | ✅ | Target subscription(s) (multiple allowed) |
| Tenant ID | ✅ | Tenant ID for each subscription |
| Target month | ❌ | YYYY-MM format. If omitted, the current month |
| Customer name | ❌ | Used in the report title. If omitted, "Azure Environment" |
Guardrails
Report Quality Rules must be applied.
Procedure
Phase 1: Data Acquisition
Data Acquisition Procedure Refer to.
Phase 2: Markdown Report Generation
Markdown template Generate based on.
Output destination: any path (e.g., {customer}/Azure-Brief-{YYYYMMDD}.md. Naming follows guardrails)
Phase 3: PowerPoint Report Generation
PPTX Generation Script Use. For multiple subscriptions, separate chapters by Subscription ID. For important recommendations, create individual pages and include the English original text, Japanese translation, risk, recommended actions, pros/cons, remediation steps, and Microsoft Learn URL. In the Executive Summary and recommended actions, add WAF / CAF perspectives as needed.
The script is a template. Rewrite the CONFIG / DATA sections at the beginning with actual data before running (arguments are --output only).
py -3 scripts/generate_pptx.py --output report.pptx
Phase 4: Verification
- Open the PPTX and check the display (whether elements overlap)
- Check that all content slides have speaker notes
- Check that tables, body text, and reference URLs are not smaller than 14pt
- Verify the numbers (cost totals, clearly indicate the base month for change rates)
- Check that English recommendations have Japanese translations and that no placeholders such as "Japanese translation not registered" remain
- Final check that no internal information or internal terminology is included
Quality Standards (Lessons Learned)
Minimum Requirements for Report Structure
Include the following sections at initial creation in this order . Missing sections or wrong order will cause rework:
- 📋 Target Subscriptions(ID, tenant, estimated purpose)
- 📈 Cost Trends and Analysis(Monthly table + month-over-month % + monthly trend by service Top5-7 + fluctuation insights)
- 🔴 Executive Summary(Key points with priority 🔴🟡⚪)
- 💰 Cost Optimization (Cost)(Advisor Cost count + estimated reduction potential + representative resource names)
- 🔒 Security(Advisor Security count + severity analysis)
- ⚡ Reliability & Availability (Reliability)(Advisor Reliability count + Zone redundancy/Backup improvement proposals)
- ⚙️ Operational Excellence(Advisor OpEx count.Must be retrieved. "Not retrieved" and "scheduled for next time" are prohibited. If the result is 0 items, state "0 items (no recommendations)")
- 📊 Overall Summary(Subscription × category list + aggregation by group)
- 🎯 Recommended Actions (in priority order)(prioritized, specific, actionable)
- 📎 Reference Links(Azure Portal Advisor direct links)
Data Handling Notes
- Save Azure CLI output directly to a file and do not display it in chat
az rest ... -o json 2>$null | Set-Content output/xxx.json - For JSON aggregation and pivot processing, prefer Python(
json+collections.defaultdict)- Avoid PowerShell because automatic DateTime type conversion
.SubString()causes frequent errors
- Avoid PowerShell because automatic DateTime type conversion
- Cost Management API は JPY(Japan region), customer dashboard CSV is USD — always specify the currency
- The Cost Management Query API is prone to 429 errors, so for half-year analysis, first retrieve monthly × ServiceName and verify totals by summing the ServiceName rows. Limit ResourceGroup / ResourceId drill-down to spike months
- When presenting cost reduction candidates, classify them as "needs confirmation", "confirm from parent resource", or "deletion candidate" rather than actually deleting them.
Do Not DeleteTreat tags, delete locks, Backup vault, Activity Log Alerts, NetworkWatcher, and managed resource group conservatively - In the top-cost resources table, also include resource type and current state . MTD cost also includes deleted/deleting resources, so join with the list of existing resources to avoid misunderstanding
- Resources confirmed to be tied to in-use applications should not be treated as deletion candidates even if they are high-cost. Treat them as maintain or review SKU/capacity
PPTX Generation Rules
-
Slide notes required: Add speaker notes to all slides
-
Minimum font size: Body text, tables, and reference URLs must be 14pt or larger
-
Table column widths: Explicitly set column widths according to content so rows do not collapse due to wrapping
-
Generate with a temporary file:
.tmp.pptxand then replace it, to avoid PermissionError with an open PPTX -
Inherit the existing full structure: If an existing customer has a highly complete PPTX / generator from the past, do not create a separate thin new deck; instead, replace the latest data into the existing full structure. If the comparison axes, category-specific chapters, or speaker notes are dropped, quality will degrade compared to the previous version.
-
Data source acquisition date required: Clearly state the acquisition date of each data source on the cover or in the supplementary notes (also include the currency, e.g., Cost=JPY / Customer Dashboard=USD)
-
Slide data must be newly written: Template reuse is limited to helper functions only. Copying and replacing slide data sections is prohibited because old customer data will remain
Rules for Advisor data acquisition
- Always acquire all 4 categories: Cost, Security, HighAvailability, OperationalExcellence(For how to write when there are 0 items, refer to 7 above)