はじめに
マネーフォワードi社が提供する Admina というSaaS管理サービスを利用して社内アカウント管理を行っていますが、標準機能では部署単位の絞り込みや集計ができません。
そこで、Adminaが提供しているREST APIと、社内のSharePointリストをPower BIで組み合わせて、部署別にアカウント管理ができるダッシュボードを構築することにしました。
Power BI Desktopでレポートの作成までは順調でしたが、「せっかくなら共有とスケジュール更新もしたい」と思い、Power BI Serviceに発行したところ、資格情報エラーやスケジュール更新不可の問題に直面。
その解決までの試行錯誤と、突破口となった「接続テストをスキップ」機能の使い方を備忘としてまとめます。
実現したかったこと
- APIキー + Bearer認証のREST APIからアカウント情報を取得
- Power BI Desktopで部署別管理レポートを作成
- Power BI Serviceに発行して、スケジュール更新&共有を実現
ハマった現象
Power BI Desktop では以下のようなコードで問題なく動作していました。
let
Source = Json.Document(
Web.Contents(
"https://api.itmc.i.moneyforward.com",
[
RelativePath = "endpoint",
Headers = [ Authorization = "Bearer MY_API_KEY" ]
]
)
)
in
Source
ところが、Power BI Service に発行後、セマンティックモデルの資格情報設定で次のようなエラーが発生:
データ ソースの資格情報の更新に失敗しました:
The credentials provided for the Web source are invalid.
(Source at https://api.example.com)
さらに、スケジュール更新の設定画面では:
現在、以下のデータ ソースが更新をサポートしていないため、
このセマンティックモデルの更新をスケジューラできません:
・ Query1 のデータソース
と表示され、定期更新自体が不可能な状態になってしまいました。
原因の本質
調査の結果、以下のPower BI Serviceの仕様が原因であることが分かりました:
- Power BI Service は
Web.Contents()
に指定された BaseUrl に対して、認証なしのGET/HEADリクエストで接続テストを行う - このとき
404 Not Found
が返ると、「接続できない=更新対象外」と判断されてしまう - さらに匿名認証を設定しても、
Authorization
ヘッダーがService上で破棄されることがある
つまり、認証が必須なAPIであっても、認証前にPower BI Serviceが勝手に接続可否を判定してしまうことが、スケジュール更新不可の根本原因でした。
試したこと(全滅)
-
RelativePath
を使わず、URL全体をWeb.Contents
の第1引数に渡す
→ Power BI Service側で「動的URL」と判定されスケジュール更新不可 -
BaseUrl
を深めに設定し、RelativePath
にエンドポイントを指定
→ URL構成としては正しいが、依然として接続テストで弾かれる -
データソースの資格情報を「匿名」、プライバシーレベルを「組織」に設定
→ 変化なし、資格情報エラーのまま
結果、どれを試してもスケジュール更新は有効になりませんでした。
解決策:「接続テストをスキップ」を有効化
最終的に解決に導いたのは、Power BI Service 上のセマンティックモデル設定にある、
データ ソースの資格情報 > 資格情報を編集 > 「接続テストをスキップする」
にチェックを入れるだけ。
これだけで、接続テスト時に認証なしでBaseUrlにアクセスされる処理がスキップされ、正常に認証付きAPIへアクセスできるようになりました。
このUI操作は内部的には、以下のMコードのように Web.Contents()
に SkipTestConnection = true
を指定したのと同等の意味を持ちます。
let
Source = Json.Document(
Web.Contents(
"https://api.example.com",
[
RelativePath = "endpoint",
Headers = [ Authorization = "Bearer MY_API_KEY" ],
SkipTestConnection = true
]
)
)
in
Source
スケジュール更新も成功
この変更後、Power BI Desktop から再発行してみたところ:
- 資格情報設定画面での接続エラーが消えた
- スケジュール更新の設定が可能になった
- 無事、APIからの定期データ取得が自動化できた!
注意点と補足
-
SkipTestConnection=true
は 公式ドキュメント に明記されていない「非公開の挙動」に分類されます -
今後のアップデートで動作が変わる可能性があるため、本番利用時は十分に検証したうえでの採用を推奨
-
より堅牢に運用したい場合は、以下のような構成も検討余地あり:
- API Gateway で
Authorization
ヘッダーを不要にするプロキシ層を用意 - Power Query SDK による
.pqx
カスタムコネクターで認証制御を実装
- API Gateway で
おわりに
Power BI Desktop で完璧に動いていたものが、Power BI Service に載せたとたん動かない……。
よくある話ですが、今回は 「テスト接続をスキップする」チェック一つで救われました。
この記事が、同じようなエラーで悩んでいる方の助けになれば嬉しいです。