Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Lernprogramm wird erläutert, wie Sie ein Python-Skript verwenden, um Emissionsdaten der Azure Carbon-Optimierung als JSON-Ausgabe zu exportieren. Das Python-Skript führt Carbon Service REST API-Netzwerkanforderungen aus, um Emissionsdaten für Ihre Azure-Ressourcen abzurufen. Das Skript vereinfacht den Prozess der Abfrage der API und die Behandlung der Antwort. Sie führen das Skript aus, um die JSON-Dateien zu generieren und sie dann für detaillierte Analysen und Berichte zu verwenden.
In dieser Anleitung werden die Schritte behandelt, die erforderlich sind, um Kohlenstoff-Optimierung Emissionsdaten auf Ihrem lokalen Windows-Computer zu exportieren.
Es gibt mehrere Schritte zum Ausführen dieses Lernprogramms:
- Überprüfen der erforderlichen Komponenten und Installieren fehlender Komponenten
- Herunterladen und Installieren von Python
- Installieren erforderlicher Python-Pakete
- Untersuchen und Aktualisieren des Python-Skriptbeispiels
- Ausführen des Python-Skripts
- Überprüfen der JSON-Ausgabedateien
Voraussetzungen
Stellen Sie vor der Verwendung des Python-Skripts folgendes sicher:
- Entsprechende Azure-Berechtigungen (
Carbon Optimization Reader,Subscription OwneroderSubscription ContributorRollen)- Weitere Informationen finden Sie unter Zuweisen von Azure-Rollen mithilfe des Azure-Portals und Zuweisen des Zugriffs auf die Co2-Optimierung in Azure.
- Eine Liste der gültigen Azure-Abonnement-IDs, für die Sie Emissionsdaten abrufen möchten
- Ein Verständnis der Co2-Emissionsbereiche (Scope1, Scope2, Scope3)
- Mindestens ein vollständiger Monat mit Emissionsdaten, die für den Export verfügbar sind (Daten sind für den vorherigen Monat nach Tag 19 des aktuellen Monats verfügbar)
Installieren von Azure PowerShell
Wenn Azure PowerShell nicht auf Ihrem lokalen Windows-Computer installiert ist, führen Sie die folgenden Schritte aus:
Starten Sie Windows PowerShell 5.1 als Administrator, und führen Sie den folgenden Befehl aus, um PowerShellGet mithilfe des PowerShell-Katalogs zu aktualisieren:
Install-Module -Name PowerShellGet -Force
Legen Sie die PowerShell-Ausführungsrichtlinie auf RemoteSigned oder weniger einschränkend fest.
- Überprüfen Sie die PowerShell-Ausführungsrichtlinie:
Get-ExecutionPolicy -List - Legen Sie die PowerShell-Ausführungsrichtlinie auf "Remotesignatur" fest:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Verwenden Sie das Cmdlet Install-Module, um das Az PowerShell-Modul zu installieren:
Install-Module -Name Az -Repository PSGallery -Force
Möglicherweise müssen Sie PowerShell neu starten, nachdem die Installation abgeschlossen ist.
Weitere Informationen zum Installieren von Azure PowerShell, einschließlich der Installation auf verschiedenen Plattformen, finden Sie unter Installieren von Azure PowerShell.
Anmelden bei Azure
Um mit der Verwaltung Ihrer Azure-Ressourcen mit dem Az PowerShell-Modul zu beginnen, starten Sie eine PowerShell-Sitzung, und führen Sie die Ausführung aus Connect-AzAccount , um sich bei Azure anzumelden:
Connect-AzAccount
Melden Sie sich mit Ihren Azure-Kontoanmeldeinformationen beim geöffneten Browserfenster an.
Sie müssen diesen Schritt für jede neue PowerShell-Sitzung wiederholen, die Sie starten.
Installieren der Azure-Befehlszeilenschnittstelle
Wenn Azure CLI nicht auf Ihrem lokalen Windows-Computer installiert ist, führen Sie die folgenden Schritte aus:
- Überprüfen Sie die Informationen unter Installieren der Azure CLI unter Windows.
- Wählen Sie eine Installationsmethode aus, und führen Sie dann das Installationsprogramm aus, das am besten für Ihren lokalen Computer geeignet ist.
- Öffnen Sie nach Abschluss der Installation ein neues Eingabeaufforderung- oder PowerShell-Fenster (mit Administratorrechten) und melden Sie sich bei Ihrem Azure-Konto an:
az login
Herunterladen und Installieren von Python
Wenn Python nicht auf Ihrem lokalen Windows-Computer installiert ist, führen Sie die folgenden Schritte aus:
- Überprüfen Sie die Informationen unter Python-Downloads.
- Wählen Sie das Installationsprogramm für eine Python-Version aus, laden Sie es herunter, und führen Sie es aus, das für Ihren lokalen Computer am besten geeignet ist.
Installieren erforderlicher Python-Pakete
Führen Sie in Der Eingabeaufforderung oder im PowerShell-Fenster (mit Administratorrechten) den folgenden Befehl aus, um die erforderlichen Python-Pakete zu installieren:
pip install azure-identity azure-mgmt-carbonoptimization
Untersuchen und Aktualisieren des Python-Skriptbeispiels
- Kopieren Sie das folgende Python-Beispielskript, und speichern Sie es lokal. Speichern Sie sie z. B. unter
export_carbon_emission_data.py - Überprüfen Sie das Skript, und ersetzen Sie alle Vorkommen von
Subscription_ID_XXXdurch Ihre tatsächlichen Azure-Abonnement-IDs. Fügen Sie nach Bedarf Beispielabonnements hinzu oder entfernen Sie sie. Bis zu 100 Abonnement-IDs werden unterstützt. - Speichern Sie die Datei.
Standardmäßig gibt das Skript nur Daten für den letzten vollständigen Monat aus. Sie können das Skript für einen benutzerdefinierten Zeitraum (vollständige Monate) für einige Berichte aktualisieren. Überprüfen Sie die Skriptkommentare, um festzustellen, ob ein Bericht einen benutzerdefinierten Bereich unterstützt. Suchen Sie nach Vorkommen von:
date_range = DateRange(
start=date.fromisoformat(available_date_range.start_date),
end=date.fromisoformat(available_date_range.end_date),
)
Aktualisieren Sie dann wie im folgenden Beispiel:
date_range = DateRange(
start=date.fromisoformat("YYYY-MM-DD"),
end=date.fromisoformat("YYYY-MM-DD"),
)
"""
Azure Carbon Optimization
This script queries Azure Carbon Optimization reports by using the Python azure-mgmt-carbonoptimization(https://pypi.org/project/azure-mgmt-carbonoptimization/) SDK.
"""
import os
import json
import logging
import time
from datetime import datetime, timezone, date
from typing import List, Dict, Any, Optional
from pathlib import Path
from azure.identity import DefaultAzureCredential
from azure.mgmt.carbonoptimization import CarbonOptimizationMgmtClient
from azure.mgmt.carbonoptimization.models import CarbonEmissionDataAvailableDateRange, CategoryTypeEnum, SortDirectionEnum,\
OrderByColumnEnum, ReportTypeEnum, ResponseDataTypeEnum, CarbonEmissionItemDetailData, DateRange, EmissionScopeEnum,\
CarbonEmissionData, ResourceCarbonEmissionItemDetailData, ResourceGroupCarbonEmissionItemDetailData, \
ItemDetailsQueryFilter, MonthlySummaryReportQueryFilter, TopItemsSummaryReportQueryFilter, \
TopItemsMonthlySummaryReportQueryFilter, OverallSummaryReportQueryFilter, CarbonEmissionDataListResult
from azure.core.exceptions import (
ClientAuthenticationError,
HttpResponseError,
ResourceNotFoundError
)
# Initialize Azure CarbonOptimization SDK clients
credential = DefaultAzureCredential()
client = CarbonOptimizationMgmtClient(credential=credential)
carbon_service = client.carbon_service
def query_item_detail_data_by_category_type(category_type: CategoryTypeEnum) -> None :
# get latest available carbon data date range
available_date_range = carbon_service.query_carbon_emission_data_available_date_range()
# Get latest month
date_range = DateRange(
start=date.fromisoformat(available_date_range.end_date),
end=date.fromisoformat(available_date_range.end_date),
)
# Build query filter for item detail report
item_detail_query_filter = ItemDetailsQueryFilter(date_range=date_range,
subscription_list=[
"Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
], # suggest to put 100 subscription id
carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3],
category_type=category_type,
order_by=OrderByColumnEnum.ITEM_NAME,
sort_direction=SortDirectionEnum.DESC,
page_size=50 # suggest with 2000 as pageSize
)
with open(f"carbon_emission_{str(category_type.value).lower()}_item_detail_report.json", "a", encoding="utf-8") as f:
while True:
result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)
for item in result_list.value:
f.write(json.dumps(item.as_dict(), ensure_ascii=False))
f.write("\n")
if not result_list.skip_token:
# no more pages, break
print("all data retrieved")
break
# set the continuation token for the next page
item_detail_query_filter.skip_token = result_list.skip_token
print("continue to get next page data")
def query_top_items_monthly_report_by_category_type(category_type: CategoryTypeEnum) -> None :
# get latest available carbon data date range
available_date_range = carbon_service.query_carbon_emission_data_available_date_range()
date_range = DateRange(
start=date.fromisoformat(available_date_range.start_date),
end=date.fromisoformat(available_date_range.end_date),
)
# Build query filter for top items monthly report
item_detail_query_filter = TopItemsMonthlySummaryReportQueryFilter(
date_range=date_range,
subscription_list=[
"Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
], # suggest to put 100 subscription id
carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3],
category_type=category_type,
top_items=5
)
with open(f"carbon_emission_{str(category_type.value).lower()}_top_items_monthly_report.json", "a", encoding="utf-8") as f:
result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)
for item in result_list.value:
f.write(json.dumps(item.as_dict(), ensure_ascii=False))
f.write("\n")
def query_top_items_report_by_category_type(category_type: CategoryTypeEnum) -> None :
# get latest available carbon data date range
available_date_range = carbon_service.query_carbon_emission_data_available_date_range()
# only set one month for Top Items Report
date_range = DateRange(
start=date.fromisoformat(available_date_range.end_date),
end=date.fromisoformat(available_date_range.end_date),
)
# Build query filter for top items report
item_detail_query_filter = TopItemsSummaryReportQueryFilter(
date_range=date_range,
subscription_list=[
"Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
], # suggest to put 100 subscription id
carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3],
category_type=category_type,
top_items=5
)
with open(f"carbon_emission_{str(category_type.value).lower()}_top_items_report.json", "a", encoding="utf-8") as f:
result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)
for item in result_list.value:
f.write(json.dumps(item.as_dict(), ensure_ascii=False))
f.write("\n")
def query_overall_summary_report_by_category_type() -> None :
# get latest available carbon data date range
available_date_range = carbon_service.query_carbon_emission_data_available_date_range()
date_range = DateRange(
start=date.fromisoformat(available_date_range.start_date),
end=date.fromisoformat(available_date_range.end_date),
)
# Build query filter for overall summary report
item_detail_query_filter = OverallSummaryReportQueryFilter(
date_range=date_range,
subscription_list=[
"Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
], # suggest to put 100 subscription id
carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3]
)
with open(f"carbon_emission_overall_summary_report.json", "a", encoding="utf-8") as f:
result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)
for item in result_list.value:
f.write(json.dumps(item.as_dict(), ensure_ascii=False))
f.write("\n")
def query_monthly_overall_summary_report_by_category_type() -> None :
# get latest available carbon data date range
available_date_range = carbon_service.query_carbon_emission_data_available_date_range()
date_range = DateRange(
start=date.fromisoformat(available_date_range.start_date),
end=date.fromisoformat(available_date_range.end_date),
)
# Build query filter for monthly overall summary report
item_detail_query_filter = MonthlySummaryReportQueryFilter(
date_range=date_range,
subscription_list=[
"Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
], # suggest to put 100 subscription id
carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3]
)
with open(f"carbon_emission_monthly_overall_summary_report.json", "a", encoding="utf-8") as f:
result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)
for item in result_list.value:
f.write(json.dumps(item.as_dict(), ensure_ascii=False))
f.write("\n")
def get_latest_available_carbon_data_date_range() -> CarbonEmissionDataAvailableDateRange:
"""
Query the latest available carbon data date range.
"""
available_date_range = carbon_service.query_carbon_emission_data_available_date_range()
print(f"Available date range: {available_date_range.start_date} to {available_date_range.end_date}")
return available_date_range
if __name__ == "__main__":
# get latest available carbon data date range
get_latest_available_carbon_data_date_range()
# get carbon emission item detail report
query_item_detail_data_by_category_type(CategoryTypeEnum.RESOURCE)
query_item_detail_data_by_category_type(CategoryTypeEnum.LOCATION)
query_item_detail_data_by_category_type(CategoryTypeEnum.RESOURCE_TYPE)
query_item_detail_data_by_category_type(CategoryTypeEnum.RESOURCE_GROUP)
query_item_detail_data_by_category_type(CategoryTypeEnum.SUBSCRIPTION)
# get top items monthly report
query_top_items_monthly_report_by_category_type(CategoryTypeEnum.RESOURCE)
query_top_items_monthly_report_by_category_type(CategoryTypeEnum.RESOURCE_GROUP)
query_top_items_monthly_report_by_category_type(CategoryTypeEnum.LOCATION)
query_top_items_monthly_report_by_category_type(CategoryTypeEnum.RESOURCE_TYPE)
query_top_items_monthly_report_by_category_type(CategoryTypeEnum.SUBSCRIPTION)
# get top items report
query_top_items_report_by_category_type(CategoryTypeEnum.RESOURCE)
query_top_items_report_by_category_type(CategoryTypeEnum.RESOURCE_GROUP)
query_top_items_report_by_category_type(CategoryTypeEnum.LOCATION)
query_top_items_report_by_category_type(CategoryTypeEnum.RESOURCE_TYPE)
query_top_items_report_by_category_type(CategoryTypeEnum.SUBSCRIPTION)
# get overall summary report
query_overall_summary_report_by_category_type()
# get monthly overall summary report
query_monthly_overall_summary_report_by_category_type()
Ausführen des Python-Skripts
Führen Sie das Python-Skript über die Eingabeaufforderung oder das PowerShell-Fenster (mit Administratorrechten) aus:
python export_carbon_emission_data.py
JSON-Ausgabedateien werden im selben Verzeichnis wie das Skript erstellt. Die Dateien werden nach Berichtstyp benannt.
Hier ist eine Liste der Ausgabedateien, die erstellt werden:
carbon_emission_location_item_detail_report.jsoncarbon_emission_location_top_items_monthly_report.jsoncarbon_emission_location_top_items_report.jsoncarbon_emission_monthly_overall_summary_report.jsoncarbon_emission_overall_summary_report.jsoncarbon_emission_resourcegroup_item_detail_report.jsoncarbon_emission_resourcegroup_top_items_monthly_report.jsoncarbon_emission_resourcegroup_top_items_report.jsoncarbon_emission_resourcetype_item_detail_report.jsoncarbon_emission_resourcetype_top_items_monthly_report.jsoncarbon_emission_resourcetype_top_items_report.jsoncarbon_emission_resource_item_detail_report.jsoncarbon_emission_resource_top_items_monthly_report.jsoncarbon_emission_resource_top_items_report.jsoncarbon_emission_subscription_item_detail_report.jsoncarbon_emission_subscription_top_items_monthly_report.jsoncarbon_emission_subscription_top_items_report.json
Überprüfen der JSON-Ausgabedateien
Hier sehen Sie eine Beispielausgabe für den monatlichen Gesamtzusammenfassungsbericht aus der carbon_emission_overall_summary_report.json Datei.
{"dataType": "OverallSummaryData", "latestMonthEmissions": 13871.2808902499, "previousMonthEmissions": 14007.1957894844, "monthOverMonthEmissionsChangeRatio": -0.00970321977912344, "monthlyEmissionsChangeValue": -135.91489923458}
Weitere Informationen zu den Berichten und den darin enthaltenen Daten finden Sie in der Referenz zur Exportemissionen-API.