Power Automate for desktop が Dataverse 容量を勝手に消費する話
この記事は、Microsoft Power Automate Advent Calendar 2022 5 日目の記事です。
この記事では、Power Automate for desktop フローが勝手に Microsoft Dataverse 容量を消費する話と、どれだけ Power Automate for desktop フローに Microsoft Dataverse 容量が消費されているかを確認する方法について記載しています。
はじめに
Power Automate for desktop とは
Power Automate for desktop とは、Power Automate のロボティックプロセスオートメーション (RPA) 機能を拡張し、デスクトップで行われるプロセスの自動化を可能にしているものです。
Power Automate for desktop には、有償版と無償版のライセンスがあり、無償版の利用には Microsoft アカウントが必要になります。
有償版の機能を使用するには、Microsoft アカウントに加え、 Power Automate per user with attended RPA plan
のようなアテンド型 RPA のライセンスの購入が必要になります。
Microsoft Dataverse とは
Microsoft Dataverse とは、Power Platform で活用できる、リレーショナルデータ、ファイル、Blob ストレージ、ログ、および検索に必要なデータをスケーラブルでセキュア、かつ動的に格納できるストレージ容量(データバックボーン)です。
Microsoft Dataverse を使用すると、メタデータと実際のデータ、双方がクラウド上に格納され、ユーザー自身はそれがどのように格納されているかを気にする必要はありません。
また、Power Apps で行うようなアプリ構築には、通常、複数のデータソースからなるデータが用いられることが多いですが、これを Microsoft Dataverse によって共通のデータストアに統合することで、データの管理や活用も簡単になります。
Power Automate for desktop は勝手に Dataverse 容量を消費する
早速本題ですが、Power Automate for desktop を社内で提供し、かつ Microsoft Dataverse 環境の管理をしている方は、この悩みに共感してもらえることかと思います。
結論、組織テナント配下の Power Automate for desktop は、Dataverse データベースの WorkflowBase
テーブルを裏で勝手に使用します。そのため、Microsoft Dataverse は本来、テナント全体で限られたデータ量分しか提供されていない状態であるのに関わらず、その制限を超えて、増え続けてしまう一因になっています。(Microsoft なんとかしてくれ)
無償版のユーザーの場合、組織アカウントでサインインして Power Automate for desktop を利用すると、テナントの既定 (default) 環境の Dataverse データベースにおける WorkflowBase
テーブルにデスクトップフロー情報が書き込まれます。この環境指定は固定で変更できません。(Dynamics 365 から見ると、プロセステーブルにデスクトップフローの種別でレコードが追加されます)
有償版ユーザーの場合は、既定 (default) 以外の環境にもデスクトップフローを作成することができます。しかし、Dataverse データベースにおける WorkflowBase テーブルを消費する仕様に変更はありません。
そのため、組織内で自由に Power Automate for desktop を使用させている場合、テナント内の Dataverse 容量が下記のような状態になり、ライセンス違反状態を起こすことになります。
無償版での Power Automate for desktop 利用を無効化させる
Power Automate for desktop が Microsoft Dataverse の容量を勝手に消費するとなる場合、テナント管理者としては、以下を検討することになると思います。
- 既定 (default) 環境を勝手に消費させない
Power Automate for desktop を使用したいユーザーは有償版ライセンス + Dataverse 容量を購入するフローを設け、有償版ユーザー向けに別の Dataverse 環境を切り出し、そちらを利用してもらう
既定とは別の環境での Dataverse 容量の推移をメトリックで取得し管理する - Dataverse 容量が消費されるのはどうしようもないから、ライセンス違反状態が解消されるよう、管理者側で Dataverse 容量を追加購入し続ける
無償版の Power Automate for desktop が使えなくなるというのはかなり痛手ですが、 Dataverse 容量は信じられないほど高い ので (個人的意見)、基本的には使いたい人は有償版のライセンス購入、に舵を切ることになる気がします。
その際、無償版の Power Automate for desktop を使用できないようにする一つの方法として、組織で管理している Windows 端末のレジストリ設定を行ってしまうという方法があります。
Hive | Key | Name | Type |
---|---|---|---|
HKEY_LOCAL_MACHINE | SOFTWARE\Microsoft\Power Automate Desktop | RestrictNoLicenseOrgIDAccountsSignIns | DWORD |
この設定を強要できない BYOD などのデバイスでは難しい話ですが、このレジストリ設定によって、無償版の Power Automate for desktop ユーザーの利用をある程度抑制し、既定 (default) 環境以外の Dataverse 環境に WorkflowBase テーブルの消費を分散させるという方法を取ることが可能になっています。
Dataverse データベース容量が超過すると何が悪いのか
結論、以下のことができなくなります。
- 新しい Dataverse 環境の作成
- 削除した Dataverse 環境の復元
- Dataverse 環境のコピー
- 試用版環境を有料環境(運用 or サンドボックス)に変換
- 既存環境への Dataverse データベースを追加
- 環境の回復
詳細は、Microsoft Docs を確認してください。
上記のことができなくなるため、残された手段としては
- 不要な Power Automate for desktop フローの削除
- Dataverse データベース容量の追加購入
の道しかないことになります。
Dataverse データベース容量はテナント全体での容量でしか管理できない
2022/12 時点では、Dataverse データベース容量は、テナント全体で 〇〇 GB、といったような容量管理しかできない仕様になっています。
そのため、「Dataverse 環境ごとに Dataverse 容量を割り当てればいいじゃん」と思った方もいるかもしれませんが、そういったことは現時点ではできません。
Dataverse データベース容量を追加購入する場合も、容量は環境単位でなくテナント全体の総量に追加の形となるため、注意が必要です。
Power Automate for desktop フロー一覧の取得方法
管理者として、組織アカウントで作成された Power Automate for desktop フローの一覧情報を確認したいときはあると思います。
確認方法としては GUI と CUI それぞれ方法があります。Power Platform 管理者以上の権限を持つユーザーでの実行を推奨します。
Dynamics 365 ポータルで WorkflowBase テーブル内の情報を確認する
Power Platform 管理センターにログインし、[環境] タブから対象の Dataverse 環境を選択します。
[設定] ボタンを選択します。
[リソース] -> [すべてのレガシ設定] を選択します。
Dynamics 365 ポータルが開きます。[カスタマイズ] -> [カスタマイズ] を選択します。
[システムのカスタマイズ] を選択します。
別ウインドウで画面が開きます。
画面左部のメニューから、[コンポーネント] -> [プロセス] を選択します。
プロセステーブル内にある、デスクトップ フロー
というカテゴリのデータが、Power Automate for desktop のフローに紐づくエンティティになります。
Windows PowerShell で WorkflowBase テーブル内のデスクトップフロー情報を取得する
C:\temp
フォルダを作成し、DesktopFlowList.ps1
ファイルを配置します。
Windows PowerShell で、DesktopFlowList.ps1
ファイルを実行します。
param(
[Parameter(Mandatory = $true)]
[string]$pageSize=10,
[Parameter(Mandatory = $false)]
[string]$OutputDirectory="C:\temp",
[Parameter(Mandatory = $false)]
[string]$PSModuleDirectoryName="PSModules"
)
$psModulePath = $OutputDirectory+'\'+$PSModuleDirectoryName
$psModuleFullPath = $psModulePath +'\Microsoft.Xrm.Tooling.CrmConnector.PowerShell'
# Check if we already have the PS Module for Dataverse Connectivity downloaded
if((Get-Item $psModulePath -ErrorAction SilentlyContinue ) -eq $null) {
New-Item -Path $OutputDirectory -Name $PSModuleDirectoryName -ItemType "directory"
}
# Make sure we have the dir on Path
if ($env:PSModulePath -notlike "*$($psModulePath)*"){
$env:PSModulePath += ";$($psModulePath)"
}
# Download and save Dataverse PS Module locally
if ((Test-Path $psModuleFullPath -PathType Container) -eq $false){
Save-Module -Name Microsoft.Xrm.Tooling.CrmConnector.PowerShell -Path $psModulePath
}
# Import the Dataverse module to connect interactively
Import-Module -Name Microsoft.Xrm.Tooling.CrmConnector.PowerShell
# Connect to Dataverse and get the Environment Url
$dataverseOrgs = Get-CrmConnection -InteractiveMode
$bearerToken = $dataverseOrgs.CurrentAccessToken
$environmentUrl = $dataverseOrgs.OrganizationDetail.Endpoints | where-object Key -match 'WebApplication' | Select-Object -ExpandProperty Value
# build query
$getDataRequestUri = 'workflows?$filter=category eq 6 and uiflowtype eq 2&$select=name,workflowid,clientdata&$expand=owninguser($select%3Dfullname,azureactivedirectoryobjectid,internalemailaddress)&$orderby=modifiedon+desc'
$Headers = @{
"Authorization" = "Bearer $($bearerToken)"
"Accept" = "application/json"
"OData-MaxVersion" = "4.0"
"OData-Version" = "4.0"
"Prefer" = "odata.maxpagesize=$($pageSize)"
}
# Get Desktop Flow Name/Id List
$getApiCallParams = @{
URI = "$($environmentUrl)/api/data/v9.1/$($getDataRequestUri)"
Headers = $Headers
Method = 'GET'
}
# Send the odata call
$getWorkflowBaseData = Invoke-RestMethod @getApiCallParams -ErrorAction Stop
$uiFlows = @()
$uiFlows += $getWorkflowBaseData.value
while ($getWorkflowBaseData.'@odata.nextLink')
{
$getApiCallParams.URI = $getWorkflowBaseData.'@odata.nextLink'
$getWorkflowBaseData = Invoke-RestMethod @getApiCallParams -ErrorAction Stop
$uiFlows += $getWorkflowBaseData.value
}
$uiFlows | ForEach-Object { New-Object psobject -Property @{ modifiedOn=$_.modifiedon; name=$_.name; id=$_.workflowid; owningUser=$_.owninguser.fullname; usermail=$_.owninguser.internalemailaddress; lengthInMB=$_.clientdata.Length / 1024 / 1024} } | Sort-Object -Property lengthInMB | Export-Csv -Path "c:\temp\DesktopFlowList.csv" -NoTypeInformation -Encoding UTF8
実行すると、実行に必要なモジュールが C:\temp
フォルダ上にダウンロードされ、PowerShell Interactive Login のダイアログが表示されます。
以下の情報を選択または入力し、Login
を選択してください。
項目 | 選択 または 入力 |
---|---|
Deployment Type | Office 365 |
Display list of available organizations | チェック ON |
Show Advanced | チェック ON |
Online Region | 自分の環境のリージョンを指定 (私の環境だと Japan) |
User Name | Power Platform 管理者ロール以上を持つアカウントの UPN |
Password | 上記で入力したユーザーのパスワード |
認証が完了すると、Starting Login Process のダイアログが表示されます。
情報を取得したい Dataverse 環境一覧が表示されるので、取得対象の環境を選択して、Login
を選択してください。
実行後、情報取得が完了すると、C:\temp
フォルダ以下に DesktopFlowList.csv ファイルが作成されます。
CSV 内の lengthInMB が Dataverse データベース容量の消費量 (MB)、owningUser がフロー所有者です。
こちらの CSV 上で、10 MB 以上の容量を消費している Power Automate for desktop フローは、次の手順に従って容量削減を試みてください。
使用していない UI 要素を削除する
任意のデスクトップフローにおいて、無駄な Dataverse 容量を消費している場合、Power Automate for desktop から以下の操作を試してください。
- Power Automate for desktop を起動
- 対象のデスクトップフローをダブルクリック
- フローの編集画面にて、
使用していない UI 要素を削除する
を選択
結論、組織アカウントで使う Power Automate for desktop は無料なんかじゃない
結局のところ、組織アカウントで使用する Power Automate for desktop については、無償版といえど、実質は無償ではない、ということです。
裏で勝手にテナントの Dataverse 容量を消費するのに対し、Dataverse 環境ごとに Dataverse データベース容量を設定/制限できることもできず、有償版ライセンスがない限り、既定環境以外にデスクトップフローを作成することもできない、という負のスパイラルを解消する日が 1 日でも早く来るよう、Microsoft さんには期待したいと思います。
(早く私の Dataverse の悩みの種を解消してもらって、みんな幸せに Dataverse が使えるようになる日が来ることを願っています)
Discussion