【Microsoft Fabric】自動停止の実装

本記事では、Runbookを使用してMicrosoft Fabricを自動的に停止する方法について説明します。

従量課金制でMicrosoft Fabricを使用しているユーザーにとって有益な内容であり、Runbookとスケジュールを組み合わせることで、停止を忘れてしまうことによる意図しない課金を防ぐことが可能になります。

実施手順

実施手順は以下の通りです。

  1. Automationアカウントの作成、設定
  2. 自動停止のフロー作成
  3. スケジュールの設定
  4. 実装確認

また、自動停止のフローとしては、以下をイメージして作成を行いました。

Automationアカウントの作成と設定

まずは、Automationアカウントの作成を行います。Automationアカウントを作成することで、後に作成するRunbookを使用してタスクを定期的に実行できるようになります。

下記を参考に作成を行いました。

スタンドアロン Azure Automation アカウントを作成する | Microsoft Learn

作成にあたり、以下を設定しました。

  • 詳細設定:システム割り当て
  • ネットワーク:パブリック アクセス

Automationアカウント作成完了後、下記を参考にマネージドIDに共同作成者のAzureロールを割り当てます。

Azure ロールをマネージド ID に割り当てる (プレビュー) - Azure RBAC | Microsoft Learn

自動停止のフロー作成

次に、AutomationアカウントでMicrosoft Fabricの自動停止フローを作成していきます。今回は、PowerShell Runbookを使用してフローの作成を行います。

Runbookの選択

1.作成済みのAutomationアカウントのプロセスオートメーションから「Runbook」をクリックします。

2.「ギャラリーを参照」をクリックします。

3.検索欄に"Fabric"と入力し、Fabric用のPowerShell Runbookである「suspend_or_resume_fabric_capacity_runbook」をクリックします。

4.そのまま「選択」をクリックします。
※ なお、本記事ではダミーのサブスクリプションIDとして「12345678-1234-1234-1234-123a12b12d1c」を記載しています。

5.名前、ランタイム バージョン、説明を記載し「インポート」をクリックします。

Runbookの編集

ここから実際のフローを実現するために、Runbookのコードを編集していきます。

既存のコードは下記になっています。

Param(
    [string]$ResourceID, # e.g. "/subscriptions/12345678-1234-1234-1234-123a12b12d1c/resourceGroups/fabric-rg/providers/Microsoft.Fabric/capacities/myf2capacity"
    [string]$operation # "suspend" or "resume"
)


#$ResourceID = "/subscriptions/12345678-1234-1234-1234-123a12b12d1c/resourceGroups/fabric-rg/providers/Microsoft.Fabric/capacities/myf2capacity"
#$operation = "suspend"
#$operation = "resume"


Connect-AzAccount -Identity


$tokenObject = Get-AzAccessToken -ResourceUrl "https://management.azure.com/"
$token = $tokenObject.Token


$azContext = Get-AzContext
$azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile)
$tokenObject = $profileClient.AcquireAccessToken($azContext.Subscription.TenantId)
$token = $tokenObject.AccessToken


$url = "https://management.azure.com$ResourceID/$operation" + "?api-version=2022-07-01-preview"
Write-Output $url


$headers = @{
  'Content-Type' = 'application/json'
  'Authorization' = "Bearer $token"
}


$response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers


$response

まずは、既定のコードを編集します。

6行目、7行目に記載があるコードをコメントアウトを外して$ResourceIDに自身の資格情報を記載します。

  • 修正箇所

  • 修正後コード
$ResourceID = "/subscriptions/【サブスクリプションID】/resourceGroups/【リソースグループ名】/providers/Microsoft.Fabric/capacities/
【Fabric容量のリソース名】"
$operation = "suspend"

次に、21行目から31行目までの箇所を削除します。※フローに合わせてコードを適切に変更するため。

  • 削除箇所

事前準備が完了したため、ここから作成したフローに基づいてコードの追加を行います。

まず、SKUのサイズとリソースの状態を取得する処理を追加します。

下記コードを追加します。

# リソースの状態確認用URL
$statusUrl = "https://management.azure.com/$ResourceID" + "?api-version=2022-07-01-preview"
Write-Output "Checking resource status: $statusUrl"
$headers = @{
    'Content-Type' = 'application/json'
    'Authorization' = "Bearer $token"
}
# リソースの状態を取得
Try {
    $statusResponse = Invoke-RestMethod -Uri $statusUrl -Method Get -Headers $headers
    $resourceSku = $statusResponse.sku.name
    Write-Output "Current resource SKU: $resourceSku"
    $resourceState = $statusResponse.properties.state
    Write-Output "Current resource state: $resourceState"
} Catch {
    Write-Output "Failed to get resource state: $_"
    Exit
}

次に、if文を使用して、SKUのサイズがF2でない場合にF2に変更する処理を追加します。

下記コードを追加します。

# SKUがF2以外の場合にF2に変更
if ($resourceSku -ne "F2") {
    $changeSkuUrl = "https://management.azure.com/$ResourceID" + "?api-version=2022-07-01-preview"
    $changeSkuPayload = @{
        sku = @{
            name = "F2"
            tier = "Fabric"
        }
    } | ConvertTo-Json
    Write-Output "Changing resource SKU to F2: $changeSkuUrl"
    
    Try {
        $changeSkuResponse = Invoke-RestMethod -Uri $changeSkuUrl -Method Patch -Headers $headers -Body $changeSkuPayload
        Write-Output "SKU change response: $changeSkuResponse"
    } Catch {
        Write-Output "Failed to change resource SKU: $_"
        Exit
    }
}else {
    Write-Output "No change SKU"
}

最後にリソースのステータス情報を利用して、Fabricリソースがアクティブな場合のみリソースの停止を実行する処理を追加します。

下記コードを追加します。

$url = "https://management.azure.com/$ResourceID/$operation" +"?api-version=2022-07-01-preview"
Write-Output "Constructed URL: $url"
# リソースがアクティブな場合のみ停止
if ($resourceState -eq "Active") {
    Write-Output "Suspending resource: $url"
    Try {
        $response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers
        Write-Output $response
    } Catch {
        Write-Output "Failed to suspend resource: $_"
    }
} else {
    Write-Output "No change status"
}

以上で作成したフローを実現することができます。完成したRunbookは下記になります。

Param(
    [string]$ResourceID, # e.g. "/subscriptions/12345678-1234-1234-1234-123a12b12d1c/resourceGroups/fabric-rg/providers/Microsoft.Fabric/capacities/myf2capacity"
    [string]$operation # "suspend" or "resume"
)

$ResourceID = $ResourceID = "/subscriptions/【サブスクリプションID】/resourceGroups/【リソースグループ名】/providers/Microsoft.Fabric/capacities/
【Fabric容量のリソース名】"
$operation = "suspend" 
#$operation = "resume"

Connect-AzAccount -Identity

$tokenObject = Get-AzAccessToken -ResourceUrl "https://management.azure.com/"
$token = $tokenObject.Token

$azContext = Get-AzContext
$azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile)
$tokenObject = $profileClient.AcquireAccessToken($azContext.Subscription.TenantId)
$token = $tokenObject.AccessToken

# リソースの状態確認用URL
$statusUrl = "https://management.azure.com/$ResourceID" + "?api-version=2022-07-01-preview"
Write-Output "Checking resource status: $statusUrl"
$headers = @{
    'Content-Type' = 'application/json'
    'Authorization' = "Bearer $token"
}

# リソースの状態を取得
Try {
    $statusResponse = Invoke-RestMethod -Uri $statusUrl -Method Get -Headers $headers
    $resourceSku = $statusResponse.sku.name
    Write-Output "Current resource SKU: $resourceSku"
    $resourceState = $statusResponse.properties.state
    Write-Output "Current resource state: $resourceState"
} Catch {
    Write-Output "Failed to get resource state: $_"
    Exit
}

# SKUがF2以外の場合にF2に変更
if ($resourceSku -ne "F2") {
    $changeSkuUrl = "https://management.azure.com/$ResourceID" + "?api-version=2022-07-01-preview"
    $changeSkuPayload = @{
        sku = @{
            name = "F2"
            tier = "Fabric"
        }
    } | ConvertTo-Json
    Write-Output "Changing resource SKU to F2: $changeSkuUrl"
    
    Try {
        $changeSkuResponse = Invoke-RestMethod -Uri $changeSkuUrl -Method Patch -Headers $headers -Body $changeSkuPayload
        Write-Output "SKU change response: $changeSkuResponse"
    } Catch {
        Write-Output "Failed to change resource SKU: $_"
        Exit
    }
}else {
    Write-Output "No change SKU"
}

$url = "https://management.azure.com/$ResourceID/$operation" +"?api-version=2022-07-01-preview"
Write-Output "Constructed URL: $url"
# リソースがアクティブな場合のみ停止
if ($resourceState -eq "Active") {
    Write-Output "Suspending resource: $url"
    Try {
        $response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers
        Write-Output $response
    } Catch {
        Write-Output "Failed to suspend resource: $_"
    }
} else {
    Write-Output "No change status"
}

Runbookの編集が完了したので、保存と公開を順にクリックし保存とRunbookの発行を行います。

スケジュールの設定

毎日、定期実行させるためにスケジュールの設定を行います。

1.作成したRunbookの概要から「スケジュールへのリンク」をクリックします。

2.「スケジュール」をクリックします。

3.「スケジュールの追加」をクリックします。

4.毎日19時に実行するように実行間隔を設定し、「作成」をクリックします。

5.「OK」をクリックします。

以上で定期実行のスケジュール作成は、完了になります。

実装確認

1.Runbookの実行履歴を確認するために、最近のジョブから任意の日時をクリックします。

2.「すべてのログ」をクリックすると、履歴を確認することができます。

上記の実行履歴では、SKUのサイズをF4からF2に変更し、Fabricリソースの停止を実施していることが分かります。

  • Runbook実行前のFabric容量(※2024/7/30 19時00分の状態)

  • Runbook実行後のFabric容量(※2024/7/30 19時05分の状態)

おわりに

今回は、Runbookを利用してMicrosoft Fabricを自動停止する方法をご紹介しました。

Microsoft Fabricを検証目的で使用している方々は、本記事で紹介した自動停止機能を実装することで、停止忘れによる意図しない課金を防ぐことができますので、ぜひお試しください。

執筆担当者プロフィール
松井 耕太

松井 耕太(日本ビジネスシステムズ株式会社)

2023年度入社。Data&AIプラットフォーム部所属。

担当記事一覧