MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Azure API Management REST API で API作成~エクスポートまで

特に目新しいことはしていませんが、API Management の REST APIを利用してPower Automateで APIの作成からできたAPIのエクスポートまでを実行してみたので、メモ。

なお、認証部分などの基本的な実行方法は前回のブログに書いたので省略しています。

mofumofupower.hatenablog.com

今回使うのは以下の3つ、作成とエクスポートとシークレットの取得です。

Apis - Create Or Update (Azure API Management) | Microsoft Docs

Api Export - Get (Azure API Management) | Microsoft Docs

Subscription - List Secrets (Azure API Management) | Microsoft Docs

全体のフローの構成は以下のようにしています。

f:id:mofumofu_dance:20201218140824p:plain

  1. まずBlobストレージにAPIのもとになるSwagger specをアップロードします
  2. API ManagementからアクセスできるようにSAS URIを作成
  3. 上のURLを指定してAPIを作成
  4. エクスポートを実行 (エクスポートでは結果を取得するURLが返される)
  5. エクスポート結果取得
  6. サブスクリプションのシークレット取得

3. BlobのSAS URIを指定してAPIを作成

API ManagementのREST APIでは、以下のようなJSONでAPIを一から定義することができます。

{
  "properties": {
    "description": "apidescription5200",
    "authenticationSettings": {
      "oAuth2": {
        "authorizationServerId": "authorizationServerId2283",
        "scope": "oauth2scope2580"
      }
    },
    "subscriptionKeyParameterNames": {
      "header": "header4520",
      "query": "query3037"
    },
    "displayName": "apiname1463",
    "serviceUrl": "http://newechoapi.cloudapp.net/api",
    "path": "newapiPath",
    "protocols": [
      "https",
      "http"
    ]
  }
}

これでAPIを作って、一つずつOperatioinを定義してもよいのですが、数が多くなってくるとかなり煩雑&エラーの対応が大変なので、可能であればSwagger specを作成して登録する方が楽です。

その場合のリクエストボディは以下のように、基本的にはformatとjsonが置いてあるURLを指定するだけです。

ここで注意事項は、URLが匿名アクセスを許可していることです。このため、Blobにアップロードした後SAS URIを取得しています。

{
  "properties": {
    "format": "swagger-link-json",
    "value": "http://petstore.swagger.io/v2/swagger.json",
    "path": "petstore"
  }
}

地味に間違えやすいのが、メソッドがPUTな点です。癖でPOSTしたらエラーになるので気をつけましょう。

PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis/{apiId}?api-version=2019-12-01

以上を踏まえ、この部分のアクションは下図のようになります。

f:id:mofumofu_dance:20201218142657p:plain

4. APIのエクスポートを実行

APIのエクスポートは画面上でできることとほとんど差はありません。

残念ながら、Power Apps/Automateへのカスタムコネクターエクスポートにはまだ未対応です。

f:id:mofumofu_dance:20201218142845p:plain

例えば画面上で [OpenAPI v2 (JSON)] と書かれているエクスポートの種類を選ぶと、結果は以下のようにBlobのURLが返ってきます。(body.value.link)

{
  "id": "/subscriptions/xxxxxxx/resourceGroups/Oakdale/providers/Microsoft.ApiManagement/service/oakdaleapi/apis/tesla",
  "format": "swagger-link-json",
  "value": {
    "link": "https://apigblstorageprdkw1.blob.core.windows.net/api-export/Tesla API.json?sv=2017-04-17&sr=b&sig=zzzzzzzzzzzzzD&se=2020-12-17T07:25:30Z&sp=r"
  }
}

なお、このURLは発行から5分間のみ有効なので、ダウンロードをさせたい場合には、都度Exportするような仕組みにするのがよいでしょう。

認証情報を除けば、単純にGETしているだけです。

f:id:mofumofu_dance:20201218143635p:plain

5. エクスポート結果の取得

実際にエクスポートされたAPI Specを得るためには先ほどへんきゃくされたURLからコンテンツを取得する必要があります。

このステップのみ認証が不要で、下図のとおり単純にvalue>linkにあるURLを指定するだけです。

f:id:mofumofu_dance:20201218143845p:plain

6. サブスクリプションのシークレットを取得

Azure API Managementで作成したAPIを実行するためには、ヘッダーにサブスクリプションのシークレットを指定する必要があります。

普段は画面から取得していますが、自動化するのであれば (キーを再発行することも考慮して) 毎回取得しておくのが良いでしょう。

f:id:mofumofu_dance:20201218144203p:plain

APIとしては以下のURLを実行します。

POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/subscriptions/{sid}/listSecrets?api-version=2019-12-01

ここで{sid}は、特に指定がない (明示的に作成していない) 場合には masterと指定するとデフォルトのサブスクリプションになります。

※Azure上でのSubscription (リソースグループの上) ではないので注意してください。

f:id:mofumofu_dance:20201218144558p:plain

おわり

エクスポートでPower Apps/Automateのカスタムコネクターが指定できるともう少し利活用の幅が広がるのですが、一通り、APIの取得、作成、エクスポートがこれでできました。

今後アップデートでエクスポートの種類が増えたら、ユーザーからSwagger spec付きでAPI追加リクエストをして、レビューしてOKだったらAPI自動作成~環境への追加 までを自動化できるんじゃないかなと思っています。