新米が「Microsoft Learn：Web API を Power Appsで使用する」をやってみた

**はじめに**
---

本記事は、新米社員がMicrosoft Learnの「Web API を Power Appsで使用する」に挑戦し、格闘した軌跡を記しています。躓いたポイントも備忘録として記載しています。初学者に共感して貰えたり、同じことを挑戦して上手く行かない方の参考になればという想いを込めて投稿しています。（※本記事は2023年9月14日時点での情報になります)

https://learn.microsoft.com/ja-jp/training/modules/discover-web-apis-power-apps/

**本ハンズオンで行うこと**
---
Azure API Management からAPI をエクスポートすることで、カスタムコネクタを作成し、キャンバスアプリで使用するまでの一連の流れを学習します。ハンズオンは、下記の5つのステップで構成されています。

１. 必要なファイルを API  Management にプロビジョニングする
２. API Management からカスタム コネクタへの Web API のエクスポート
３. カスタムコネクタへの接続を作成する
４. カスタムコネクタをテストする
５. Power Apps キャンバスアプリでカスタムコネクタを使用する

**ステップ１：必要なファイルを API  Management にプロビジョニングする**
---

最初から難しそうなお題が待っていました。API Management？プロビジョニング？
聞きなれない言葉があるだけで難しさ2倍になるのは、新米あるあるですよね。

さらに、こういう事前準備に関する内容はドキュメント内に詳細な説明がないことが多く、嫌な予感がしました。「どれどれ、事前準備の手順をみてみよう！」
![スクリーンショット 2023-09-12 17.16.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/47b50e93-d609-1133-235e-0542eed85340.png)
やはり少ない（笑）とりあえずわからない言葉を理解することから、一つ一つ始めることにしました。

Azure API Managementは、既存のバックエンドサービスに対してAPIのゲートウェイを作成するクラウドサービスで、企業内で管理しているAPIの数が多い場合や、APIに対して変更が加えられることが多い場合に使用されます。

https://learn.microsoft.com/ja-jp/training/modules/introduction-to-azure-api-management/

プロビジョニングは、必要なものを準備することで、「サーバープロビジョニング」のように〇〇プロビジョニングのように使用されることが多いです。サーバープロビジョニングと言えば、サーバーを利用可能な状態にするための準備を意味します。

https://pfs.nifcloud.com/navi/words/provisioning.htm#:~:text=%E3%80%8C%E3%83%97%E3%83%AD%E3%83%93%E3%82%B8%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0%EF%BC%88Provisioning%EF%BC%89%E3%80%8D%E3%81%AF,%E3%81%A8%E5%91%BC%E3%82%93%E3%81%A7%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

単語の意味を理解したところで、手順通りに進めていきます。

**1. Web APIのダウンロード**
まずは、Web API のダウンロードをします。
[「Github から Web API をダウンロードをして」](https://github.com/MicrosoftDocs/mslearn-developer-tools-power-platform/blob/master/fusion-developers/artifacts.zip)の文言がURLにリンクされているので、クリックします。
![スクリーンショット 2023-09-12 17.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/002b1b8b-ead6-2e6c-b895-b7c0128b134a.png)
Github に保管されている ZIP ファイルをダウンロードし、ZIP ファイルを解凍します。
![スクリーンショット 2023-09-12 17.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/e1956f5f-0e9d-8bc5-aac9-5c09df96aafe.png)
artifacts ファイルの中にあるREADME ファイルを開き、内容を確認します。
![スクリーンショット 2023-09-12 17.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/f0456fed-d81a-3369-26a6-d702518f5ef1.png)
次の手順として、
① Azure CLIでAzureにログインする
② bashスクリプトを実行する
がありました。ここからも躓き要素がたくさんありました、、。

まずは、「① Azure CLIでAzureにログインする」を行います。
最初に、Azure CLI をローカル環境にダウンロードします。私はmacユーザーなので、Homebrewというパッケージ管理ツールを用いて Azure CLI をダウンロードしました。

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-macos

(※ Windows・Linuxユーザーは、ダウンロード方法が異なる為、宜しければ下記資料からダウンロード方法をご確認下さい）

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-linux?pivots=apt

**2. Homebrewのダウンロード**

Homebrewのダウンロード方法は、[Homebrew 公式ページ](https://brew.sh/)にあるシェルコマンドをそのままコピーして、ターミナルで実行するだけです。
![スクリーンショット 2023-09-12 20.32.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/97ef2040-c54b-ed92-241e-3eb937dc0400.png)
私は以前、Homebrew をダウンロードしたことがあったので、Homebrew のバージョンのアップデートをしました。今回初めてダウンロードする方は次の内容を読み飛ばして頂いて構いません。

**Homebrewのアップデート**

Homebrewのアップデートは、アップデート前後で差分が大きいとアップデートエラーが発生します。アップデート前後で差分が大きい場合に、Homebrewの更新ファイル取得元のGitHubに対する負荷が高くなるのを防ぐためのようです。このエラーを解消する方法は2つあります。

① unshallow でアップデート手法を変更する

これは GitHub から Homebrew の更新ファイルを取得する際に使用される shallow clone 機能を無効化することでエラーを解消する方法です。shallow clone は最新ファイルのみを取得するための機能のため、重たい処理になってしまいます。Homebrew をアップデートする度に重たい処理が実行されるを避けるため、GitHubの要請で unshallow オプションを使用することが必要になりました。

https://www.curict.com/item/e4/e4b0aad.html

② depth でリポジトリの履歴を取得する数を段階的にする

これは fetch をする際にdepthオプションを使用することでリポジトリの履歴の取得数を変更する方法です。エラーの原因は、Homebrewのアップデート前後で差分が大きいことなので、徐々にfetchすることによりエラーを解消します。

https://qiita.com/jintz/items/b2a80590531c373bae39

①だけでも上手くいく場合もあるようですが、私は①のやり方で上手くいかず②の方法を実施しました。

**3. Azure CLI のダウンロード**

Homebrew をダウンロードしたら、Homebrewを用いてAzure CLIをダウンロードします。
macOSにインストールする際は、brewリポジトリを更新し、installコマンドを実行します。
![スクリーンショット 2023-09-13 11.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/33774911-9623-4648-294d-0c8448d61774.png)


**4. bashスクリプトの実行**

artifacts ファイル下のsetup.shファイルを実行します。
拡張子のshは、処理を実行する複数のコマンドを実行するシェルスクリプトを意味します。

![スクリーンショット 2023-09-12 23.24.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/5513c4ef-c538-c5a2-67ef-391005b97484.png)

```zsh:setup.sh
#!/bin/bash

RESOURCE_NAME="InventoryManagement-$(openssl rand -hex 2)"
RESOURCE_GROUP_NAME=$(az group list --query "sort_by([], &name)[0].name" -o tsv)

printf "Provisioning Resources ... (1/4)\n\n"

#Provision Resources
az deployment group create
--resource-group $RESOURCE_GROUP_NAME
--name powerappsexcercise
--template-file ./azuredeploy.json
--parameters resourceName=$RESOURCE_NAME
--parameters location=westus2
--verbose

printf "Deploying Web API ... (2/4)\n\n"

#Deploy Web API
az webapp deploy
--resource-group $RESOURCE_GROUP_NAME
--name apiapp-$RESOURCE_NAME
--src-path ./publish.zip
--type zip
--verbose

printf "Importing Web API to Azure API Management ... (3/4)\n\n"

#Import Web API to API Management
az apim api import
--resource-group $RESOURCE_GROUP_NAME
--service-name apim-$RESOURCE_NAME
--api-id 'inventory-management'
--display-name 'Inventory Management'
--path inventory
--api-type http
--protocols https
--service-url https://apiapp-$RESOURCE_NAME.azurewebsites.net
--specification-format OpenApiJson
--specification-path ./openapi.json
--subscription-required true
--verbose

printf "Linking API with Product ... (4/4)\n\n"

#Link API with Product
az apim product api add
--resource-group $RESOURCE_GROUP_NAME
--service-name apim-$RESOURCE_NAME
--product-id development
--api-id 'inventory-management'
--verbose

printf "Setup complete!\n\n"
printf "*********************** IMPORTANT INFO *********************\n\n"
printf "Deployed Resource Group: $RESOURCE_GROUP_NAME\n\n"
printf "Web API URL: https://apiapp-$RESOURCE_NAME.azurewebsites.net\n\n"
printf "OpenAPI UI URL: https://apiapp-$RESOURCE_NAME.azurewebsites.net/swagger\n\n"
```

setup.sh を言われるがまま実行すると、以下の実行結果が返ってきました。
(※必要に応じ、一部情報を????で記載しています）

```zsh:setup.sh 実行結果１
????noMacBook-puro:artifacts ????$ ./setup.sh 
Provisioning Resources ... (1/4)

{"code": "InvalidTemplateDeployment", "message": "The template deployment 'powerappsexcercise' is not valid according to the validation procedure. The tracking id is '????'. See inner errors for details."}

Inner Errors: 
{"code": "ValidationForResourceFailed", "message": "Validation failed for a resource. Check 'Error.Details[0]' for more information."}

Inner Errors: 
{"code": "SubscriptionIsOverQuotaForSku", "message": "This region has quota of 0 instances for your subscription. Try selecting different region or SKU."}
Command ran in 1.940 seconds (init: 0.111, invoke: 1.828)
Deploying Web API ... (2/4)

・・・（省略)

Setup complete!

***********************   IMPORTANT INFO   *********************

Deployed Resource Group: ????

Web API URL: https://apiapp-InventoryManagement-????.azurewebsites.net

OpenAPI UI URL: https://apiapp-InventoryManagement-????.azurewebsites.net/swagger

```
上記の結果からエラー情報を抜粋したものが以下です。

>"code": "InvalidTemplateDeployment", "message": "The template deployment 'powerappsexcercise' is not valid according to the validation procedure.

>Validation failed for a resource

>This region has quota of 0 instances for your subscription. Try selecting different region or SKU



1つ目のエラーは、[無効なテンプレートを使用することにより発生するエラー](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/troubleshooting/error-invalid-template?tabs=bicep)です。構文エラー、無効なパラメーター値、環境依存の関係など、いくつかの理由から発生します。「テンプレート配置「powerappsexcercise」は、検証手順に従って有効ではありません」という旨のエラーが出ているが、--name powerappsexcercise　では、リソースグループを作成する際のデプロイ名を定義しているだけです。なぜこのエラーが出ているのかが分からなかったため、後回しにしました。

3つ目のエラー内容から、リソースをプロビジョニングするリージョンを westus2 から japanwest に変更しました。
![スクリーンショット 2023-09-13 16.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/92360dc3-1570-119b-39ce-2993c95223fc.png)
再度実行します。
今度は、以下の実行結果が返ってきました。

```zsh:setup.sh 実行結果２
????noMacBook-puro:artifacts ????$ ./setup.sh 
Provisioning Resources ... (1/4)

{
  "id": "/subscriptions/????/resourceGroups/?????/providers/Microsoft.Resources/deployments/powerappsexcercise",
  "location": null,
  "name": "powerappsexcercise",
  "properties": {
    "correlationId": "????",
    "debugSetting": null,
    "dependencies": [
      {
        "dependsOn": [
          {
            "id": "/subscriptions/????/resourceGroups/????/providers/Microsoft.Web/serverfarms/asplan-InventoryManagement-8181",
            "resourceGroup": "????",
            "resourceName": "asplan-InventoryManagement-????",
            "resourceType": "Microsoft.Web/serverfarms"
          }

・・・(省略)

Setup complete!

***********************   IMPORTANT INFO   *********************

Deployed Resource Group: ????

Web API URL: https://apiapp-InventoryManagement-????.azurewebsites.net

OpenAPI UI URL: https://apiapp-InventoryManagement-????.azurewebsites.net/swagger
```

先程のエラーは消え、json 形式の値が取得できました。
先程のエラーの原因であるデプロイ名の部分も、json の結果に反映されていることが確認できます。

さらに、Azure ポータルのアクティビティログでもデプロイが成功していることが確認できました。
![スクリーンショット 2023-09-13 19.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/658e1e80-09df-79bb-f511-40da8899f40f.png)
リソースも作成されていることが確認できました。
![スクリーンショット 2023-09-14 9.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/4d44d453-486a-97df-27c4-fb424f55487e.png)


結果的に上手くいった感じもしますが、リソースを作成するリージョンの設定を修正したことでエラーが全て解消されました。

以上で、本ハンズオンを行うための準備が完了です。

**ステップ２：API Management からカスタム コネクタへの Web API のエクスポート**
---

**1. サブスクリプションキーの確認**
Power Appsで API Management でホストされている任意の Web API にアクセスするには、サブスクリプションキーが必要です。ステップ１で作成した API Management サービスの「サブスクリプション」を選択し、画面最右部の３点リーダーから「キーの表示/非表示」を押下します。
![スクリーンショット 2023-09-14 9.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/0861a72f-1ed8-b64b-4e3e-52832beb9dd0.png)

:::note info
サブスクリプションキーは、API Managementで管理しているAPIを使用する際の暗証番号のようなものです。主キー(プライマリキー）と２次キー（セカンダリキー）の２種類のキーが存在し、セキュリティの観点から暗証番号(サブスクリプションキー）を変更する際に、ダウンタイムを回避するために使用されます。
:::

次に主キーと2次キーをコピーします。
![スクリーンショット 2023-09-14 10.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/e1bad9aa-a392-a9d1-9a77-a0e5b227dd81.png)

**2. API ManagementサービスからAPIをエクスポート**
画面左部のメニューで「API」を選択し、エクスポート対象である「Inventory Management」横の３点リーダーから「Export」を選択します。
![スクリーンショット 2023-09-14 11.01.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/4d9cf10b-0110-a1ad-f99b-0c8e254a095a.png)
エクスポート先に「Power Platform and Power Automate」を選択します。
![スクリーンショット 2023-09-14 11.16.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/8e4c06c8-4628-d1ff-52e5-0ab67579d558.png)

**3. コネクタの作成**
「コネクタの作成」ボタンを押下します。
![スクリーンショット 2023-09-14 11.18.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/98ff3df8-5f03-668e-83ba-93d2abf46083.png)
作成するコネクタの詳細を設定します。
Power Platform の環境はコネクタを使用する環境に設定し、「作成」ボタンを押下します。
![スクリーンショット 2023-09-14 11.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/5392ac86-51e0-8bd0-6cdf-654148b647ea.png)
スクリーンショットを撮り損ねたのですが、数秒後に「コネクタの作成が完了しました」という旨のポップアップが画面右上にでます。

以上で、コネクタの作成が完了しました。

**ステップ３：カスタムコネクタへの接続を作成する**
---
**1. Power Apps 画面でのカスタムコネクタの確認**
ステップ２で作成したカスタムコネクタを Power Apps から確認します。
画面左部のメニューで「カスタムコネクタ」を選択すると、カスタムコネクタの一覧が確認できます。
先程作成した「Inventory Management」コネクタが確認できました。
![スクリーンショット 2023-09-14 11.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/b5977f48-5813-cb94-4f57-f0c5221a0ab0.png)

**2. データの接続**
次に、カスタムコネクタのデータに接続をするため、サブスクリプションキーを使用しPower Appsで設定をします。カスタムコネクタ名の右側にある「＋」ボタンを押下します。

先程コピーしたプライマリキーを「サブスクリプションキー」にペーストし「作成」ボタンを押下します。
![スクリーンショット 2023-09-14 12.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/614894e7-4599-c761-58d3-f79817d13eb3.png)
データ接続が成功すると自動的に接続一覧の画面に遷移します。カスタムコネクタの変更履歴が更新され、接続済みになっていることが確認できました。
![スクリーンショット 2023-09-14 12.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/59cf28e6-f44a-eca5-ef3b-89f4d289554a.png)
以上で、カスタムコネクタの接続が完了しました。

**ステップ４：カスタムコネクタをテストする**
---
**1. カスタムコネクタの編集**
ステップ３で作成したカスタムコネクタが期待通り動作するかテストします。
カスタムコネクタ名の右側にある「編集」アイコンを押下します。
![スクリーンショット 2023-09-14 13.14.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/9fd494df-7cda-058b-64e5-34aba1d74bd3.png)

**2. テスト画面への遷移とテストの実行**
画面上部の「5.テスト」タブに移動し、「テスト操作」ボタンを押下します。
![スクリーンショット 2023-09-14 13.17.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/745e99ec-20bf-3b7e-59ea-85e5410e52c7.png)
画面左部の「操作（１）」でコネクタが期待通りに動作したことを確認できました。

**ステップ５：Power Apps キャンバスアプリでカスタムコネクタを使用する**
---

:::note warn
(※この内容はMicrosoft公式の資料に詳細な手順説明があるため、ポイントを絞って解説しています。より詳細な手順を確認したい方は[こちら](https://learn.microsoft.com/ja-jp/training/modules/discover-web-apis-power-apps/08-use-custom-connector-power-apps)をご覧下さい)
:::

**1. カスタムコネクタの追加**
Power Apps で任意のアプリを作成します。
ツリービューの「データ」アイコン選択し、「データの追加」ボタンを押下します。
![スクリーンショット 2023-09-14 13.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/c325b864-2e40-f809-babd-ccb4913981f1.png)
検索窓で「Inventory」と検索すると、「Invemtory Management」コネクタが表示されるので、選択します。
![スクリーンショット 2023-09-14 13.41.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/776f26af-b67d-34be-88c7-50d60d78b2b4.png)
カスタムコネクタが接続されたことが確認できます。
![スクリーンショット 2023-09-14 13.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/335ab63f-0151-2bc6-9855-06a677670d94.png)
**2. コントロールの配置**
次に、ボタンコントロールとギャラリーコントロールを使用してカスタムコネクタからデータ取得できるか確認します。ボタン押下時に「warehouses」という名前のコレクション(テーブル）にカスタムコネクタから取得したデータをギャラリーに表示します。![スクリーンショット 2023-09-14 13.50.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/fd8ed52e-4eb4-4f0f-f023-300ff183b361.png)
**3. 実行**
ボタンを押下します。
![スクリーンショット 2023-09-14 13.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533137/3dcbd4c8-08fb-d01f-05f6-bcdf8b89768d.png)
先程まで空だったコレクションに取得データが投入されました。
以上で、Power Appsでカスタムコネクタを使用できるようになりました。

**まとめ**
---
今回は、Microsoft Learnの「Web API を Power Appsで使用する」をハンズオン形式で学習しました。
Azure API Management からAPI をエクスポートすることで、カスタムコネクタを作成し、キャンバスアプリで使用するまでの一連の流れを確認しました。