Azure
Security
PowerBI
AzureFunctions

Power BI から Azure Functions に Azure AD 認証経由で接続する

この記事では、Power BI のデータソースとして Azure Functions を使う方法を紹介します。またセキュリティには、Azure AD を使った OAuth 2.0 認証を利用します。
※それぞれのテクノロジーについての詳細はこの記事では説明しません。

Azure Functions の作成

1. Azure Portal より Function App を検索して選択。
Capture.PNG

2. 必要項目を設定して作成。ここでは名前を datasourcefunction としました。
Capture.PNG

3. HTTP トリガーで実行される C# を選択。
Capture.PNG

4. 検証のため、ここでは単純な JSON 配列を返すコードを利用。中身を以下コードに差し替え。

using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    List<User> users = new List<User>();
    users.Add(new User(){ UserId = 1, Name = "User 1"});
    users.Add(new User(){ UserId = 2, Name = "User 2"});
    users.Add(new User(){ UserId = 3, Name = "User 3"});
    return req.CreateResponse(HttpStatusCode.OK, users);
}

public class User
{
    public int UserId {get; set;}
    public string Name {get; set;}
}

5. 実行して結果を確認。期待した JSON が返ってくれば完了。

6. 次に認可レベルを設定。「統合」メニューより、「Authorization level」を「Anonymous」に設定して保存。
Capture.PNG

7. 「関数の URL の取得」をクリックして、アドレスを確認。後で利用するので保存しておく。
Capture.PNG

Azure AD 認証の設定

1. 作成した Azure Functions を選択し、「プラットフォーム機能」をクリック。
Capture.PNG

2. 「認証/承認」をクリック。
Capture.PNG

3. 「App Service 認証」を「オン」、「要求が承認されない場合に…」を「Azure Active Directory でのログイン」にして、Azure Active Directory の項目をクリック。右側のブレードより「管理モード」で「簡易」を選択。最後に 「OK」をクリック。
Capture.PNG

4. 一旦保存した後、再度「Azure Active Directory」をクリックし、「管理モード」で「詳細」を選択。「許可されるトークン対象ユーザー」にホスト名までのアドレスを追加。最後のスラッシュを付けないように気を付ける。
※ Web ブラウザなどで使う場合は既定のものだけで OK ですが、Power BI で使う場合はホスト名を追加する必要があります。
Capture.PNG

5. 再度「保存」をクリックして設定は完了。

テスト

1. ブラウザで関数の URL にアクセス。認証にリダイレクトされることを確認。
Capture.PNG

2. コンセント画面で「OK」をクリックし、結果が出ることを確認。
Capture.PNG

Power BI から接続

Azure Functions の準備ができたので、Power BI から読み込んでみます。

1. Power BI Desktop を起動し、「データを取得」をクリック。
Capture.PNG

2. 「Web」を検索して「接続」をクリック。Azure Functions のアドレスを入力して「OK」をクリック。
Capture.PNG

3. 「組織アカウント」を選択して「サインイン」をクリック。組織ユーザーでサインイン。サインインが完了したら「接続」をクリック。

4. JSON 配列が結果として返るため、複数の Record が結果として表示される。ここで「テーブルへの変換」をクリック。ダイアログが出るので、オプションは既定のまま「OK」をクリック。
Capture.PNG

5. テーブルに変換後、列名の横に出るアイコンをクリックしてレコードを展開。
Capture.PNG

6. 必要な列を選択して、「OK」をクリック。ここでは「元の列名を…」のチェックを外して列名のみを採用。
Capture.PNG

7. 最後に「閉じて適用」をクリック。
Capture.PNG

8. 必要に応じてレポートを作成。

ログインユーザーの情報を Azure Functions で取得

Azure AD と連携しているので、ログイン情報を Azure Functions で取得できます。その情報で例えばデータをフィルターすることも出来ますし、他の用途にも使えます。ユーザーの情報は ClaimsPrincipal クラスから取得可能です。

1. 関数のコード上部に、using ステートメントを追加

using System.Security.Claims;

2. Run メソッド内で UPN を取得するコードを追加。ここではログに結果を表示。

 log.Info(ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value);

3. Power BI Desktop より「最新の状態に更新」をクリック。
Capture.PNG

4. Azure Functions のログを確認。
Capture.PNG

まとめ

Power BI では実に様々なデータソースを利用できますが、データソースによってできることに制限がある場合もあります。そのような場合に、Azure Function をプロキシのように利用することでより柔軟な接続が実現できそうです。是非試してみてください。

参考

Power BI Desktop ダウンロード
ClaimsPrincipal クラス