はじめに
企業データを扱うような API は多くの場合、下図のように閉域網で稼働し、外部から直接アクセスができません。きちんとアクセス許可された API Consumer アプリのみが正しいルートでアクセスできるよう API Gateway で制御されます。
そこで本記事では、このように API Gateway を通じて Private API を管理するってどのようなものか、下記のような構成で先日試してみましたので、この作業手順を記録いたします。
ここでは下図のように MuleSoft Flex Gateway を API Gateway に、Heroku Private Space を閉域網の例として利用しました。
今回は DB へ繋ぐことが目的ではなく、Private API の管理となるため、対象の API は単独で動けるようシンプルにメモリに展開されたデータと入出力させます。
MuleSoft Flex Gateway とは
MuleSoft は API Gateway、API、EDA 等の開発・管理機能を具備した Anypoint Platform という製品を提供するベンダです。(本稿執筆時点では Salesforce の1ブランドとして活動)
今回 API Gateway として利用する Flex Gateway はこの Anypoint Platform に搭載されたコンテナや Ingress Controller 等で稼働する軽量の API Gateway です。
Flex Gateway の管理下に置くことで上図のように GUI ベースのコンソールを使って管理・監視できるようになります。
また、利用者観点では、Human Friendly な Portal 上で API 情報の参照やアクセスキー管理できるようになります。
手順
今回のざっくりとした作業手順は下記となります。
- 顧客 API の挙動を確認
- 顧客 API を Heroku へデプロイ
- Flex Gateway の構成を Anypoint Platform に作成
- Flex Gateway を Heroku 上に deploy
- 顧客 API をカタログ登録
- 顧客 API を Flex GW の管理下へ配備
- 挙動の確認
事前準備
本記事では Heroku Private Space を使って閉域網を構築しますが、これは Enterprise 版に含まれる有償機能となります。Private Space を構築せずとも閉域網に配備したと見立てて別環境で記事中の作業を流していただきコンセプトをご確認いただくのもアリかとは思います。
いったん、下記に本記事で紹介する手順に際した事前準備作業をリストします。
- MuleSoft Anypoint Platform アカウントのセットアップ(Trial Account も可) - こちらのQiita 記事も参考にしてください。
- Heroku アカウントのセットアップ
- Heroku Private Space の構成
- Docker を自端末へ install
- Python を自端末へ install
- GitHub Account のセットアップ
顧客 API の挙動を確認
今回は下図のように顧客レコードへの CRUD を処理する5つのメソッドを持ったサンプル API を Private API として利用します。本来であれば RDB や CRM などで管理された顧客データの入出力処理を実装すべきではありますが、高機能な API を実装することが目的ではないので簡便化のためデータソースのセットアップは行わずメモリに展開されたサンプルデータを利用します。
サンプル API は Python + FastAPI で実装されています。
サンプル API を自端末へダウンロード
サンプル API が公開された GitHub レポジトリへアクセスします。
https://github.com/Yoshihiro-Mitsutomi-MuleSoft/ym-simple-fastapi-sample/tree/main
Code ボタンを押下し、ドロップダウンを表示させます。
Download ZIP ボタンを押下してソースをダウンロードします。
サンプル API の実行
ダウンロードした Zip ファイルを解凍します。
解凍されたフォルダへ Terminal もしくは Command Prompt にて cd します。
下記コマンドを実行して API を起動します。
python main.py
上図のように起動されましたら、
http://localhost:8080/api/v1/docs
へ移動し、内包された client console を開きます。
幾つかメソッドを実行し、挙動を確認します。
挙動が確認できましたら Terminal / Command Prompt へ戻り、Ctrl + C でアプリを停止します。
顧客 API を Heroku へデプロイ
ステップで挙動を確認した API をご自身の GitHub レポジトリへコピーした上で、GitHub 経由で API を Heroku へデプロイします。
補足:
Heroku や GitHub の操作は幾つかやり方ががあります。本記事で手順化しているのはあくまでもほんの一例となります。既に Heroku や GitHub に慣れており、例えば Heroku CLI を使うなど他の方式で普段作業されている方は、ご自身のやりやすい方式で代替いただいても問題ありません。
ご自身の GitHub Repository へ API のリソースを push
まずは本 API を格納する GitHub Repository を用意します。
https://github.com/ へ移動し、ログインします。
New ボタンを押下します。
任意の名前を指定し、Private の GitHub Repository を作成します。
作成したレポジトリへ API リソースを格納します。
任意の新規ディレクトリを作成し、そこへ前章で解凍した zip ファイルの中のファイル群をコピーします。
Terminal / Command Prompt で上記ディレクトリへ cd します。
下記コマンドを実行し、リポジトリへリソースを push します。
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin <ご自身の repository URL>
git push -u origin main
Web Console にて正しく push されていることを確認します。
GitHub レポジトリリソースを Heroku へデプロイ
Heroku へログインします。
https://id.heroku.com/login
New ボタンをクリックし、ドロップダウンから Create new app を選択します。
App name 欄は任意の名前を、Choose a region or a Private Space では Private Space を選択します。
ここでは Make this app internal to this Private Space のチェックボックスを有効化し、外部からのアクセスを遮断します。
続いて Create app ボタンを押下します。
Deploy タブにおける Deployment method 欄にて GitHub を選択します。
Connect to GitHub 欄に上で作成した GitHub Repository を指定し、Connect します。
Manual deploy 欄にて Deploy Branch ボタンを押下して Deploy 処理をキックします。
Your app was successfully deployed のメッセージが出力された正常にデプロイできたことを確認します。
画面上部の Open app(internal) ボタンを押下し、指定されたアドレスへアクセスできないことを確認します。Host 名に /api/v1/customers
を付加して GET /customers へアクセスしようにも同様であることを確認します。
本 API は外部からのアクセスが許可されていないため、Private Space の外からはテスト結果のようにアクセスできません。
同じ Private Space 内からであれば private 通信できます。
そこで、次章以降で Flex Gateway を同 Private Space へ配備し、外からアクセスする gateway を構築します。
Flex Gateway の構成を Anypoint Platform に作成
Flex Gateway の構成情報を Anypoint Platform 上に作成
Anypoint Platform のコンソールにログインします。
https://anypoint.mulesoft.com/
左ペインにて Flex Gateways をクリックします。
Container > Docker を選択します。
Anypoint Platform と 通信するための構成ファイルを生成
上図の手順に従い、Flex Gateway のコンテナイメージをダウンロードします。
任意のディレクトリ上で下記コマンドを実行します。
docker pull mulesoft/flex-gateway
続いて Anypoint Platform 上で表示される手順② Register your gateway に書かれたコマンドを実行します。
gateway-name
の部分は任意の名前に変更してください。
docker run --entrypoint flexctl -u $UID \
-v "$(pwd)":/registration mulesoft/flex-gateway \
registration create --organization=<ご自身の ID> \
--token=<ご自身の Token> \
--output-directory=/registration \
--connected=true \
<gateway-name>
実行したディレクトリ上に registration.yaml が生成されたことを確認します。
補足:
registration.yaml は Flex Gateway と Anypoint Platform の間の通信確立処理を Flex Gateway 側からキックさせるために必要な構成ファイルとなります。本ファイルを Flex Gateway に渡すことで、Flex Gateway が Anypoint Platform への接続要求を開始します。確立後はモニタリング情報や API の制御情報等がやりとりされ、Anypoint Platform の GUI コンソールにて API Gateway の管理や監視が行えるようになります。
Flex Gateway を Heroku 上に deploy
Heroku の Private Space 上に Flex Gateway をデプロイ
heroku-reference-apps 中の Flex Gateway イメージレポジトリへアクセスします。
https://github.com/heroku-reference-apps/heroku-docker-flex-gateway
App name 欄は任意の名前を、Choose a region or a Private Space では Private Space を選択します。
また、ここでは Make this app internal to this Private Space のチェックボックスは入れずに下へスクロールします。
前章で生成した registration.yaml をテキストエディタで開きコンテンツをコピーします。
コピーした内容を FLEX_CONFIG 欄にペーストします。
他の設定項目はデフォルトのまま、Deploy app ボタンを押下します。
Your app was successfully deployed のメッセージが出力されることを確認します。
Heroku 上に Deploy した Flex Gateway が Anypoint Platform と正しく通信していることを確認
Anypoint Platform のコンソールに戻ります。
Anypoint Platform のコンソールにて ← Flex Gateways をクリックします。
Deploy した Flex Gateway のステータスが Connected になっていることを確認します。
顧客 API をカタログ登録
Flex Gateway で処理するアクセス管理は Anypoint Platform が提供する Developer Portal 機能 Anypoint Exchange と連動が可能です。
連動させることで Developer Portal 上で公開される該当の API のページ上でアクセス申請等を行えるようになります。
本章では、Developer Portal へ Heroku に deploy した API の情報を登録します。
FastAPI は実装された API から OpenAPI Spec 形式の API 仕様を自動生成します。
この API 仕様を使ってカタログ化を行います。
ローカルにダウンロードした顧客 API のディレクトリへ移動します。
python main.py
を実行して API を起動します。
http://localhost:8080/api/v1/docs
へ移動します。
Console 左上に /api/v1/openapi.json へのリンクが生成されていますので、これを右クリックからローカルダウンロードします。
Terminal / Command Prompt へ戻り、Ctrl + C でアプリを停止します。
Anypoint Platform の管理コンソールに戻ります。
左上のハンバーガーメニューから Exchange を選択します。
下記のような設定をした上で Publish ボタンを押下します。
設定欄 | 設定値 |
---|---|
Name | 任意の API 名を指定 |
Asset types | REST API |
Method | Upload an OAS |
File upload | 先程ダウンロードした openapi.json |
Lifecycle state | stable |
Publish 処理が進み、API 仕様をベースに Human Friendly な形式でドキュメント化されていることを確認します。
顧客 API を Flex GW の管理下へ配備
本章では Heroku へ配備した Flex Gateway に顧客 API へのルートを作成します。
Anypoint Platform の管理コンソールに戻ります。
ハンバーガーメニューから API Manager を選択します。
Add API ボタンを押下し、Add new API を選択します。
Select runtime 欄で Flex Gateway を選択します。
Select gateway では Heroku へ deploy した Flex Gateway を選択します。
Next ボタンを押下します。
Select the API you want to manage 欄では Select API from Exchange を選択します。
前章でカタログ登録した API を選択します。
イメージ:
他の選択肢は default 設定のまま Next ボタンを押下します。
Protocol 及び Port 欄はデフォルトをキープします。
Base path 欄は /privatecust
とします。
Instance label 欄は flex-sandbox
とします。
Next ボタンを押下します。
Upstream URL 欄に Heroku へデプロイした API の URL を指定します。
ここではホスト URL + /api/v1 を指定します。
Next ボタンを押下します。
補足:
ここで指定した URL は外部公開されていないため、先のテストではアクセスに失敗しました。しかし、今回は同じ Private Space 内にある Flex Gateway からのアクセスになるため、Private 通信が可能となりアクセスルートが確立されます。
構成内容を確認の上、Save & Deploy ボタンを押下します。
API Status 欄が Active になっていることを確認します。
挙動の確認
前章では、外部アクセスが許可されていない API へのルートを Flex Gateway に構成しました。
本章では、下記の要領で Flex Gateway の挙動を確認します。
- Private API(顧客 API) へのルートが正しく構築されていることの確認
- API Policy を適用しアクセス管理ができることの確認
Private API(顧客 API) へのルートが正しく構築されていることの確認
Heroku の管理コンソールへ移動し、Flex Gateway のページを開きます。
Open app ボタンを押下します。
Flex Gateway の URL がブラウザの新しい tab で開かれます。
/privatecust/customers
を URL に append します。
Private API へ Flex Gateway 経由で正しくアクセスできることを確認します。
API Policy を適用しアクセス管理ができることの確認
ここまで、API のルーティングが正しく機能することを確認してきました。
ただ、現時点では特にアクセスポリシーが加えられていないため、誰でもアクセス可能な状態になっています。
そこで、下図のようにアクセス認証が通った API Consumer のみがアクセス許可されるようポリシーを加えます。
また、バックエンドやリソースの過剰使用を保護するべく API Consumer のタイプ別に流量制限を設けてみます。
Anypoint Platform の管理コンソールに戻ります。
API Manager を開きます。
前章で登録した API を開きます。
SLA Tiers をクリックします。
下記の要領で SLA Tier を設定し、Add ボタンを押下します。
設定欄 | 設定値 |
---|---|
Name | trial |
Approval | Automatic |
# of Reqs | 1 |
Time Period | 1 |
Time Unit | Minute |
再度 Add SLA Tier ボタンを押下します。
下記の要領で SLA Tier を加えます。
設定欄 | 設定値 |
---|---|
Name | enterprise |
Approval | Manual |
# of Reqs | 1 |
Time Period | 1 |
Time Unit | Millisecond |
1 分に 1 回のアクセスが許可された trial tier、並びに 1 ミリ秒に1回のアクセスが許可された enterprise tier を準備いたしました。
Rate Limiting - SLA Based を選択し、Next ボタンを押下します。
The policy was created successfully のポップアップが表示されることを確認します。
しばらく時間を置いて、先程アクセスできた Flex Gateway 経由の Private API への URL にアクセスしてみます。
認証ができず、アクセスに失敗することを確認します。
Anypoint Platform のコンソール画面に戻ります。
Exchange をハンバーガーメニューから選択します。
先にカタログ登録した API のページを開きます。
API Gateway とドッキングしたため、Request Access ボタンが追加されたことが確認できます。
この Request Access ボタンを押下します。
API Instance 欄では API Manager に構成した flex-sandbox を選択します。
Application 欄にて Create a new application をクリックします。
Application Name 欄に任意の Application 名(API Consumer アプリ名)を指定して、Create ボタンを押下します。
SLA tier 欄にて trial を選択の上、Request access ボタンを押下します。
アクセスが承認されたことが確認できます。
この画面に出力される Client ID と Client Secret を控えておきます。
補足: trial tier は Approval Process を Automatic としました。そのため、API Provider が許可せずとも self service 形式でリクエストがハンドルされます。一方、Approval Process を manual とした enterprise tier を選択した場合は、API Provider が API Manager にて許可しない限りアクセスは許可されません。
認証情報は HTTP Header に指定する必要があるため、curl コマンド、もしくは Postman などの API Client を利用してテストします。
HTTP Header に下記を加えて、再度 API Call を行います。
- client_id – 上で控えた Cliend ID
- client_secret — 上で控えた Client Secret
curl で実行する場合:
curl --location '<ご自身の URL>' \
--header 'client_id: <ご自身の Client ID>' \
--header 'client_secret: <ご自身の Client Secret>'
1分以内に再度アクセス試行しますと、下図のように HTTP Staus 429 Too Many Requests で弾かれます。
Trial tier のため、1分に1回のみのアクセスが許容されており、そのポリシーが正しく機能していることが確認できました。
さいごに
本記事では外部からのアクセスが遮断された Private API への Gateway を構築するようすを確認いたしました。また、この Gateway にアクセス管理関連のポリシーを適用し、意図された API Consumer から意図された流量で利用される仕組みを実装できることも確認しました。
これって別に MuleSoft Flex Gateway に限らず他製品でもできることだとは思いますが、稼働環境問わず稼働する軽量且つ高度な API Gateway を直感的な操作で構築できるのはポイントだと感じました。