IBM API Connect 関連メモ - (5)Secure Gateway経由でのz/OS Connectとの連携

# はじめに
IBM Cloud上のAPI Connectを試してみた時の作業ログです。
オンプレミスのサーバー上にREST APIでアクセスできるサービスがあってそれをAPI Connectで外部公開したい、というシナリオを想定します。
その場合、API Connect(IBM Cloud)とオンプレのサーバーをセキュアに接続する必要がありますが、そこを実現してくれるSecure Gatewayというサービスサービスがあります。今回はそのSecure Gatewayを使ってみます。
バックエンドのサービスはz/OS Connect(z/OS上のサービスを公開するためのコンポーネント)で公開されたCICSアプリケーションを想定します。

Secure Gateway Client用のマシンにはWindows10を使用します。

## 関連記事

[IBM API Connect 関連メモ - (1)既存REST APIの取り込み](https://qiita.com/tomotagwork/private/d02f8e6092740b0e782f)
[IBM API Connect 関連メモ - (2)API Connectツールキットを使用したNode.jsアプリ作成(Loopback)](https://qiita.com/tomotagwork/private/7872ec8f99de57d7819a)
[IBM API Connect 関連メモ - (3)カタログ、開発者ポータルの構成](https://qiita.com/tomotagwork/private/da577551d7f4c50c4fd2)
[IBM API Connect 関連メモ - (4)各種APIの管理](https://qiita.com/tomotagwork/private/99e9b35227a0f80b2a91)
[IBM API Connect 関連メモ - (5)Secure Gateway経由でのz/OS Connectとの連携](https://qiita.com/tomotagwork/private/59e88b782bb72f1d0c1a)
[IBM API Connect 関連メモ - (6)API Connect-z/OS Connect間TLS接続](https://qiita.com/tomotagwork/private/c70b8566129e51c92423)
[IBM API Connect 関連メモ - (7)z/OS Connect 基本認証 + ID伝播](https://qiita.com/tomotagwork/private/38d41cbc01f92352f649)
[IBM API Connect 関連メモ - (8)z/OS Connect 連携におけるインターフェースの浄化](https://qiita.com/tomotagwork/private/0ec8d2224ad141756510)
[IBM API Connect 関連メモ - (9)z/OS Connect 連携まとめ](https://qiita.com/tomotagwork/private/a9fae53f02773a0c67b1)

# 事前調査
参考: [Secure Gateway 概説](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-getting-started-with-sg)

以下の図が全体像を理解するのに有用です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0bea4cc3-c0c8-c0c6-a7ed-b4b5caf021e0.png)

IBM Cloud上のアプリケーション(今回の場合API Connectを想定)と、オンプレ上のリソース(今回の場合REST APIでアクセスできるサービスを想定)をつなために、IBM Cloud上にSecure Gateway Serviceを立てて、オンプレ環境とのつなぎとなるサーバーにSecure Gateway Clientを立て、論理的な接続経路を構成することになります。

「IBM Cloud => オンプレ」、「IBM Cloud <= オンプレ」の両方向の通信がサポートされますが、今回のケースでは前者の構成をとることになります。

# バックエンド・サービス情報
オンプレ環境にバックエンドのサービスがあって、そのAPIをIBM Cloud上のAPI Connectで管理したいという前提です。
バックエンドのサービスの実装はなんでもよいのですが、ここでメインフレーム上のサービス(実体としてはCICSのアプリをz/OS Connect EEでREST APIで呼び出せるようにしたもの)を想定します。

このバックエンドのサービスを呼び出すためのエンドポイントは、"eplexa:30681"とします。
(例えば、オンプレ環境のネットワークからは、`http://eplexa:30681/showroomdemo/v1/isecics/stock/CITR`というようなURLでアクセスできるものとします。)
このエンドポイントはあくまでオンプレのネットワーク上でのみ有効なものであり、インターネット向けに外部に公開しているものではない、というのが前提です。

# Secure Gateway環境構築

## Secure Gateway Serviceの追加
参考:[ゲートウェイの追加](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-add-sg-gw)

IBM CloudのカタログからSecure Gateway を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/38dd2a6e-b967-4d3e-3caa-f432983a0376.png)

無料のEssentialsプランを選択して作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9c225a72-3d8e-b1c0-4396-0bb87ad3a749.png)

Cloud FoundryサービスにSecure Gatewayが作成されるのでこれをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b57b18bb-9933-57e4-d19d-8430c069f1a2.png)

ゲートウェイの追加ボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/eb0a1505-d07a-308f-ad77-b5c4276734b6.png)

名前を指定してゲートウェイの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2482c4a4-34cf-ba98-037c-f86df4bf2cab.png)

ゲートウェイが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0e930ac0-12ff-e6f0-c338-c7228e6f9aca.png)

ゲートウェイ名の右の設定アイコンをクリックし、編集をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b9c16ee7-0b5d-763f-f1c7-04f6e6c35152.png)

ここでセキュリティートークンと、有効期限が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b15fddc6-f711-2f21-9bfb-c7db9d19a21c.png)

## クライアントの追加
参考: [クライアントの追加](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-add-client)

上で作成したゲートウェイの管理画面から、クライアントの接続ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e83f5762-f628-cc78-b14a-b1645f9a15ac.png)

WindowsマシンをSecure Gateway Clientとするので、Windowsのインストーラーをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/26a4fea0-426f-6f93-6c67-396f5919b3cc.png)

ダウンロードしたインストーラーを実行します。
参考: [クライアントのインストール](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-client-install#installing-windows)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2b24e0d5-5b5f-c745-c665-980e1bfc185b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c66ab16a-be62-b24a-bee1-1afeace2ef45.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b94a1d16-a919-f18a-f929-60f313ef31b9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/db03e4bd-17a9-bf48-d78a-2526d3fbd18c.png)

ゲートウェイIDとセキュリティートークンを指定してNext
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/70023656-5579-bd80-1698-00f8b0f899d3.png)

<font color="red">※本当はここでACLファイルを作成してそのファイル名を指定する必要があったらしいのですが、最初不要かと思ってスルーしちゃってました。後述の「クライアントにACL設定追加」の節を参照のこと。</font>

そのままInstall
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/10a80387-8178-4af9-19bd-ebdfe1865919.png)

Windowsのサービスのウィンドウを開いて、IBM Cloude Secure Gateway Serviceが稼働していることを確認します。
また、サービスとして実行するのはよいですが、自動実行されるのは鬱陶しいので、手動実行に変えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f20cc3ce-d006-0e42-fd9c-70dc7449af51.png)

Windowsのサービスが実行中になっていることを確認後、IBM CloudのSecure Gateway Serviceの画面を見ると、以下のようなアイコンが表示されて、クライアントとの接続がされたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a3c66931-974a-4cef-13ce-5d8510fb50fc.png)

## 宛先の追加
参考: [宛先の追加](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-add-dest)

Secure Gateway Serviceの宛先タブから、+ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/63c90232-ccb4-c88a-7a16-7aa05ed9fb46.png)

リソースの場所はオンプレミスを指定して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/78a9c0ee-6d26-5900-dc71-eb753ef91626.png)

バックエンドのサービスのホスト名、ポート番号を指定して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1b69cc75-998b-a066-743c-5f6706a3d310.png)

Cloudアプリケーション(API Connect)とSecure Gateway Server間プロトコルはHTTPを選択して次へ
<font color="red">最初あまり考えずにHTTPにしてしまったが、後々APIConnect - z/OS Connect間をTLSとかで接続することを考えるとTCPでよい(後で修正)。</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3075eb1c-6f4c-4379-cf70-13bf6f5b2952.png)

Secure Gateway Client - バックエンドサービス間の認証はNoneを選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1dcba343-3376-57f3-1622-64e730911749.png)

IPテーブルで接続できるIPを絞ったりすることができるようですが、ここでは一旦そのまま次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/19d37e6b-363e-6e80-caf1-82ab52795a15.png)

名前を指定して追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cbd70d02-9158-3531-0425-9929bf542329.png)

宛先が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/55895bac-1e65-a880-ff58-9324f1f2bcf9.png)

作成された宛先の設定アイコンをクリックすると、クラウド側のホスト:ポートなどが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9a78aab6-363c-f80e-da30-726ced1d0199.png)

これで、ここに示されているホスト名:ポートにアクセスすると、宛先リソースにフォワードされるのかなと思ったのですが、リクエスト投げても繋がらない...

右上に赤い手のマークが出て、「ACLによりアクセスがブロックされています」と出てますが、これのせい？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8d8caa60-2e97-ac02-850e-cfc1aa445f27.png)

### 補足: Secure Gatewayの位置づけについて
参考: [Secure Gateway Service: FAQ](https://www.ibm.com/jp-ja/cloud/secure-gateway/faq)

>Secure Gateway Serviceは、OSIモデルの第4層にあたります。

上の記述にあるように、Secure GatewayはOSIモデルの第4層(トランスポート層)に相当します。TCP/UDPのレイヤーですね。つまり、SSHトンネリング等と同じような位置づけだと考えればよさそうです。
それなのに、上のプロトコルでTLSだとかHTTPだとかが選べるのでそれが何を意味するのか混乱したのですが、どうやら、クラウドアプリ - Secure Gateway Server 間、および、オンプレ上のSecure Gateway Client - バックエンドサーバー間をセキュアな構成にするっていうのができるっぽいです。
End to End (クラウドアプリ-バックエンドサーバー間)でセキュアな構成を考えて、Secure Gateway部分は単なる経路として扱うのであれば、とりあえずSecure Gatewayのレベルでのセキュリティは考えなくてもよいかと思います。

## クライアントにACL設定追加 その1 / NG編

クライアントの追加のステップで、スルーしてしまっていたACLの設定を追加してみます。

参考: [対話式クライアント・セッションの開始](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-client-install#windows-run)

クライアントには、`<InstDir>\ibm\securegateway\client\secgw.cmd`を実行して起動されるツールがあるようなので使ってみます。こいつを実行すると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cb49a38f-19ec-eeee-624c-ae2cdaa1ce12.png)

なんかローカルでWebアプリ的なものが動いてブラウザが起動してきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1ddae320-05b7-8745-218d-856866589508.png)

ログを見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9cd8cb5e-adc3-cc56-7ac9-d84bbb7d0958.png)
やっぱりACLではじかれてたっぽい。

アクセス制御リストを選択してみます。
ここの"アクセスを許可"の欄に、バックエンドサービスのホスト名:ポートを追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/29e78c1f-6ab5-7b2f-14cc-9ad481066ef5.png)

反映の仕方がよく分からないので、Windowsのサービスを再起動してみました。
が、その後も状況は変わらず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d2fca490-cd89-d6be-74d9-095aa6a7ac71.png)

イマイチ反映方法が分からなかったのであきらめました。

## クライアントにACL設定追加 その2 / OK編

上のやり方がNGだったので、別の方法を試します。
`<InstDir>\ibm\securegateway\client\SampleACLFile.txt`というのが提供されていたので、これをACLFile.txtという名前でコピーして、以下のように編集します。

```txt:ACLFile.txt
acl allow eplexa:30681
```

で構成ファイルが同ディレクトリのsecuregw_service.configに保持されているようなので、こいつを編集して上のACLFile.txtをACL_FILE=に指定します。

```txt:securegw_service.config
#Config file for Secure Gateway Client, to start as a Windows Service.
#PLEASE AVOID ANY RESIDUAL WHITE SPACES

#Enter the gateway ids separated by single spaces
GATEWAY_ID=xxxxx

#Enter the security tokens separated by --
SECTOKEN=xxxxxx

#Enter the ACL files separated by --
ACL_FILE=ACLFile.txt

# Enter the proxy info if you want to start the client with the proxy
PROXY=

#Enter the log levels separated by --
LOGLEVEL=INFO

#Enter if you want to use client UI (Y/N)
USE_UI=

#Enter the port for client UI
PORT=9003

#Enter the password for client UI
PWD=

#Enter the language for command line interface; acceptable values are en, de, es, fr, it, ja, ko, pt-BR, zh, zh-TW
LANGUAGE=ja

#Enter the startup options separated by single spaces, no "" is needed
#Accepted values are mentioned in this document
#https://cloud.ibm.com/docs/services/SecureGateway?topic=securegateway-client-interacting#startup-args
SECGW_ARGS=
```

これでSecure Gateway ClientのWindowsサービスを再起動してみます。

赤い手のアイコンが消えた！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0d04b3d9-0fba-39c3-9e78-34e7a0a3d343.png)

Secure Gatewayのクラウド側のホスト:ポートにアクセスしてみると、意図した通り、バックエンドサービスが呼び出せるようになりました！

# API Connect からSecure Gateway経由でのバックエンド・サービス連携

さて、これでIBM Cloud上のAPI Connectから、Secure Gateway経由でオンプレ上のサービスにアクセスするパスは作れました。
いよいよ、バックエンドサービスのAPIをAPI Connectで管理できるようにしてみましょう。

目指す環境の全体像としてはこんなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/69ee77a1-1732-87fd-cd09-0bd3d5d40a45.png)


## バックエンドアクセス情報の整理

一旦、管理対象とするバックエンドサービスのAPIについて整理しておきます。
z/OS Connectは公開したAPI仕様をSwagger文書として生成してくれるので、これをAPI Connectに取り込めばよさそうです。
また、サービスのエンドポイントとしては実際にはeplexa:30681ですが、API Connectから見るとSecure Gatewayを介してのアクセスになりますので、Secure Gatewayが新たに生成したエンドポイントを使用することになります。

今回取り込むSwagger文書はこちらです。

```json:CICSSwagger.json
{
  "swagger" : "2.0",
  "info" : {
    "description" : "",
    "version" : "1.0.0",
    "title" : "cicsstockrestfulservice"
  },
  "host" : "localhost:8080",
  "basePath" : "/showroomdemo/v1/isecics",
  "schemes" : [ "https", "http" ],
  "consumes" : [ "application/json" ],
  "produces" : [ "application/json" ],
  "paths" : {
    "/order" : {
      "post" : {
        "tags" : [ "cicsstockrestfulservice" ],
        "operationId" : "postCICSStockOrderService",
        "parameters" : [ {
          "in" : "body",
          "name" : "postCICSStockOrderService_request",
          "description" : "request body",
          "required" : true,
          "schema" : {
            "$ref" : "#/definitions/postCICSStockOrderService_request"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request",
            "schema" : {
              "$ref" : "#/definitions/postCICSStockOrderService_response_400"
            }
          },
          "200" : {
            "description" : "OK",
            "schema" : {
              "$ref" : "#/definitions/postCICSStockOrderService_response_200"
            }
          }
        }
      }
    },
    "/stock/{groupCode}" : {
      "get" : {
        "tags" : [ "cicsstockrestfulservice" ],
        "operationId" : "getCICSStockCheckService",
        "parameters" : [ {
          "name" : "groupCode",
          "in" : "path",
          "required" : true,
          "type" : "string",
          "maxLength" : 4
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request",
            "schema" : {
              "$ref" : "#/definitions/getCICSStockCheckService_response_400"
            }
          },
          "200" : {
            "description" : "OK",
            "schema" : {
              "$ref" : "#/definitions/getCICSStockCheckService_response_200"
            }
          }
        }
      }
    }
  },
  "definitions" : {
    "getCICSStockCheckService_response_400" : {
      "type" : "object",
      "properties" : {
        "stockCheck" : {
          "type" : "object",
          "properties" : {
            "returnCode" : {
              "type" : "integer",
              "minimum" : 0,
              "maximum" : 99
            },
            "responseMessage" : {
              "type" : "string",
              "maxLength" : 80
            }
          }
        }
      }
    },
    "getCICSStockCheckService_response_200" : {
      "type" : "object",
      "properties" : {
        "stockCheck" : {
          "type" : "object",
          "properties" : {
            "returnCode" : {
              "type" : "integer",
              "minimum" : 0,
              "maximum" : 99
            },
            "responseMessage" : {
              "type" : "string",
              "maxLength" : 80
            },
            "itemList" : {
              "type" : "array",
              "items" : {
                "type" : "object",
                "properties" : {
                  "itemId" : {
                    "type" : "string",
                    "maxLength" : 8
                  },
                  "itemName" : {
                    "type" : "string",
                    "maxLength" : 66
                  },
                  "itemPrice" : {
                    "type" : "integer",
                    "minimum" : 0,
                    "maximum" : 9999999
                  },
                  "stored" : {
                    "type" : "string",
                    "maxLength" : 1
                  },
                  "shipFrom" : {
                    "type" : "string",
                    "maxLength" : 64
                  }
                }
              },
              "maxItems" : 6,
              "minItems" : 6
            }
          }
        }
      }
    },
    "postCICSStockOrderService_request" : {
      "type" : "object",
      "properties" : {
        "stockOrder" : {
          "type" : "object",
          "properties" : {
            "orderList" : {
              "type" : "array",
              "items" : {
                "type" : "object",
                "properties" : {
                  "itemId" : {
                    "type" : "string",
                    "maxLength" : 8
                  },
                  "itemQuantity" : {
                    "type" : "integer",
                    "minimum" : 0,
                    "maximum" : 9999999
                  }
                }
              },
              "maxItems" : 6,
              "minItems" : 6
            }
          }
        }
      }
    },
    "postCICSStockOrderService_response_400" : {
      "type" : "object",
      "properties" : {
        "stockOrder" : {
          "type" : "object",
          "properties" : {
            "returnCode" : {
              "type" : "integer",
              "minimum" : 0,
              "maximum" : 99
            },
            "responseMessage" : {
              "type" : "string",
              "maxLength" : 80
            }
          }
        }
      }
    },
    "postCICSStockOrderService_response_200" : {
      "type" : "object",
      "properties" : {
        "stockOrder" : {
          "type" : "object",
          "properties" : {
            "returnCode" : {
              "type" : "integer",
              "minimum" : 0,
              "maximum" : 99
            },
            "responseMessage" : {
              "type" : "string",
              "maxLength" : 80
            },
            "stockOfItemList" : {
              "type" : "array",
              "items" : {
                "type" : "object",
                "properties" : {
                  "itemId" : {
                    "type" : "string",
                    "maxLength" : 8
                  },
                  "stockYN" : {
                    "type" : "string",
                    "maxLength" : 1
                  },
                  "stockNum" : {
                    "type" : "integer",
                    "minimum" : 0,
                    "maximum" : 9999999
                  }
                }
              },
              "maxItems" : 6,
              "minItems" : 6
            }
          }
        }
      }
    }
  }
}
```

商品の在庫確認(参照系)とオーダー(更新系)の2種類のオペレーションがあります。

参照系のURL: `GET http://eplexa:30681/showroomdemo/v1/isecics/stock/{groupCode}`
更新系のURL: `POST http://eplexa:30681/showroomdemo/v1/isecics/order`

curlでの実行例

```xxx:参照系
curl -X GET --header 'Accept: application/json' 'http://eplexa:30681/showroomdemo/v1/isecics/stock/CITR'`
```

```xxx:更新系
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"stockOrder":{"orderList":[{"itemId":"CIWH0001","itemQuantity":1},{"itemId":"CIWH0002","itemQuantity":2}]}}' 'http://eplexa:30681/showroomdemo/v1/isecics/order'
```


## API ConnectへSwagger文書の取り込み
ドラフト - API - 追加ボタン - ファイルまたはURLからAPIをインポートを選択して、上のSwaggerファイルを指定してインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5dfb6d7b-e866-1348-8af0-439b5a26c7a9.png)

"cicsstockrestfulservice 1.0.0"というAPIが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a7673b74-6825-cb67-c463-efc4adae3f4d.png)

## アセンブリーの作成
アセンブルタブで、アセンブリーの作成ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b4c49129-2e7e-fb2a-1745-0c8ef199e5cd.png)

操作切り替えをドラッグ&ドロップし、ケース0,1にそれぞれgetCICSStockCheckService, postCICSStockOrderServiceを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/565edcaa-e674-28ca-26dd-c37e4d030d74.png)

呼び出しをそれぞれ割り当て、タイトル、URL、メソッドを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d42fdb2c-8a8d-3a12-9f4e-74b8f6c18b9c.png)

それぞれ以下のように指定します。(URLはSecure Gatewayのホスト名:ポートを指定)

|項目 |StockCheck | StockOrder|
|----|------------|-----------|
|タイトル|invoke-stockCheck|invoke-stockOrder|
|URL|http://xxxx.securegateway.appdomain.cloud:nnnnn/showroomdemo/v1/isecics/stock/$(request.parameters.groupCode)|http://xxxx.securegateway.appdomain.cloud:nnnnn/showroomdemo/v1/isecics/order|
|HTTPメソッド|GET|POST|

最後に保存。

## スキームの確認

取り込んだSwagger文書ではhttp,https両方有効になっていますが、API Connectではhttpは受け付けないようです。そのままの設定でAPIを公開しようとすると以下のように怒られることになるので、スキームの設定を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/39bb13bd-b501-1b41-87ea-601f102ce99a.png)

設計からスキームを選択し、httpのチェックをはずしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/09681362-fc13-0235-631a-e19f794c4e1f.png)

## セキュリティー設定
以前実施した以下の手順に従って、APIキーを設定しておきます。
参考: [セキュリティーの定義](https://qiita.com/tomotagwork/private/94758ee13ef80dd3984b#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%BC%E3%81%AE%E5%AE%9A%E7%BE%A9)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/682b8311-65ed-eaf7-1129-cd31ba2ead6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6b2e27e5-42a2-08fe-0d69-cc159ae72571.png)

## 製品の作成/公開
右上のメニューからデフォルト製品の生成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2baf06dc-1576-176c-ebc8-476ac9f52d77.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9d4fcd6a-b37d-3706-d7d3-cbd1b5dbd619.png)

製品の生成、公開までうまくいったようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2044f2ee-b4e8-f0c3-3493-62a9c020037e.png)

一応ダッシュボード - カタログ"Sandbox"を選択して製品のステータス見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b1add999-80a1-5a6b-9c2b-917a6da31c9e.png)

公開済みになってます。

## アセンブルからテスト

API呼び出しのテストしてみる。=> OKでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f9f189d5-d70e-3a2e-4527-423b83b89d22.png)


## 開発者ユーザーによるテスト
開発ユーザーでSandboxの開発者ポータルにログインし、API製品からcicsstockrestfulservice product 1.0.0を選択
サブスクライブ(配信登録)します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1ff619c7-25e9-50b3-513e-129b6c3a5109.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/019d8740-0d45-3a2f-794a-50c90ba840b6.png)

cicsstockrestfulserviceから、API呼び出しを試してみます。
クライアントID、シークレットは、この開発ユーザーがアプリケーションを作成した時に生成されたものを使用します。
参考: [開発者ポータルでのアプリケーション作成](https://qiita.com/tomotagwork/private/94758ee13ef80dd3984b#%E9%96%8B%E7%99%BA%E8%80%85%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB%E3%81%A7%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E4%BD%9C%E6%88%90)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/59133542-1cba-fece-e28d-5336433c7191.png)

操作の呼び出しをクリックして、正常応答が返ればOKです。
(汎用的なREST Clientからもリクエスト投げられるはず)


これで一通り、API Connect - Secure Gateway 経由でバックエンドのサービスを呼び出すところまで確認できました！