0
0

More than 3 years have passed since last update.

Azure Functions から Power BI の XMLA エンドポイントに接続してデータを取得する

Last updated at Posted at 2021-02-03

Power BI Premium で、XMLA エンドポイントが利用できるようになりました。XMLA エンドポイントは Microsoft Analysis Services にアクセスする際に利用するプロトコルです。これにより、Azure Analysis Services と SQL Server Analysis Services の接続に使うライブラリ を利用して、Power BI Service に接続する事ができます。
本記事では、Power BI Service の XMLAエンドポイントに Azure Functions にデプロイしたC# のプログラムから接続し、データを取得する方法を紹介します。

全体の手順

手順の概要は以下となります。
1. Azure AD でサービスプリンシパルを作成
2. セキュリティグループを作成し、サービスプリンシパルを追加
3. Power BI テナントでサービスプリンシパルのアクセス許可
4. Power BI Premium で、XMLA エンドポイントのアクセスを許可
5. ワークスペースを作成し、サービスプリンシパルをワークスペースの管理者に設定
6. ワークスペースにテスト用のデータセットをデプロイ
7. DAX Studio を利用して DAX 関数を作成
8. Azure Functions にプログラムをデプロイ
9. Azure Functions に環境変数の設定
10. Azure Functions にアクセスしてテスト

各手順の詳細

以下は上記の1~10の手順の詳細です。

Azure AD でサービスプリンシパルを作成

Azure Portal にログインして、Azure Active Directory から「アプリの登録」-「+新規作成」をクリックします。

アプリの登録

表示名を入力し、登録をクリックします。

アプリの登録

「アプリケーション(クライアント)ID」と「ディレクトリ(テナント)ID」をコピーして保存しておきます。サービスプリンシパルのユーザ名として"app:<アプリケーション(クライアント)ID>@<ディレクトリ(テナント)ID>"形式で後で使用します。具体的には"app:5eb07315-a268-4e29-aec8-02ec0ff1c345@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" のような形式となります。

IDの確認

左側で「証明書とシークレット」を選択して、新しいクライアントシークレットを作成します。

シークレットの作成

「説明」を入力し追加をクリックします。

シークレットの作成

作成されたクライアントシークレットの値をクリップボートにコピーして保存しておきます。この画面から移動すると二度と確認する事ができまんので、ここで忘れずコピーして下さい。後程サービスプリンシパルでログインする際のパスワードとして利用します。

シークレットの保存

セキュリティグループを作成し、サービスプリンシパルを追加

全てのサービスプリンシパルから Power BI にアクセス許可するのではなく、特定のセキュリティグループに属しているサービスプリンシパルのみを許可する為に、セキュリティグループを作成します。
Azure Portal で 「Azure Active Directory」 - 「グループ」-「+新しいグループ」をクリックします。

7.png

グループの種類、グループ名、グループの説明を入力し「作成」をクリックします。

8.png

作成したグループに、あらかじめ作成しておいたサービスプリンシパルをメンバーとして追加します。

9.png

Power BI テナントでサービスプリンシパルのアクセス許可

Power BI 管理ポータルで、 [テナント設定] を選択します。
[Power BI API の使用をサービスプリンシパルに許可]を展開し、「有効化」と「特定のセキュリティ グループ (推奨)」を選択し、アクセス許可するセキュリティグループを指定します。

11.png

Power BI Premium で、XMLA エンドポイントのアクセスを許可

Power BI 管理ポータルで、 [容量の設定] > [Power BI Premium] > 容量の名前を選択します。
[ワークロード] を展開します。 [XMLA エンドポイント] の設定で、 [読み取り専用]または「読み取り、書き込み」を選択します。

10.png

ワークスペースを作成し、サービスプリンシパルをワークスペースの管理者に設定

Power BI Service の画面から「ワークスペースの作成」をクリックします。

13.5.png

ワークスペース名を入力します。

14.png

詳細を展開し、Premium容量がオンになっている事を確認して作成します。

15.png

作成したワークスペースの「アクセス」をクリックして、サーパスプリンパルのユーザ名を追加します。

16.png

作成したワークスペースの「設定」をクリックして、ワークスペース接続の文字列をコピーしておきます。XMLAエンドポイントへ接続する際の文字列となります。

17.png

ワークスペースにテスト用のデータセットをデプロイ

テスト用のデータセットとして、Power BI のサンプルが公開されている github から Sales & Returns Sample v201912.pbix をダウンロードして利用します。

ダウンロードした、Sales & Returns Sample v201912.pbix を Power BI Desktop で開き、Power BI Premium の容量のワークスペースに発行します。

12.png

発行するワークスペースを選択します。

13.png

DAX Studio を利用して DAX 関数を作成

https://daxstudio.org/ から、DAX Studio をダウンロードしてインストールして起動します。

Connect の画面で、tablular Server を選択し、ワークスペース接続の文字列を入力します。

18.png

ユーザとパスワードを入力するとすると、左側のペインにデータセットが表示されます。「Query Builder」をクリックすると表示される領域に、データ取得したいカラムとメジャーを左側のデータセットからドラッグアンドドロップします。Edit Query をクリックすると、データ取得の為の DAX Query が表示されます。Run Query をクリックすると結果が表示されます。

19.png

ここでは、左上のデータ名を右クリックして Database Name をコピーします。また DAX Query もコピーしてきます。

20.png
Database Name DAX Query
Sales & Returns Sample v201912 EVALUATE
SUMMARIZECOLUMNS(
'Product'[Product],
"Returns", [Returns]
)

Azure Functions にプログラムをデプロイ

GitHub上のサンプルプログラムを Azure Functions にデプロイします。
https://github.com/sushima/XMLASample/

デプロイ先は Azure を選択します。

21.png

ターゲットは Azure Function App(Windnows) を選択します。

22.png

デプロイする Functions は新規作成します。

23.png

Azure Functions に環境変数の設定

Azure Portal で作成した Functions を開き「構成」をクリックして新しいアプリケーション設定を追加します。

24.png

追加するのは以下の3つの設定です。

名前 説明
PBI_CONNECTION_STRING Provider=MSOLAP.8;Data Source=powerbi://api.powerbi.com/v1.0/myorg/XMLTEST XMLTESTの部分は実際のワークスペース名に応じて変更して下さい。
appId app:5eb07315-a268-4e29-aec8-02ec0ff1c345@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 実際の<アプリケーション(クライアント)ID>@<ディレクトリ(テナント)ID>を設定して下さい。
authKey l3kaAAA~AAAA_~5A4AA-Sh1~alAAAAAA6 実際のサービスプリンシパルのシークレットの値を設定して下さい。

設定後は忘れずに「保存」をクリックしてください。

Azure Functions にアクセスしてテスト

Azure Portal から、デプロイした関数を選択して「関数のURLの取得」をクリックして、URLをコピーします。

25.png

コピーした URL に以下の2つの引数を追加してブラウザからアクセスします。

引数 説明
catalog Sales%20%26%20Returns%20Sample%20v201912 Database NameをURLエンコードした文字列
query EVALUATE%0D%0ASUMMARIZECOLUMNS%28%0D%0A%27Product%27%5BProduct%5D%2C%0D%0A%22Returns%22%2C%20%5BReturns%5D%0D%0A%29%0D%0A Dax QueryをURLエンコードした文字列

以下のように JSON 形式で結果が返ってくれば成功です。

26.png

おわりに

プログラムから Power BI の XMLA エンドポイントにアクセスする事で、プログラムからデータを取得することが可能になりますので、ご参考にして頂ければ幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0