Microsoft Fabric の容量設定を json 保存する

## はじめに

BCDR などの容量設定↓ を json 化してみたかった

遷移方法：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/954e347f-c1f7-49da-a889-62d61b393fdb.png)

設定画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bc0c64ee-37aa-45d5-9042-8c7adc366401.png)

### API 確認について

[Fabric Capacities - Get](https://learn.microsoft.com/en-us/rest/api/microsoftfabric/fabric-capacities/get?view=rest-microsoftfabric-2023-11-01&tabs=HTTP) などの公式ドキュメントには記載がなかったので開発者ツールから API を確認しています。そのため、 **非公式** かつ **対応する項目、パスの資料がない** 点に注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5751bea4-bd40-48ec-9a9e-18ecc0385098.png)


## コード

```python:python

import json
import sempy.fabric as fabric
import notebookutils
from datetime import datetime

# 設定を保存するディレクトリの基準となる root_dir
capacity_id = '<容量ID>'
root_dir = f"/lakehouse/default/Files/capacity_setting/capacity_id={capacity_id}"

# 対象となる設定のリスト
target_settings = [
    '', 
    'capacityCustomParameters',
    'autoscale', 
    'config', 
    'surgeProtectionRules', 
    'workspaces', 
    'workloads/SparkCore/workloadAutoscaleLimit', 
    'resourceGovernance'
]

def dump_setting(capacity_id, path):
    """
    設定を取得し、JSON形式で保存する関数
    """
    # ルートディレクトリとURLの決定
    if path == '':
        url = f"/capacities/{capacity_id}"
        output_dir = f"{root_dir}/base_settings"
    elif path == 'capacityCustomParameters':
        url = f"/capacities/{capacity_id}/capacityCustomParameters?workloadIds=ADB&workloadIds=ADM&workloadIds=AI&workloadIds=Config&workloadIds=CosmosDB&workloadIds=CDSA&workloadIds=DMS&workloadIds=AS&workloadIds=QES&workloadIds=Dataverse&workloadIds=DI&workloadIds=dmh&workloadIds=DMR&workloadIds=DO&workloadIds=ES&workloadIds=ESGLake&workloadIds=Dataflows&workloadIds=FabricDW&workloadIds=FuncSet&workloadIds=Graph&workloadIds=GraphQL&workloadIds=HLS&workloadIds=ScreenshotEngine&workloadIds=Kusto&workloadIds=lake&workloadIds=Lakehouse&workloadIds=LiveTable&workloadIds=ML&workloadIds=Must&workloadIds=Notebook&workloadIds=NLS&workloadIds=OneRiver&workloadIds=RsRdlEngine&workloadIds=Pbcd&workloadIds=PowerBI&workloadIds=REP&workloadIds=Rls&workloadIds=Reflex&workloadIds=SparkCore&workloadIds=SQLDb&workloadIds=SqlTools&workloadIds=TDS&workloadIds=TIPS&workloadIds=Transform&workloadIds=Vpaas"
        output_dir = f"{root_dir}/capacityCustomParameters"
    else:
        url = f"/capacities/{capacity_id}/{path}"
        output_dir = f"{root_dir}/{path}"
    
    # APIリクエスト
    try:
        client = fabric.FabricRestClient()
        response = client.get(url)
        response.raise_for_status()  # ここでHTTPエラーをチェック
        response_json = json.loads(response.content.decode('utf-8'))
    except Exception as e:
        print(f"Error fetching data for {path}: {e}")
        return
    
    # JSON文字列に変換
    settings_str = json.dumps(response_json, indent=4)
    
    # 出力ディレクトリを作成
    notebookutils.fs.mkdirs(output_dir)
    
    # 日付の生成
    date_str = datetime.now().strftime("%Y%m%d")
    
    # ファイル名を作成し、DBFSに保存
    file_path = f"{output_dir}/{date_str}.json"
    notebookutils.fs.put(file_path, settings_str, True)
    print(f"Settings for {path} have been saved to: {file_path}")

# 各設定を順番にダンプ
for setting in target_settings:
    dump_setting(capacity_id, setting)


```

### 実行時の補足

容量ID はこちらで確認（または 設定表示時の URL からも確認可能）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/def7c445-f44f-4dba-986d-3b1f47301412.png)


実行時には Python ノートブックとして実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/79802a35-f3dd-4ed9-8fd8-b340a2e06f9a.png)

既定のレイクハウスをひもづけておくこと（紐づけない場合はマウントが必要）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/20388aa3-6a2c-4753-8288-fdbc259b2b9c.png)

### 確認結果から所見

json化したはいいものの、一部表示された項目と API 出力結果の項目とで紐づきがわかりにくいものがある。

たとえば、以下のような Power BI Workloads 設定は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b26154d5-a2ca-4ca0-8602-3d4e2636edae.png)

カスタムパラメータとして格納されているようで、わかりにくい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/15a47a99-b814-400b-9523-a81974acd124.png)

他にも一見してわからないものがあるかも。