Subscription Billing Export¶
Ein Kostenreport braucht die Kostendaten jeder subscription an einem Ort. Diese Seite beschreibt eine pipeline, die für jede subscription unterhalb einer management group einen Billing Export konfiguriert und startet und die Daten in einen zentralen Data-Lake-Storage-Account schreibt. Eine Reporting-Lösung kann sie dann lesen, zum Beispiel eine Data-Factory-pipeline, die sie in ein Kosten-Dashboard lädt.
Für workload-Teams reichen die Kostenansichten im Portal (Kosten und Reservierungen). Dieser Export ist für zentrales Reporting durch das Plattform-Team, FinOps oder Finance gedacht.
Herkunft dieser Seite
Die pipeline und das Skript stammen aus dem spoke canvas früherer Versionen. Namen von Dateien, Repositorys und Variable Groups sind die der Starter-Dateien. Prüfe, was deine Code-Version mitliefert.
Was sie macht¶
Azure führt einen Subscription-Export zu einem Zeitpunkt aus, den es selbst wählt, irgendwann im Lauf des Tages. Exporte verschiedener subscriptions kommen dann zu unterschiedlichen Zeiten an, und das Reporting zeigt veraltete oder nicht vergleichbare Daten. Die pipeline macht zwei Dinge:
- Konfigurieren. Sie durchsucht alle subscriptions unterhalb einer management group (rekursiv) und erstellt in jeder die Export-Definition.
- Ausführen. Sie startet die bestehenden Exporte zu einer festen Zeit. Die Exporte werden immer noch nicht in derselben Sekunde fertig, aber innerhalb eines viel kleineren Zeitfensters.
Die Export-Einstellungen sind:
| Einstellung | Wert |
|---|---|
| Format | Parquet, weil es komprimiert ist und gut mit Azure Data Factory funktioniert, dem nächsten Schritt im Prozess |
| Kompression | Snappy |
| Granularität | Eine tägliche Zusammenfassung |
| Überschreibverhalten | Jeden Tag wird dieselbe Datei mit allen Daten des Monats erneut geschrieben |
| Zeitraum | Ein Monat. In einem neuen Monat beginnt eine neue Datei. |
flowchart LR
p["Billing export pipeline<br/>(daily, fixed time)"] -->|"configure and start export"| s["Subscriptions below the<br/>landing zone management group"]
s -->|"export to container billingdata"| d["Data lake storage account"]
d --> r["Reporting solution<br/>(for example Data Factory, at a later time)"]
Voraussetzungen¶
Data-Lake-Storage-Account¶
- Erstelle einen Storage Account mit aktiviertem hierarchischen Namespace.
- Erstelle einen Container
billingdata. - Gib der Identität, die die pipeline ausführt, die Rolle Storage Blob Data Contributor.
- Gib der Identität der Reporting-pipeline (zum Beispiel der Managed Identity der Data Factory) dieselbe Rolle.
Skript und pipeline¶
| Datei | Wo | Anmerkung |
|---|---|---|
BillingexportConfiguration.ps1 |
Ordner Scripts des Code-Repositorys |
Teil der Plattform. Die pipeline checkt es aus. |
BillingexportConfiguration.yaml |
Ordner pipelines des Konfigurations-Repositorys |
Starter-Datei. Setze ihre Parameter. |
Die pipeline-Datei konfigurieren¶
Zeitplan. Führe die pipeline aus, bevor die Reporting-Lösung die Daten einliest. Wenn das Einlesen um 04:00 läuft, führe den
Export am Abend aus, zum Beispiel um 22:00 Ortszeit. Der Zeitplan ist in UTC, rechne die Zeit also um (zum Beispiel 0 20 * * *
für 22:00 in einer Zeitzone mit Sommerzeit und UTC+2).
Parameter (dieselben Namen für die pipeline und das Skript):
| Parameter | Typ | Bedeutung | Default oder Beispiel |
|---|---|---|---|
DoConfigureExports |
boolean | Die Export-Definitionen erstellen oder aktualisieren | Pipeline: true. Skript-Default: $false |
DoRunExport |
boolean | Die bestehenden Exporte starten | Pipeline: true. Skript-Default: $false |
DoShowNextRunTimeEstimate |
boolean | Anzeigen, wann die nächsten automatischen Exporte laufen | false in der pipeline, $true im Skript |
StartManagementGroupName |
string | Oberste management group, ab der rekursiv nach subscriptions gesucht wird | <landing-zone-management-group> |
DataLakeStorageAccountResourceId |
string | Resource-ID des Data-Lake-Storage-Accounts | /subscriptions/<subscription-id>/resourceGroups/<rg>/providers/Microsoft.Storage/storageAccounts/<name> |
DataLakeStorageContainerName |
string | Container für die Daten | billingdata |
DataLakeFolderNamePrefix |
string | Ordner-Präfix. Die subscription-ID wird angehängt. | subscription- |
ExportJobNamePrefix |
string | Präfix des Export-Namens in der Billing-Konfiguration | exportprd_ |
SkipTheseSubscriptions |
string array | Subscriptions, die keinen Export bekommen | @("<subscription-id>", "<subscription-id>") |
Das Skript nimmt außerdem TenantId entgegen (der Tenant, der die management group enthält).
Variable Group. Die pipeline nutzt dieselbe Variable Group wie das spoke-Deployment.
Code-Repository. Wie die anderen pipelines des spoke canvas checkt sie das Code-Repository bei einem Versions-Tag aus:
resources:
repositories:
- repository: spokedeployment-tf
type: git
name: "<project>/<code-repository>"
ref: refs/tags/<version> # update when a new code version is deployed
Betrieb¶
- Führe die pipeline einmal von Hand aus und autorisiere den Pool und die Gruppe, wie bei den anderen pipelines.
- Eine neue subscription bekommt ihren Export beim nächsten Lauf der pipeline mit
DoConfigureExportsauftrue. Die Daten einer subscription liegen im Container in einem Ordnersubscription-<subscription-id>. - Prüfe den Lauf im wöchentlichen pipeline-Status (Wartungskalender). Ein fehlgeschlagener Lauf bedeutet eine Lücke im Kostenreport.
- Eine subscription, die nicht exportiert werden soll, kommt in
SkipTheseSubscriptions.