やりたいこと
Power AutomateとPower Appsで利用できるカスタムコネクタを使ってAzure API Management(APIM)のAPIを呼び出したい。
APIM呼び出しにはAzureサービスプリンシパルを使ったOAuth2.0認証トークンで認証を通したい。(APIMのサブスクリプションキーは使わない)
動作確認できたところまでの備忘録を残しているので、一部不要な設定があるかもしれないことに注意してください。
事前知識
2025年7月時点でカスタムコネクタのOAuth2.0ではMicrosoft v1.0エンドポイントが使われています。
この投稿でやりたいことと 似た記事 があったので、こちらも参考になると思います。
Power Automateの場合はカスタムコネクタを作成せずとも、Logic Apps内でトークン取得して、APIMにアクセスすることができます。この記事 が参考になります。
Azureアプリ登録
Azureポータルで認証・認可に使用するアプリを用意します。クライアントシークレットを発行して値をメモしておきます。
APIのアクセス許可で Azure API Management Data plane
を追加し、管理者の同意を与えます。
認証ページで Web
のリダイレクトURIをあとのステップで追加します。
APIの公開ページでアプリケーションID URI( api://クライアントID
の形式)を設定します。スコープは今回は追加せずに進めました。
マニフェストページを開き、 api.requestedAccessTokenVersion
を 2
に変更して保存します。
APIMでAPIを登録する
APIM経由で呼び出したいAPIを登録します。
次にAPIのポリシーでInboundブロックを下記のように指定します。
<inbound>
<base />
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized">
<openid-config url="https://sts.windows.net/{テナントID}/.well-known/openid-configuration" />
<audiences>
<audience>作成したAzureアプリのクライアントID</audience>
<audience>https://apihub.azure.com</audience>
</audiences>
<issuers>
<issuer>https://sts.windows.net/{テナントID}/</issuer>
</issuers>
</validate-jwt>
</inbound>
Azureアプリを使ってJWTトークンを生成し、それをOAuth認証する流れですが、 validate-jwt
ブロックと audiences
、 issuers
は最低限必要だそうです。 validate-jwt
のドキュメンテーションは こちら 。
また、APIの設定で Subscription required
にチェックがついていることも確認してください。
私が動作確認したときは、カスタムコネクタ作成後のテストでサブスクリプションキーが間違っているエラーが何度も出てきましたが、 Subscription required
のチェックをつけ外したり、 製品
ページの設定で サブスクリプションを要求する
をつけ外したりしていると、該当エラーは発生しなくなりました。(最終的には両方とのサブスクリプションキー必須にすること)
→ サブスクリプションキーとOAuthを組みわせるとサブスクリプションキーのほうでUnauthorizedエラーになってしまったため、サブスクリプションのチェックは外して動作確認してください。いろいろ設定を試しましたがどうしてもサブスクリプションキーの併用はうまくいきませんでした。
Power Automateでカスタムコネクタを作成する
Power Automateのカスタムコネクタページを開き新規作成します。(見つからない場合は https://make.powerautomate.com/environments/Default-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/connections/custom
を開く)
コネクタ作成は 全般
セキュリティ
定義
AIプラグイン
コード
テスト
のタブがあるので、それぞれ入力していきます。
Azureサービスから作成する
を使えば、APIMからAPIを取り込めます。
全般
ホストはAPIMのURLを、ベースURLは /{API名}
にします。
セキュリティ
認証タイプは OAuth 2.0
に変更して、下記の通り入力します。
Client ID
と Resource URL
はそれぞれAzureアプリのクライアントIDを指定します。
リダイレクトURL
の値はAzureアプリの Web リダイレクトURI
に追加しておきます。 https://authorization-manager.consent.azure-apim.net/redirect/apim/{APIM名}
も念のため追加はしていました。
定義
APIMから取り込んでいたら、 アクション
がエンドポイントの数だけ定義済になっています。Swagger(OpenAPI)エディタでAPIの定義を調整します。
APIM要求にはサブスクリプションキーをヘッダーに含める必要がありますが、それを ポリシー
で下記の通り設定します。 Operations
は全エンドポイントを選択し、 Header value
はAPIMのサブスクリプションキーを指定します。
この設定をすることで、このカスタムコネクタからのリクエストでは常にヘッダーに ocp-apim-subscription-key
が付与されます。
→ サブスクリプションキーの設定は正しく設定しても、401 Access Deniedになってしまったため、使わないことにしたので、設定不要です
AIプラグインとコード
デフォルトのままでOK
テスト
ここでAPIの呼び出しテストを行います。新しい接続を作成し(ユーザー認証のポップアップが出てきます)、テスト操作を行います。
ユーザー認証の部分でエラーになることが多かったので、もしエラーになった場合は修正が必要になると思います。
ユーザー認証はできたけど、テスト操作でエラーになる場合は、同じトークンとサブスクリプションキーを使って別のAPIテストツールで直接APIMにリクエストが通るか確認したりしてみてください。
Power Automate/Power Appsでカスタムコネクタを使用する
Power Automate/Power Appsでコネクタを使って動作できるか確認して、正常に動作すれば作業完了です。