Azure API Management - Functions連携

# 目的

以下のように `Blank API` や `OpenAPI` からインポートして作成したAPIのBackendにFunctionsを連携させる

![image-20210923153521784.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/5ba855c3-a078-3475-7cd4-a4a3b4f1211a.png)

# API Management - Functions連携について

API Management と Functions を下図のように連携する
![image-20210924142646271.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/b4829694-2e64-acfb-10eb-4508dcf9d070.png)

## ① クライアント → API Management 

 `https://<APIMリソース名>.azure-api.net/<API URL suffix>` は以下から確認できる
![image-20210924143116203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/4672c52f-7d6c-33d0-fd25-9ce9bbb8da43.png)

`<operationパス>`は以下から確認できる
`<operationパス>`はそのままFunctionsへのリクエストに付与され、Functionsのルーティング設定と整合性が取れている必要がある
![image-20210924145639320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/a533f30f-5251-0095-5bb1-abbc9beacfbc.png)


## ②,③ API Management → Functions

`https://<関数アプリ名>.azurewebsites.net/api/<operationパス>`は以下から確認できる
![image-20210923160433391.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/14bf9905-2a2b-b22e-046a-9e55c63424f8.png)

`<operationパス>`のデフォルトは関数名（上図例は関数名が`HttpTrigger1`のためURLは`https://<関数アプリ名>.azurewebsites.net/api/HttpTrigger1`）
`<operationパス>`は、関数に紐づいた`function.json`の`route`で変更が可能
対応メソッドは`methods`で指定する（詳細は[ルーティング設定](https://qiita.com/takmot/items/6605ab69fb49d930c4a0#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E8%A8%AD%E5%AE%9A)参照）

以下`function.json`の例

```json:function.json
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get"
      ],
      "route": "data1/{id:int}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}
```

またリクエストには`x-functions-key`ヘッダが必須、値は**アプリキー**を使用する

**アプリキー**は以下から確認できる

![image-20210923161347326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/b55eb509-e833-6202-b402-b9a04fc36de5.png)

# API Management の Backend設定

## 名前付きの値の定義

Functionsのアプリキーを**名前付きの値**として定義する

![image-20210923161804716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/fe19c764-bf5a-2eec-6040-ab5846c50daa.png)

値には前述したFunctionsのアプリキー（`_master`, `default`または作成したアプリキーの値）を設定する

![image-20210923161920331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/5e3abab0-313b-8fa8-aed3-e0bfe64d4525.png)


## Backendの登録

以下のようにBackendを追加する
種類に`Azureリソース`から該当のFunctionsを選択し、
ランタイムURL（リダイレクト先URL）は`https://<関数アプリ名>.azurewebsites.net/api`にする（初期値として`https://<関数アプリ名>.azurewebsites.net`が入力されるので`/api`を追加する）
証明書チェーン、証明書名の検証は☑を外す

![image-20210923162453795.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/25861f49-edc9-4f18-f5ab-5d65fdaf0cd6.png)

認可資格情報としてヘッダーに`x-functions-key`を追加し、値には定義した**名前付きの値**を使用する

![image-20210923162928441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/e553a1d7-5396-4d54-791c-864898d64406.png)


## APIの作成

適当なAPI、operationを作成する

![image-20210923163247243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/a33ccabe-a93f-cccf-c7f3-9f6a0be521b8.png)


## APIにBackendの紐づけ

以下からInboundポリシーを編集する

![image-20210923163752239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/8c195875-a223-1b9d-689c-782f371ff19e.png)

以下のように`set-backend-service`ポリシーを追加する
`backend-id`の値は登録したBackendの名前を設定する

```html
<policies>
    <inbound>
        <base />
        <set-backend-service backend-id="test-backend" />  # 追加
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
```

`set-backend-service`ポリシーを設定することで、Backend登録時に設定した`<ランタイムURL>/<operationパス>`（`https://<関数アプリ名>.azurewebsites.net/api/<operationパス>`）にリダイレクトされる



## テスト

### 結果

![image-20210923165708946.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/c2238d4f-d9b2-2cf8-ee11-1b7fe12f6479.png)

### Functions内容

![image-20210923165842073.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/3e22a5c4-de65-dcdc-dbb9-772828ad65d2.png)


## 外部からのAPIコール

外部からAPIをコールする場合は、製品にAPIを追加する必要がある

![image-20210923170051212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/c45267c8-1f85-bce6-05f4-66ed1e86b7c6.png)