0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Power BI ServiceでBearer認証APIを更新できない問題

Posted at

はじめに

マネーフォワード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 カスタムコネクターで認証制御を実装

おわりに

Power BI Desktop で完璧に動いていたものが、Power BI Service に載せたとたん動かない……。
よくある話ですが、今回は 「テスト接続をスキップする」チェック一つで救われました。

この記事が、同じようなエラーで悩んでいる方の助けになれば嬉しいです。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?