Microsoft Fabric 容量の自動開始・停止

# はじめに
Microsoft Fabric を PoC などで検証している際、Fabric 容量は Power BI Premium per Capacity と違って一時停止をすることができるので、使っていないときに停止しておくと、利用料金の節約になります。(従量課金制の場合)
ただ、この一時停止を忘れることが多く、無駄に課金発生させてしまうことが多々あったため、自動停止の仕組みを導入しました。自動開始の仕組みにも転用できるので、設定方法をご紹介したいと思います。

# 使用する Azure のサービス
- Microsoft Fabric
- Automation アカウント
- Runbook

# 全体像
ざっくりアーキテクチャはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/e49983bf-d7e6-c9c5-edf3-489e5f871ba3.png)


# 手順
今回実施する手順は以下の通りです。
1. PowerShell Runbook に設定するパラメータを事前に収集する
1. Automation アカウントを作成
1. マネージド ID に Azure ロールを割り当てる
1. Automation アカウントの Runbook のギャラリーから テンプレートの PowerShell をインポート
1. 自分の環境に合わせて PowerShell Runbook を書き換え
1. Runbook とスケジュールと紐づけ

## 1. PowerShell Runbook に設定するパラメータを事前に収集する
PowerShell Runbook を実行する際、以下の情報が必要になります。
- サブスクリプションID
- リソースグループ名
- Fabric 容量名

これらをまずは収集しておきます。

1-1. 自動で開始・停止をする Microsoft Fabric 容量 の概要ページで情報を取得する 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/231374f0-1dd1-4329-c6b4-5250e9a97cd7.png)


## 2. Automation アカウントを作成
まず、自動実行するための Automation アカウントを作成します。

2-1. Azure Portal の左上のハンバーガーボタンを押して、「すべてのサービス」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/d6800fc2-74e4-eace-bb1c-01425593ebe6.png)

2-2. 「Management and governance」の「Automation アカウント」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/bca3c869-2d0e-1a31-ad85-a4d7c807400c.png)

2-3. 「作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/7d02af3d-04dd-98bd-475b-54887c828ac2.png)

2-4. 各種設定を行う

2-4-1. 基本
「サブスクリプション」、「リソースグループ」を選択し、「Automation アカウント名」を入力、「地域」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/94bc52b2-8ed2-80ea-fe9c-be6293c13319.png)

2-4-2. 詳細設定
「マネージド ID」 を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/ac932f6f-792c-9765-608e-e66be5678bbb.png)
※ 例では「システム割り当て」を選択。システム割り当てとユーザー割り当ての違いは[こちら](https://learn.microsoft.com/ja-jp/azure/automation/automation-security-overview#managed-identities)
※ なお、Azure Automation では実行アカウントが廃止され、マネージド ID へ移行しています

2-4-3. ネットワーク
「接続の構成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/ca0dfc73-b7ea-5ae7-81a7-d9a231c25a37.png)
※ 例では「パブリック アクセス」を選択

2-4-4. タグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/160dc388-5b7c-638c-9299-9da1d6d04753.png)
※ 例では何も追加していません。

2-4-5. 確認および作成
検証が問題無く終了したら、「作成」ボタン押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/7f29b843-8fa8-1b68-fe48-0f54099eb458.png)

## 3. マネージド ID に Azure ロールを割り当てる
Runbook を実行するため、Automation アカウント の マネージド ID に Azure ロールを割り当てます。

3-1. 作成した Automation アカウントの「アカウント設定」の「ID」を選択し、作成したマネージド ID の種類(この例では システム割り当て済み) を選択
「状態」がオンになっていることを確認して、「アクセス許可」の「Azure ロールの割り当て」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/9caa14a2-1692-d1cd-d499-ad1a39c5abe2.png)

3-2. Azure ロールの割り当てで、「ロールの割り当ての追加(プレビュー)」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/513d5eee-a5ae-7070-4098-77e0161f7360.png)

3-3. 「スコープ」を選択し、スコープの内容と役割を選択し、保存ボタンを押下
※ 例では、スコープをリソースグループとして、役割を共同作成者としています。
※ スコープについては[こちら](https://learn.microsoft.com/ja-jp/azure/role-based-access-control/scope-overview)を参照
※ 役割については[こちら](https://learn.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles)を参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/471c61c6-9a41-76d8-c7d7-2e2b881ab37c.png)

3-4. 役割が作成されたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/d736d1e0-cae6-6f4c-cec1-bbc24b24f46f.png)

## 4. Automation アカウントの Runbook のギャラリーから テンプレートの PowerShell をインポート
Microsoft Fabric 容量の開始・停止を実行する PowerShell テンプレートをインポートします。

4-1. 作成した Automation アカウントの「プロセス オートメーション」の「Runbook」を選択し、「ギャラリーを参照」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/44a85105-a848-f2b4-6eb4-687feee1e5f6.png)

4-2. ギャラリーの閲覧で、検索ワード「Fabric」で検索実行。検索結果の中から「suspend_or_resume_fabric_capacity_runbook」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/78849f2c-acb0-2749-2590-1c8095f2e77b.png)
※ ここでは PowerShell Runbook を選んでいますが、Python 3 Runbook のテンプレートもあります。

4-3. テンプレートの PowerShell を確認して、「選択」ボタン押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/e09d0893-aa36-2ed0-efa2-b064a27dbdd1.png)

4-4. インポートする Runbook の「名前」、「ランタイムバージョン」、「説明」を入力・選択し、「インポート」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/4d32cf69-6dd1-505c-09d5-ec8509f4579e.png)


## 5. 自分の環境に合わせて Runbook の PowerShell を書き換え
5-1. 1.の手順で取得しておいた、サブスクリプション ID、リソースグループ名、Fabric 容量のリソース名を使って、インポートした PowerShell のコードを書き換えます
### 変更前のコードと変更箇所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/01909da3-938a-c7f1-3b1b-aac7f971c966.png)

コメントアウトされている以下の変数
- $ResourceID
- $operation

を自分の環境に合わせたパラメータへ変更してコメントアウトを外す
以下の通り修正します。

$ResourceID
```
$ResourceID = "/subscriptions/[サブスクリプションID]/resourceGroups/[リソースグループ名]/providers/Microsoft.Fabric/capacities/[Microsoft Fabric 容量リソース名]"
```

$operation
停止の場合
```
$operation = "suspend" 
```
開始の場合
```
$operation = "resume" 
```
### 変更後のコード(今回の例は一時停止)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/9f72ae97-3e8e-fdbe-f8fc-13b9f6aef40c.png)

保存ボタンを押して保存し、公開ボタンを押して公開する

## 6. PowerShell Runbook テスト実行
作成した PowerShell Runbook が正しく動作するかテストします。

6-1. 作成した PowerShell Runbook を開き、「開始」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/aaf457c9-04a2-74bb-d292-4c711983a88a.png)

6-2. パラメータ無しで「OK」ボタン押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/ab5c4c6f-1826-bf41-2b10-c0fd307749c8.png)

6-3. 状態が 完了 になるまで待ち (キュー挿入済み → 開始中 → 実行中 → 完了 の順に遷移する)、エラーが無いことを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/0027d62e-7d4d-8ab0-c8a3-b3bb3a365330.png)

6-4. 該当の Microsoft Fabric 容量の概要ページを開き、容量が一時停止していることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/e8117f9c-b14e-bebf-1a0b-5ef5186a1b70.png)

## 7. Runbook とスケジュールと紐づけ
作成した PowerShell Runbook をスケジュールで動くように設定します

7-1. 作成した Automation アカウントの PowerShell Runbook を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/a8fb6d98-c171-e577-ee39-946540e09d6f.png)

7-2. 「スケジュールへのリンク」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/79d10a33-07bb-e013-aa6b-5b27a56526c4.png)

7-3. 「スケジュールを Runbook にリンクします」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/0801e411-3a46-c282-cff6-7f905c0753de.png)

7-4. 「スケジュールの追加」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/ca6ba9ae-dfc9-06ad-37bf-af8ba48a2870.png)

7-5. 新しいスケジュールの各項目を入力し、「作成」ボタン押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/23ad10dd-3ec8-7112-7de8-3c881b7ff326.png)
※実行間隔や繰り返し設定などが可能


## 8. スケジュールされた Runbook の結果を確認
スケジュール実行がうまく起動したかを確認
8-1. Runbook の概要ページを開き、最近のジョブの結果を確認し、正常に完了していることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/b0a2b4cf-b52b-3ab9-b95a-c0e91cec034f.png)
8-2. 該当の Microsoft Fabric 容量の概要ページを開き、容量が一時停止していることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/e8117f9c-b14e-bebf-1a0b-5ef5186a1b70.png)

# まだ対応できていない点
現状、Microsoft Fabric 容量の稼働状況のステータスを取っていないので、開始していないのに一時停止しようとするとエラー、開始しているのに開始しようとするとエラーになります。
こちらについては、PowerShell の修正が必要なため、後日調査しようと思います。

# まとめ
Microsoft Fabric 容量の利点である容量の一時停止ですが、どうしても開発中に一時停止を忘れてしまうため、この自動停止を使って、無駄な課金を防ぐようにしましょう。また自動開始にも転用できるので、自動化の仕組みを取り入れ、運用をスムーズに行うよう工夫すると良いと思います。