API Connectでユーザー定義ポリシーを使ってみた

# 前提バージョン
IBM API Connect 5.0.6.3
※当記事ではVMware Workstation PlayerでAPI ConnectがPC上に導入済みとします。

# 1 API Connectのユーザー定義ポリシーについて
API Connectでは、APIに対して、APIが呼ばれた際にどのような処理を行うか記述することができます。
（ログ出力、エラーハンドリング、分析ログ出力有無の設定など）
この処理は「ポリシーアセンブリー」と呼ばれます。
ポリシーアセンブリーはAPI DesignerまたはAPI Manager画面で作成します。

ポリシーアセンブリーの編集画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/67a880bd-ff56-2fa1-f5f2-534dcd9579d1.png)
画面の左側に表示されるIf、Throw、GatewayScript、XSLT、マップ、編集　などの部品をドラッグ&ドロップして処理内容を書いていきます。これらの部品はAPI Connectがデフォルトで提供するため、組み込みポリシーと呼ばれます。

このうち、GatewayScriptやXSLTはプラグラムの記述になり、ログ出力やエラーハンドリングなど共通的な処理において多く使用されます。このプログラムの記述を部品化し、必要なパラメータだけ見せたい場合があります。そのための機能がAPI Connectの「ユーザー定義ポリシー」です。

[Before] ログ出力ポイントごとにGatewayScript処理を記述しなければならなかった
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/77f691ce-7464-a38c-5fda-8a27e57c15ab.png)

↓

[After] GatewayScriptの記述は隠蔽され、必要なパラメータのみ指定可能になった
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/c041965d-2c30-d22f-0183-0d4375498fdd.png)

# 2 ユーザー定義ポリシー作成
この記事では、固定の文字列をDataPowerのログに出力する、という単純な部品を作成します。大まかな流れは以下の通りです。
①部品名、パラメータ、処理の概要を決める
②テキストエディタで、部品名、パラメータの定義体を作成する（「ポリシー定義ファイル」と呼びます）。
③DataPowerのwebGUI画面で、処理ポリシーおよび処理アクションのオブジェクトを作成する。また、処理アクションから参照するGatewayScriptファイルも作成する。
④DataPowerのwebGUI画面で、③で作成した物をエクスポートする。
⑤②、④のファイルをzipファイルに固めます。
⑥API Managerの画面で、⑤のzipファイルをインポートする。

## 2-1 部品名、パラメータ、処理の概要を決める
部品名：「footprint」とします。

### パラメータ
| パラメータ | GatewayScript内の変数名 | データ型 | 必須 | デフォルト値 |
|:----------:|:-----------:|:------------:|:-----:|:-------------:|
| 出力内容 | outputData | string | 〇 | なし |
| ログカテゴリ | logcategory | string  | 〇 | gatewayscript-user |
| ログレベル | loglevel | enum(info,warn,error)  | 〇 | error |


### 処理の概要
「outputData」の内容を、ログカテゴリー「logcategory」およびログレベル「loglevel」で、DataPower上で出力する。

### その他（プロトコルの指定）
動作するプロトコルとして「jsonおよびsoap」、「json」、「soap」が指定可能です。今回は「json」のみとします。

### その他（ランタイムの指定）
動作するランタイムとして、「DataPowerおよびMicro Gateway」、「DataPower」、「Micro Gateway」が指定可能です。今回は「DataPower」のみとします。

## 2-2 ポリシー定義ファイルの作成
2-1で決めた内容を元に、テキストエディタで以下のようなyamlファイルを作成します。

```yaml:footprint.yaml
policy: 1.0.0

info:
  title: footprint
  name: footprint
  version: 1.0.0
  description: デバッグのための固定メッセージのログ出力ポリシー

attach:
    - rest

properties:
    $schema: "http://json-schema.org/draft-04/schema#"
    type: object
    properties:
        outputData:
            label: 出力内容
            description: デバッグのための出力内容を入力します（固定値のみ可）
            type: string
        logcategory:
            label: ログカテゴリー
            description: 出力ログカテゴリー
            type: string
            default: gatewayscript-user
        loglevel:
              label: ログレベル
              description: 出力ログレベル（defaultログへの出力は初期設定ではerror以上です）
              enum:
                - debug
                - info
                - error
              default: error
              type: string
    required:
      - outputData
      - logcategory
      - loglevel
gateways:
    - datapower-gateway
```

## 2-3 処理ポリシー、処理アクション、GatewayScriptファイルの作成
### 2-3-1 GatewayScriptファイルの作成
テキストエディタで以下のようなGatewayScriptファイルを作成します。

```js:footprint-logoutput.js
var apic = require('local:isp/policy/apim.custom.js');

var props = apic.getPolicyProperty();
var outputData = props.outputData;
var logcategory = props.logcategory;
var loglevel = props.loglevel;

if (loglevel == 'info') {
  console.options({'category':logcategory}).info(outputData);
} else if (loglevel == 'warn') {
  console.options({'category':logcategory}).warn(outputData);
} else if (loglevel == 'error') {
  console.options({'category':logcategory}).error(outputData);
}
```

### 2-3-2 処理ルール、処理アクションの作成
1. DataPowerにログインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/330833f0-375e-74a8-fa11-d715da968d7b.png)

2. WebGUIを開きます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/6dc3d1b3-44f0-336f-4e1d-823cd1c57c66.png)

3. 処理ルールを開きます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/be90efc6-696a-fd9b-683e-d8def812a76f.png)

4. 追加ボタンを押します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/0b5f7f1e-90dd-f291-e5ee-0dc90b9e868f.png)

5. オブジェクト名：footprint-main、ルールの方向：両方向、非XML処理：オン　と入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/3f304461-1218-c225-4101-861fd2f35905.png)

6. ルールアクションで「+」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/a4d9533d-66d7-ca77-2a9b-717328aeda68.png)

7. 名前：footprint-logoutput、アクションタイプ：GatewayScript、入力・出力：NULL、GatewayScriptファイル：local:///policy/footprint/footprint-logoutput.js
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/ef6b8db4-77bd-17c5-aae1-4356331249ce.png)

8. 「適用」ボタンで処理アクションを保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/3388d602-a021-1bc4-4463-abd9337518ac.png)

9. 「適用」ボタンで処理ルールを保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/3388d602-a021-1bc4-4463-abd9337518ac.png)

### 2-3-3. GatewayScirptファイルの配置
1. トップ画面に戻り、「ファイル管理」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/15625017-579d-de9e-5de1-8923e9629e72.png)

2. localディレクトリのアクションを選択し、「サブディレクトリーの作成」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/4a682fba-d539-bcf2-e891-0e62e565129d.png)

3. policyディレクトリを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/b8615d77-122e-a19e-7553-1add574591d9.png)

4. 同様に、policyディレクトリの下に「footprint」ディレクトリを作成します。

5. footprintディレクトリのアクションを選択し、「ファイルのアップロード」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/ed9f7c14-e65a-b1f3-5b41-46e64a30d7ef.png)

6. GatewayScriptファイルをアップロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/81dff147-0e46-4c28-1cce-a19cac73fa0e.png)

## 2-4 作成物のエクスポート
1. 再びトップ画面に戻り、「構成のエクスポート」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/6b16948c-5702-3d2f-8104-93bd11cfd45b.png)

2. 「次へ」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/f8ed4a11-0c2d-d8aa-32e2-bac6fbc6d89c.png)

3. ファイル名：footprint、エクスポート先：ZIP、参照：選択したオブジェクトで必要なすべてのオブジェクトを含める、エクスポートファイル：選択したオブジェクトが参照するファイルのエクスポート、選択したオブジェクト：foorprint-main, footprint-logoutput を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/ebc1617e-5282-71ba-13d6-19db16acb126.png)

4. ファイルがダウンロードされます。

## 2-5 2-2,2-4のファイルをzipファイルに格納
以下のフォルダ構造になるようにzipファイルを作成します。

footprint.zip
　|
　+－ footprint.yaml　　…2-2で作成したファイル
　|
　+－ implementation
　　　　｜
　　　　+ footprint.zip　…2-4でダウンロードしたファイル

## 2-6 作成したファイルのインポート
1. ダッシュボードを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/efee22e5-b476-8d76-31fe-01581eeede89.png)


2. カタログを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/cdc1c224-d219-b6a6-52ae-b77309b5c337.png)


3. 設定のアイコンを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/db48adc2-d360-d362-74d8-0893bafc5a6e.png)


4. ポリシーを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/5b4a8982-e55d-8676-a231-0ec0e63ae864.png)


5. インポートのボタンを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/378e78c3-d3c5-e8e0-a913-870d05c2e019.png)


6. ファイルを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/d790ad08-78f1-e03a-f737-717a48d2cb5e.png)


7. ポリシーが追加されました！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/b48ae733-b395-7cc0-8954-ba3799c81d4a.png)

8. アセンブリーエディターで確認します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/3e1f081c-a7f5-a0b0-4e65-68533bd367ea.png)

# 3 動作確認
アセンブリーエディターで、ユーザー定義ポリシーを２か所に配置して、ログ出力させてみます。
## 1箇所目：出力データが「001」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/928d7b22-c082-9ac5-9c5e-eb3c21309f7d.png)
## 2箇所目：出力データが「002」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/602afc76-7ee1-3579-a349-41ee974a6176.png)

## 実行結果
1回のAPI呼び出しで、無事2箇所分のログが出力されました！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/9eaeb93f-0d59-a58e-af13-b13efd8bb14b.png)



おつかれさまでした。

# 免責事項
この記事の内容は不正確である可能性があります。この記事の内容やその利用等によって生じた、いかなる損害に対しても責任は負いません。