Power BI Premium / Microsoft Fabric の容量の移行

## はじめに
Power BI Premium P1などの Premium 容量や無料試用版の容量から Microsoft Fabric 容量への移行など、ある容量から別の容量に移行するには、その容量に割り当てられているワークスペースを移行先の容量に割り当て直す必要があります。ワークスペースが数えるほどしかなければ GUI で実行しても良いのですが、たくさんあると手作業で実行するのはただただ面倒です。
**ある容量から別の容量に、ワークスペースを一括で割り当てする PowerShell のサンプル**が GitHub 公開されているので、その使い方をご紹介します。

:::note
必要な権限について間違いがあったため、訂正しています。(2024/10/16)
:::

[Moves all Power BI / Fabric workspaces from one premium capacity to another. Useful for when you want to migrate between a P SKU and an F SKU and cannot simply scale up/down the existing SKU · GitHub](https://gist.github.com/dgosbell/466edf17bac2cf02e888095f84d52baa)

https://gist.github.com/dgosbell/466edf17bac2cf02e888095f84d52baa

## 使い方
:::note warn
下記の手順6.を実行する前に、対象の Fabric 容量を起動 (再開/resume) しておきます
:::
0. 上記 GitHub より .ps1 ファイルをダウンロードします。18行目の関数名に「global:」を付加して保存します。
`function global:Move-PowerBICapacityWorkspaces ($fromCapacityName, $toCapacityName)`

1. MicrosoftPowerBIMgmt モジュールをインストールします。
(PowerShell を管理者権限で実行する必要があります。)
	`PS> Install-Module -Name MicrosoftPowerBIMgmt`

2. PowerShell で .ps1 ファイルを保存したディレクトリに移動します
`PS> cd C:\temp`
3. Power BI サービスにサインインします
`PS> Connect-PowerBIServiceAccount`
4. スクリプトを実行します
`PS> .¥Move-PowerBICapacityWorkspaces.ps1`
5. 関数を実行します
`PS> Move-PowerBICapacityWorkspaces -fromCapacityName "移行元容量名" -toCapacityName "移行先容量名"`

:::note alert
Power BI 以外の **Fabric アイテムを含むワークスペース**は、異なるリージョンにある容量へ移行することができません。
移行先の容量は、移行元の容量と同じリージョンに作成する必要があります。
:::

## 解説
次の PowerShell コマンドを使用して、テナントに紐づく容量の情報を取得しています。
ここで自分が容量管理者または共同作成者になっている容量の一覧と、そのうち移行元の容量に割り当てられているワークスペースの一覧を取得しています。

https://learn.microsoft.com/ja-jp/powershell/module/microsoftpowerbimgmt.capacities/get-powerbicapacity?view=powerbi-ps

次の管理用 REST API を使用して、移行先の容量に上記で取得したワークスペースを割り当てています。

https://learn.microsoft.com/en-us/rest/api/power-bi/capacities/groups-assign-to-capacity

以前こちら↓を使っていると書いていましたが、間違いです。

https://learn.microsoft.com/en-us/rest/api/fabric/core/workspaces/assign-to-capacity?tabs=HTTP

必ずしも Power BI 管理者である必要はありませんが、以下の要件があります。
- The caller must have contributor permissions or be an capacity Admin.
(実行者は**容量の共同作成者**または**容量管理者**である必要あり)
- ~~The caller must have admin workspace role.~~
~~(実行者には**ワークスペースの管理者ロール**が必要)~~

:::note
この記事で「Power BI 管理者」というのは、Microsoft 365 管理者ロールの「グローバル管理者」「Power Platform 管理者」「Fabric 管理者」のいずれかの役割 (Role) を割り当てられているユーザーを指します。
:::
:::note warn
Power BI 管理者であれば、自動的にテナントのすべての容量の容量管理者になりますが、**ワークスペースのロールとは無関係**なので、注意が必要です。
:::

https://learn.microsoft.com/ja-JP/microsoft-365/admin/add-users/about-admin-roles


### 試用版の容量からの移行の場合
その試用版の管理者 (試用版を開始した本人) 以外が移行するには、次のようにスクリプト31行目を修正します(-Scope Organization を付加)。
```PowerShell:
$allCapacities = Get-PowerBICapacity -Scope Organization
```

:::note warn
修正したコードを使用する場合には、Power BI 管理者である必要があります。
:::

## 注意とまとめ
- 試用版の容量は、その試用版を開始した本人以外で存在を把握できるのは Power BI 管理者のみのため、試用版の容量からの移行を実施できるのは**試用版を開始した本人**か **Power BI 管理者**のみです。
- 「Fabric 管理者」などの Microsoft 365 管理者ロールの割り当ての反映にはタイムラグがある場合があります。権限付与したのにエラーになる場合は、少し待ってから再実行してみてください。
- ~~GUI ([容量の設定]画面) ではワークスペースの管理者ロールがなくても容量への割り当てができますが、このスクリプト (Assign to capacity REST API) を使って移行するには**ワークスペースの「管理者」ロール**が必要です。移行対象となるワークスペースに管理者ロールの割り当てられていないものがあると**処理が中断**し、部分的に移行された状態となります。~~
- 容量の切替には数分かかる場合もあります。また、**実行中のタスクはすべてキャンセルされる**ため、取り込みや更新を行っていない時間に実施するか、切り替え後に再実行するなどご対応ください。