[Power BI Tips]定期的にレポート (pbix) をエクスポートしたい ～ Power Automate / Azure Logic Apps のカスタムコネクタの作り方 ～ Vol.1

# 先日の勉強会でこんな質問がありました
**「定期的に Power BI レポートファイル (pbix) をバックアップしておきたいのですが、何か方法はないですか？」**

なるほどー、そんな需要があるんですねー。と勉強になりました。

勉強会では「**Power BI REST API** に **Export Report** があるから、それを使えばできるよ」って @kenakamu さんが回答してくれて、**Qiita** の記事を書いてくれました。
[PowerShell で Power BI サービスから pbix をダウンロードする](https://qiita.com/kenakamu/items/69bb19b01e607a5de55d)

↑ の記事では **PowerShell** で **Power BI REST API** を叩いています。
ただ、**Citizen Developer** (= 非技術者) の人にはちょっとハードルが高いって人もいるかと。

なので、可能な限り **No code / Low code** の方法ということで、**Power Automate / Azure Logic Apps** のカスタムコネクタで **API** を叩く方法ご紹介するのが今回の記事です。
ついでに **Power Automate / Azure Logic Apps** のカスタムコネクタの作り方紹介でもあります。
（**Power BI Tips** じゃないじゃん！？って思ってもいいけど、言わないでください😁）

前提として、**[Azure Portal (https://portal.azure.com)](https://portal.azure.com)** で **Azure Active Directory** が開けて、設定ができる人が対象です。

# カスタムコネクタってなに？
カスタムコネクタとは、Power Automate (旧 Microsoft Flow) / Azure Logic Apps のコネクタを自分で作れるというものです。
それぞれのサービスには実に数百のコネクタが既に用意されていますが、中には用意されていない API を叩きたいという人もいらっしゃるでしょう。
あるいは、自社サービスのコネクタを作りたい、という人もいるかもしれません。

ちょっと余談ですが、自社サービスがあって、その API を呼び出す Power Automate / Azure Logic Apps 用のコネクタを作りたいという人もいるかもしれません。
カスタムコネクタを作って Microsoft に登録することで、公式にコネクタとして、認定してもらうことが可能です。そうすると、以下の様に検索すると、コネクタが表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/77cd1431-93f7-8f60-25a3-8f1ec9738f24.png)

自組織内のみで使用する場合は、Microsoft の認定は不要です。
ご興味あるか方は、以下の公式ドキュメントをぜひ参考にしてみてください！

**Azure Logic Apps でカスタム コネクタを作成する**
https://docs.microsoft.com/ja-jp/connectors/custom-connectors/create-logic-apps-connector

# では本題！
今日のゴールは冒頭のお題の通り、Power BI REST API の Export Report を呼び出すカスタムコネクタを作成します。
## まずは公式ドキュメント

**Reports - Export Report**
https://docs.microsoft.com/ja-jp/rest/api/power-bi/reports/exportreport
**Reports - Export Report In Group**
https://docs.microsoft.com/ja-jp/rest/api/power-bi/reports/exportreportingroup

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/f0483dd5-e026-c341-fae9-6efcdabcb355.png)
左側の [Reports] の部分がレポートに関する Power BI REST API です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/52b103da-334a-d408-bef2-d4112880ffb5.png)
見てわかる通り、どうやら **In Group** が付いてるやつと付いてないやつがあるようですね。

これは、

- **In Group** が付いているやつ ⇒ ワークスペース用
- **In Group** が付いていないやつ ⇒ マイワークスペース用

です。
マイワークスペースは、Power BI Service を使えるユーザーすべてにデフォルトで提供されているワークスペースで、文字通り、個人用です。
一方、その他のワークスペースは Power BI Pro 以上のユーザーが作成可能なワークスペースで、他のユーザーと共有したり、一緒に使用したりするためのワークスペースです。

Power BI のワークスペースについては、以下をご覧ください。
**Power BI で新しいワークスペースを作成する**
https://docs.microsoft.com/ja-jp/power-bi/service-create-the-new-workspaces

はい、ということでまずは Power BI REST API にはワークスペースの種類に応じて、2種類あるんだ、と覚えておけば OK です。
## 準備：Power BI アプリケーション登録ツールで登録する
今回の方法では **Azure AD** にアプリを登録しておく必要があります。といっても登録ツールがあるので、画面の指示に従って操作すれば、誰でもできます。

**Power BI REST API** を他のアプリケーションから使用するには **Azure AD (Active Directory)** にアプリケーションを登録する必要があります。ご存知の通り、**Power BI** はユーザー管理や認証基盤を Azure AD に任せているからです。API を利用する際もセキュリティの観点から Power BI のユーザーアカウントを使用して認証する必要があるので、この準備が必要なわけです。

公式ドキュメントは以下です。
**Azure AD アプリケーションを登録して Power BI とともに使用する**
https://docs.microsoft.com/ja-jp/power-bi/developer/embedded/register-app
この ↑ ドキュメントの [Power BI アプリケーション登録ツールで登録する] 部分の通り進めれば、**基本的**には **OK** なんですが、Power BI REST API を使用するには一部情報が不足しているので、補足しながら説明します。

１．https://dev.powerbi.com/Apps にアクセスする
２．**[Sign in]** ボタンを押して、Power BI のアカウントでサインインする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/e0a0663b-26b0-958e-680b-a72e31297e83.png)
３．**[Next]** ボタンで次に進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/b3b357d7-b082-6323-43f7-4144b6d573ae.png)
４．Application Name, Application Type, Home Page URL, Redirect URL を入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/aa8ef9cc-5452-d67d-2a71-6e778a1e9bba.png)

| No. | 項目名                | 値                                                                     |
|:---:|:----------------------|:----------------------------------------------------------------------|
| 1   | Application Name      | **Power Automate Custom Connector**                                   |
| 2   | Application Type      | **Server-side application(for web apps or web APIs)**                 |
| 3   | Home Page URL         | https://www.google.com                                                |
| 4   | Redirect URL          | https://login.live.com/oauth20_desktop.srf                            |

以下備考です。
**Application Name**: 任意の名称で OK ですが、ここでは **Power Automate Custom Connector** とします
**Application Type**: Web アプリケーションから使用するので **Server-side application(for web apps or web APIs)** を選択します
**Home Page URL**: 本来なら自身の Web アプリケーションの URL を入力するのですが、有効な URL なら OK ですので、Google さんの URL を入れときます
**Redirect URL**: これが調べてもわからなかったのですが、海外の人が [ブログ](https://medium.com/@Konstantinos_Ioannou/refresh-powerbi-dataset-with-microsoft-flow-73836c727c33) に書いてくれていましたので、いただきました😁

５．**API access** で **Select all** を選択する
このアプリケーションがどの API を実行できるかを選択するのですが、本来なら必要なもののみチェックを入れますが、
お試しなので [Select all] にチェックを入れて、全部許可しちゃいます。運用環境ではしっかりと吟味してください。Azure AD の画面で後から変更可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/6ca777b1-3dff-ada3-e911-cef9cb3d2dd1.png)
６．**Application ID** と **Application secret** をコピーしておく
画面に表示された **Application ID** と **Application secret** をコピーしておいてください。特に **Application secret** は二度と確認できませんが、わからなくなったら Azure AD で再発行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/559182d3-5b74-c3b9-054d-9832558fc060.png)

## カスタムコネクタを作ってみる
**[Power Automate](https://flow.microsoft.com/)** を開いて、左側のメニューで **[データ] - [カスタムコネクタ]** を開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/b6ab926b-5432-9710-f325-4def08609e58.png)
いろんな作り方ができるのですが、ここでは **[一から作成]** を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/80483255-0b53-9151-ee30-4c27fd2ea73b.png)
コネクタ名は任意で OK ですが、ここでは **Power BI REST APIs** としておきます。[続行] をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/12827f92-5fe2-e827-9557-ab614dcb3016.png)
[ホスト] に **api.powerbi.com** を入力し、右下の [セキュリティ] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/90a47c40-5ed1-a583-6e9b-206bee743d49.png)

１．**認証タイプ** で **OAuth 2.0** を選択
２．２～８は画面の通り入力。３と４既にはコピーしてある **Application ID** を Client id に, **Application secret** を Client secret に入力。

| No. | 項目名                | 値                                                                     |
|:---:|:----------------------|:-----------------------------------------------------------------------|
| 2   | ID プロバイダー       | Azure Active Directory                                                 |
| 3   | Client ID             | 既にコピーしてある Application ID                                      |
| 4   | Client secret         | 既にコピーしてある Application secret                                  |
| 5   | Login URL             | https://login.windows.net/                                             |
| 6   | Tenant ID             | common                                                                 |
| 7   | Resource URL          | https://analysis.windows.net/powerbi/api                               |
| 8   | スコープ              | openid                                                                 |

３．8まで入力したら、画面右上の **９．コネクタの作成** をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/3dab138d-9424-7c63-586b-85b868291c6c.png)
**リダイレクト URL** をコピーしておきます。これを Azure AD の設定画面に張り付けるため、[Azure Portal](https://portal.azure.com) を開きます。すぐに **Power Automate** に帰ってくるので、Power Automate の画面は開いたまま置いておいてください。
## Azure Portal でリダイレクトURIを張り付ける
１．[Azure Portal](https://portal.azure.com) を開き、**Azure Active Directory** を検索して、開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/2fb0902b-8d95-d144-be53-6476a577e296.png)
２．Azure AD で画面左側メニューで **[アプリの登録]** をクリック。最初の手順で **Power BI アプリケーション登録ツール** にて、付けた名前 **Power Automate Custom Connector** をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/aab30802-643d-2ed0-6a2e-3a13f6cef623.png)
３．左側で **[認証]** をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/38194ecb-7d63-d250-5d3f-62d15873838a.png)
４．**[URI の追加]** をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/6cd52d86-3c35-1d00-279a-fa2285c70d55.png)
５．コピーした URL を張り付けて、画面左上の **[保存]** をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/f27fd93d-f5b2-54fd-ce94-d473b509dc83.png)

これで **Azure Portal** の設定は完了です。**Power Automate** に戻ります。
## Export Report をカスタムコネクタで定義しようとすると Get Reports が必要なことがわかる
ここで再度 **Export Report** のドキュメントを見ておきましょう
**Reports - Export Report**
https://docs.microsoft.com/ja-jp/rest/api/power-bi/reports/exportreport
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/f0483dd5-e026-c341-fae9-6efcdabcb355.png)
URI を見てみると、パラメータとして **[reportId]** が必要なことがわかります。なるほど、どのレポートをエクスポートするか指定する必要があるということですね。**Power Automate** でコネクタとして使用する際に、直に **reportId** を入力するのもアリですが、できればレポート名を選択して、裏では **reportId** が指定されているというのが望ましいですね。

これを実現するには、レポートのリストを取得する **Get Reports** を先に定義しておく必要があります。
## Get Reports を定義する 
**Reports - Get Report**
https://docs.microsoft.com/ja-jp/rest/api/power-bi/reports/getreport
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/aa6323a7-9360-adc4-7d03-a742832e023b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/f1734d62-87c1-6f84-57b7-c16c50e39788.png)
この API はパラメータがないので、呼び出すだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/e6d0d1d8-2907-5b1b-cd11-50614fb1acfe.png)
定義の画面でまずは画面上部の **[全般]** に以下の様に入力します。

| No. | 項目名                | 値                                                                    |
|:---:|:----------------------|:----------------------------------------------------------------------|
| 1   | 概要                  | Get Reports                                                           |
| 2   | 説明                  | Get Reports                                                           |
| 3   | 操作 ID               | GetReports                                                            |

続いて **[要求]** の **[+サンプルからのインポート]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/97b33737-27f6-b8ca-af33-251a2ead83ec.png)

**Get Reports** の公式ドキュメントに

```HTTP:GetReports
GET https://api.powerbi.com/v1.0/myorg/reports
```

とあるので
動詞: **GET**
URL: **https://api.powerbi.com/v1.0/myorg/reports**
と入力して、**[インポート]** をクリックします

つぎに **[応答]** も **[+既定の応答を追加する]** をクリックします



先ほどの公式ドキュメントの **[Example]** の **[Sample Response]** の JSON が記載されていますのでこれをコピーして、貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/926b5b38-e71c-8c59-4ba4-d091082f07a1.png)

```text:ヘッダー
Content-Type application/json
Accept application/json
```
```JSON:本文
{
  "value": [
    {
      "datasetId": "cfafbeb1-8037-4d0c-896e-a46fb27ff229",
      "id": "5b218778-e7a5-4d73-8187-f10824047715",
      "name": "SalesMarketing",
      "webUrl": "https://app.powerbi.com//reports/5b218778-e7a5-4d73-8187-f10824047715",
      "embedUrl": "https://app.powerbi.com/reportEmbed?reportId=5b218778-e7a5-4d73-8187-f10824047715"
    }
  ]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/48e6b9d3-0914-08a8-7c64-4b56ddfe93cb.png)
画面右下の **[テスト]** をクリックし、**[テスト]**　画面に遷移します。
**[テスト]**　画面ではまず接続を作成します。**[+新しい接続]** をクリックして、自身の Power BI アカウントでサインインをしてください。
もしここでうまく接続が作成できない場合は、**2.セキュリティ** か **Azure AD** の設定がうまくいっていない可能性がありますので、見直してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/d6508781-80d8-e5bc-9fe9-60ae0974694a.png)
正常に接続が作成できると、**GetReports** の **[テスト操作]** がクリック可能になりますが、
画面右上の **[コネクタの更新]** をクリックしてから、**[テスト操作]** をクリックしてください。
コネクタの更新をしておくことで、定義した最新の状態でテストをすることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/4977a3e3-da1e-6bcf-0052-18fd41e2cc08.png)
状態が **200** であれば **正常終了** です。ボディを見ると、自身の **[マイワークスペース]** のレポート一覧が取得できていることがわかります。

これでまずは **Get Reports** の定義は完了です。
ようやく **Export Reports** を定義する準備が整いました。
## **Export Reports** を定義する
画面左上のナビゲーションで **[3.定義]** に戻り、**[新しいアクション]** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/63ba1fee-ad9a-a859-86af-4d65fcc99f8c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/2f5d37c5-c545-8363-b523-69e08c6387e3.png)
それぞれの項目に以下の様に値を入力してください

| No. | 項目名                | 値                                                                    |
|:---:|:----------------------|:----------------------------------------------------------------------|
| 1   | 概要                  | Export Report                                                         |
| 2   | 説明                  | Export Report                                                         |
| 3   | 操作 ID               | ExportReport                                                          |

**[要求]** の **[+サンプルからのインポート]** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/747c36c9-aa6f-23be-ac07-3d696787736f.png)
**Export Reports** の公式ドキュメントに

```HTTP:ExportReports
GET https://api.powerbi.com/v1.0/myorg/reports/{reportId}/Export
```

とあるので
動詞: **GET**
URL: **GET https://api.powerbi.com/v1.0/myorg/reports/{reportId}/Export**
これをそのまま入力して、**[インポート]** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/290fe74b-0023-e68d-feab-68f9d6f751c4.png)
**URL** 欄に **{パラメーター名}** と入力するとパラメーターとして認識し、**Path** で認識されます。
**Power Automate** のフローで使用する際にレポート名を選択してレポートIDを指定したいから **Get Reports** を先に定義したのでした。それをこれから設定します。

赤枠で囲んだ **[reportId]** をクリック - **[編集]** をクリックしてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/fa9a6557-1156-dd0e-291a-1eddc35adc04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/2e1a4597-cb2e-7924-fb31-7b549c6cf269.png)
パラメーター設定の画面に遷移するので **ドロップダウンの種類** で **[ダイナミック]** を選択してください。下に **操作ID**、**値**、**値の表示名** が出てくるので、以下のように選択します。

| No. | 項目名                | 値                                                                    |
|:---:|:----------------------|:----------------------------------------------------------------------|
| 1   | 操作 ID               | GetReports                                                            |
| 2   | 値                    | value[id]                                                             |
| 3   | 値の表示名            | value[name]                                                           |

こうすることでフロー作成時に **レポート名** を選んで、裏では **レポートID** を設定するということが可能になります。
パラメーターの設定が終わったら画面左上の **[←戻る]** で戻ってください。

後はレスポンス（応答）の設定です。**[応答]** の **[+既定の応答を追加する]** をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/98f41d7b-72f7-2c25-8168-124ee10bca92.png)

さて公式ドキュメントの **Responses** を見てみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/a289cc23-3ed9-5f9b-efa1-b24d5b502691.png)
あれ？ JSON がない...
そう、ないのです。この **API** は **pbix** ファイルをエクスポートしダウンロードさせるので **JSON** 形式では返ってきません。

**「でも、Medea Types: "application/zip" って書いてあるけど…？」**

って思った人、鋭い。
答えは簡単で、pbix ファイルは zip ファイルです。試しにお手元の pbix ファイルの拡張子を zip に変えて、展開してみてください。ね、展開できたでしょ？
Microsoft Office の各種ファイル (docx, pptx, xlsx など) と同様です。

なので **application/zip** で OK です。
というわけで、ヘッダーに **Content-Type application/zip** だけ設定しておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/ce032e57-39e9-daa3-71a1-96f44bda4cf8.png)
インポートをクリックします。

はい、これで **Export Report** の定義は完了ですので、画面右下 **[テスト→]** でテスト画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/b2074161-4b06-2cd9-60df-45962a641bd2.png)
テスト画面でいざテスト！って思ったら **Export Report がない？**
はい、カスタムコネクタを作ってると、これよくあります。ご安心ください。
画面上部にちゃんとメッセージが出てますね、
**「変更をテストするためにコネクタを更新する必要があります」**と。

というわけで、**[コネクタの更新]** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/f381e93d-104b-6b12-e4be-1b707d1b3a81.png)
はい、ちゃんと操作のところに **ExportReport** が出てきましたね。
早速テストをしてみましょう。
残念ながらテスト時は直に レポートID を入力する必要がありますので、**[マイワークスペース]** にある適当なレポートの URL を見てください。

```HTTP:URL
https://app.powerbi.com/groups/me/reports/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/ReportSection
```

URL の /reports の後ろの **xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx** が **レポートID** です。これをコピーして、reportId に張り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/dce4e701-f0d1-d170-61b0-e3899b0b9756.png)
無事に動作すれば、こんな感じで値が返ってきます。ボディはバイナリファイルですので、わけわかんなくて OK です！

いったんここで画面右上の **[閉じる]** で編集画面を閉じます。

# あとは実際にフローで使ってみよう！
というわけで、あとは実際にフローを作って、カスタムコネクタを使いましょうということなんですが、
さすがに長くなり過ぎたので、[Vol.2](https://qiita.com/yugoes1021/items/5b9e3226837f85243d4e) に書きます。

# まとめ
実際にカスタムコネクタを使って、タイトルの「定期的にレポート (pbix) をエクスポートしたい」を実現するのは次回とします。
今回 (Vol.1) はその準備とカスタムコネクタの作り方をわかっていただければ、OK です！

以上ですー。最後まで読んでいただきありがとうございました。次回 [Vol.2](https://qiita.com/yugoes1021/items/5b9e3226837f85243d4e) もどうぞ！

そして相変わらず、皆様からのリクエスト、お待ちしております。
何かリクエストがあれば、以下までー🤗
Twitter: https://twitter.com/yugoes1021
Facebook: https://www.facebook.com/yugoes1021
LinkedIn: https://www.linkedin.com/in/yugoes1021/