サービス プリンシパルを使用して Premium ワークスペースとセマンティック モデルのタスクを自動化する

サービス プリンシパルは、リソースおよびサービス レベルの操作を自動で実行するためにテナント内に作成する Microsoft Entra ID のアプリの登録です。 これは一意の種類のユーザー ID で、アプリ名、アプリケーション ID、テナント ID、およびパスワード用の "クライアント シークレット" または証明書を含みます。

Power BI Premium では、Power BI Embedded と同じサービス プリンシパル機能が使用されています。 詳細については、サービス プリンシパルを使用した Power BI コンテンツの埋め込みに関する記事をご覧ください。

Power BI Premium では、サービス プリンシパルを XMLA (XML Analysis) エンドポイントと共に使用して、以下でワークスペースのプロビジョニング、モデルのデプロイ、セマンティック モデルの更新などのセマンティック モデル管理タスクを自動化することもできます。

  • PowerShell。
  • Azure Automation。
  • Azure Logic Apps。
  • カスタム クライアント アプリケーション。

サービス プリンシパルを使用した XMLA エンドポイント接続がサポートされるのは、新しいワークスペースのみです。 従来のワークスペースはサポートされていません。 サービス プリンシパルには、割り当てられたワークスペースのタスクを実行するために必要なアクセス許可のみが与えられます。 アクセス許可は、通常の UPN (ユーザー プリンシパル名) アカウントと同様に、ワークスペース アクセスを通じて割り当てられます。

書き込み操作を実行するには、容量のセマンティック モデル ワークロードで読み取りと書き込み操作に対して XMLA エンドポイントが有効になっている必要があります。 Power BI Desktop から発行されたセマンティック モデルでは、拡張メタデータ形式機能が有効になっている必要があります。

サービス プリンシパルの作成

サービス プリンシパルは Azure portal でアプリの登録として作成するか、PowerShell を使用して作成します。 サービス プリンシパルを作成するときは、アプリ名、アプリケーション (クライアント) ID、ディレクトリ (テナント) ID、およびクライアント シークレットを必ず別々にコピーして保存してください。 サービス プリンシパルを作成する手順については、以下を参照してください。

Microsoft Entra セキュリティ グループの作成

既定では、サービス プリンシパルにはそれが有効にされたテナント設定へのアクセス権があります。 ご利用の管理者設定に応じて、特定のセキュリティ グループまたは組織全体へのアクセス権を付与することができます。

サービス プリンシパルのアクセス権を特定のテナント設定に制限するには、特定のセキュリティ グループに対するアクセスを許可できます。 あるいは、サービス プリンシパル専用のセキュリティ グループを作成し、それを目的のテナント設定から除外することもできます。 セキュリティ グループを作成してサービス プリンシパルを追加するには、「Microsoft Entra ID を使用して基本グループを作成してメンバーを追加する」をご覧ください。

サービス プリンシパルを有効にする

Power BI でサービス プリンシパルを使用できるようにする前に、管理者が Power BI 管理ポータルでサービス プリンシパルのアクセス権を有効にする必要があります。

  1. Power BI 管理ポータルに移動し、[テナント設定] を選択します。
  2. [開発者向け設定] までスクロールした後、[Power BI API の使用をサービス プリンシパルに許可] を展開します。
  3. [Enabled] を選択します。
  4. セキュリティ グループにアクセス許可を適用するには、[特定のセキュリティ グループ (推奨)] を選択します。
  5. グループ名を入力します。
  6. [適用] を選択します。

Screenshot that shows the Admin portal with tenant settings selected. Allow service principals to use Power BI APIs is expanded with enabled highlighted.

ワークスペース アクセス

Premium ワークスペースとセマンティック モデルの操作を実行するために必要なアクセス許可をサービス プリンシパルに付与するには、ワークスペースのメンバーまたは管理者としてサービス プリンシパルを追加する必要があります。ここでは Power BI サービスでのワークスペース アクセスの使用について説明しますが、グループ ユーザーの追加 REST API を使用することもできます。

  1. Power BI サービスで、ワークスペースに対して [詳細]>[ワークスペース アクセス] を選択します。

    Screenshot that shows a list of workspaces. The more icon and workspace access are highlighted.

  2. アプリケーション名で検索した後、管理者またはメンバーとしてワークスペースにサービス プリンシパルを追加します。

    Screenshot that shows the access dialog showing a service principal name. Admin is selected.

XMLA エンドポイント用の接続文字列

サービス プリンシパルを作成し、テナントに対してサービス プリンシパルを有効にし、サービス プリンシパルをワークスペース アクセスに追加したら、XMLA エンドポイントでの接続文字列でそれをユーザー ID として使用します。 その違いは、user id パラメーターと password パラメーターの代わりに、アプリケーション ID、テナント ID、アプリケーション シークレットを指定することです。

Data Source=powerbi://api.powerbi.com/v1.0/myorg/<workspace name>; Initial Catalog=<dataset name>;User ID=app:<appId>@<tenantId>;Password=<app_secret>;

PowerShell

PowerShell セッションを開き、次のコード例を実行します。

SQLServer モジュールの使用

次の例では、セマンティック モデルの更新操作を認証するために AppIdTenantIdAppSecret が使用されています。

Param (
        [Parameter(Mandatory=$true)] [String] $AppId,
        [Parameter(Mandatory=$true)] [String] $TenantId,
        [Parameter(Mandatory=$true)] [String] $AppSecret
       )
$PWord = ConvertTo-SecureString -String $AppSecret -AsPlainText -Force

$Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $AppId, $PWord

Invoke-ProcessTable -Server "powerbi://api.powerbi.com/v1.0/myorg/myworkspace" -TableName "mytable" -DatabaseName "mydataset" -RefreshType "Full" -ServicePrincipal -ApplicationId $AppId -TenantId $TenantId -Credential $Credential

分析管理オブジェクト (AMO) と ADOMD.NET

クライアント アプリケーションや Web アプリと接続するとき、AMO と ADOMD のクライアント ライブラリ バージョン 15.1.42.26 (2020 年 6 月) 以降の、NuGet からインストールできるパッケージを使って、接続文字列でのサービス プリンシパルをサポートできます。それには、構文 app:AppID とパスワードまたは cert:thumbprint を使用します。

次の例では、appIDpassword の値を使用し、モデル データベース更新操作を実行します。

string appId = "xxx";
string authKey = "yyy";
string connString = $"Provider=MSOLAP;Data source=powerbi://api.powerbi.com/v1.0/<tenant>/<workspacename>;Initial catalog=<datasetname>;User ID=app:{appId};Password={authKey};";
Server server = new Server();
server.Connect(connString);
Database db = server.Databases.FindByName("adventureworks");
Table tbl = db.Model.Tables.Find("DimDate");
tbl.RequestRefresh(RefreshType.Full);
db.Model.SaveChanges();