このチュートリアルでは、Python スクリプトを使用して Azure Carbon 最適化の排出量データを JSON 出力としてエクスポートする方法について説明します。 Python スクリプトは 、Carbon Service REST API ネットワーク要求を実行して、Azure リソースの排出量データを取得します。 このスクリプトを使用すると、API に対してクエリを実行し、応答を処理するプロセスが簡略化されます。 スクリプトを実行して JSON ファイルを生成し、詳細な分析とレポートに使用します。
このチュートリアルでは、ローカルの Windows コンピューターで炭素最適化排出量データをエクスポートするために必要な手順について説明します。
このチュートリアルを完了するには、いくつかの手順があります。
- 前提条件を確認し、不足しているコンポーネントをインストールする
- Python をダウンロードしてインストールする
- 必要な Python パッケージをインストールする
- Python スクリプトの例を調べて更新する
- Python スクリプトを実行する
- JSON 出力ファイルを確認する
[前提条件]
Python スクリプトを使用する前に、次のことを確認してください。
- 適切な Azure アクセス許可 (
Carbon Optimization Reader、Subscription Owner、またはSubscription Contributorロール)- 詳細については、「 Azure portal を使用して Azure ロールを割り当てる」と「Azureの Carbon 最適化へのアクセスを割り当てる」を参照してください。
- 排出量データを取得する有効な Azure サブスクリプション ID の一覧
- 二酸化炭素排出量の範囲の理解 (Scope1、Scope2、Scope3)
- エクスポート可能な排出量データの 1 か月以上 (前月のデータは、当月の 19 日までに利用できます)
Azure PowerShell をインストールする
ローカルの Windows コンピューターに Azure PowerShell がインストールされていない場合は、次の手順に従います。
管理者として Windows PowerShell 5.1 を起動し、次のコマンドを実行して、PowerShell ギャラリーを使用して PowerShellGet を更新します。
Install-Module -Name PowerShellGet -Force
PowerShell 実行ポリシーを、リモート署名済みまたは制限の緩い状態に設定します。
- PowerShell 実行ポリシーを確認します。
Get-ExecutionPolicy -List - PowerShell 実行ポリシーをリモート署名済みに設定します。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
az PowerShell モジュールをインストールするには、Install-Module コマンドレットを使用します。
Install-Module -Name Az -Repository PSGallery -Force
インストールが完了した後、PowerShell の再起動が必要になる場合があります。
さまざまなプラットフォームへのインストールなど、Azure PowerShell のインストールの詳細については、「 Azure PowerShell をインストールする方法」を参照してください。
Azure にサインインする
Az PowerShell モジュールを使用して Azure リソースの管理を開始するには、PowerShell セッションを起動し、 Connect-AzAccount 実行して Azure にサインインします。
Connect-AzAccount
Azure アカウントのサインイン資格情報を使用して、開いたブラウザー ウィンドウにログインします。
開始するすべての新しい PowerShell セッションに対して、この手順を繰り返す必要があります。
Azure CLI のインストール
ローカルの Windows コンピューターに Azure CLI がインストールされていない場合は、次の手順に従います。
- 「Windows に Azure CLI をインストールする」の情報を確認します。
- インストール方法を選択し、ローカル コンピューターに最適なインストーラーを実行します。
- インストールが完了したら、新しいコマンド プロンプトまたは PowerShell ウィンドウ (管理者特権を使用) を開き、Azure アカウントにサインインします。
az login
Python をダウンロードしてインストールする
ローカルの Windows コンピューターに Python がインストールされていない場合は、次の手順に従います。
- Python のダウンロードで情報を確認します。
- ローカル コンピューターに最適な Python リリースのインストーラーを選択、ダウンロード、実行します。
必要な Python パッケージをインストールする
コマンド プロンプトまたは PowerShell ウィンドウ (管理者特権を使用) で、次のコマンドを実行して、必要な Python パッケージをインストールします。
pip install azure-identity azure-mgmt-carbonoptimization
Python スクリプトの例を調べて更新する
- 次の Python サンプル スクリプトをコピーし、ローカルに保存します。 たとえば、次のように保存します。
export_carbon_emission_data.py - スクリプトを確認し、
Subscription_ID_XXXのすべてのインスタンスを実際の Azure サブスクリプション ID に置き換えます。 必要に応じて、サブスクリプションの例を追加または削除します。 最大 100 個のサブスクリプション ID がサポートされています。 - ファイルを保存します。
既定では、スクリプトは過去 1 か月間のデータのみを出力します。 一部のレポートのカスタム時間範囲 (1 か月) のスクリプトを更新できます。 スクリプトコメントを確認して、レポートがカスタム範囲をサポートしているかどうかを確認します。 次の例を探してください。
date_range = DateRange(
start=date.fromisoformat(available_date_range.start_date),
end=date.fromisoformat(available_date_range.end_date),
)
次の例のように更新します。
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()
Python スクリプトを実行する
コマンド プロンプトまたは PowerShell ウィンドウから (管理者特権で) Python スクリプトを実行します。
python export_carbon_emission_data.py
JSON 出力ファイルは、スクリプトと同じディレクトリに作成されます。 ファイルの名前はレポートの種類によって指定されます。
作成される出力ファイルの一覧を次に示します。
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
JSON 出力ファイルを確認する
carbon_emission_overall_summary_report.json ファイルからの月次全体の概要レポートの出力例を次に示します。
{"dataType": "OverallSummaryData", "latestMonthEmissions": 13871.2808902499, "previousMonthEmissions": 14007.1957894844, "monthOverMonthEmissionsChangeRatio": -0.00970321977912344, "monthlyEmissionsChangeValue": -135.91489923458}
レポートとレポートに含まれるデータの詳細については、「 Export emissions API reference」を参照してください。