5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MuleSoft Flex Gateway で Heroku Private Space 中の API を管理してみる

Last updated at Posted at 2024-10-25

はじめに

企業データを扱うような API は多くの場合、下図のように閉域網で稼働し、外部から直接アクセスができません。きちんとアクセス許可された API Consumer アプリのみが正しいルートでアクセスできるよう API Gateway で制御されます。
スクリーンショット 2024-10-22 18.34.09.png

そこで本記事では、このように API Gateway を通じて Private API を管理するってどのようなものか、下記のような構成で先日試してみましたので、この作業手順を記録いたします。
ここでは下図のように MuleSoft Flex Gateway を API Gateway に、Heroku Private Space を閉域網の例として利用しました。
今回は DB へ繋ぐことが目的ではなく、Private API の管理となるため、対象の API は単独で動けるようシンプルにメモリに展開されたデータと入出力させます。
スクリーンショット 2024-10-27 21.48.20.png

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 情報の参照やアクセスキー管理できるようになります。

手順

今回のざっくりとした作業手順は下記となります。

  1. 顧客 API の挙動を確認
  2. 顧客 API を Heroku へデプロイ
  3. Flex Gateway の構成を Anypoint Platform に作成
  4. Flex Gateway を Heroku 上に deploy
  5. 顧客 API をカタログ登録
  6. 顧客 API を Flex GW の管理下へ配備
  7. 挙動の確認

事前準備

本記事では Heroku Private Space を使って閉域網を構築しますが、これは Enterprise 版に含まれる有償機能となります。Private Space を構築せずとも閉域網に配備したと見立てて別環境で記事中の作業を流していただきコンセプトをご確認いただくのもアリかとは思います。

いったん、下記に本記事で紹介する手順に際した事前準備作業をリストします。

顧客 API の挙動を確認

今回は下図のように顧客レコードへの CRUD を処理する5つのメソッドを持ったサンプル API を Private API として利用します。本来であれば RDB や CRM などで管理された顧客データの入出力処理を実装すべきではありますが、高機能な API を実装することが目的ではないので簡便化のためデータソースのセットアップは行わずメモリに展開されたサンプルデータを利用します。
サンプル API は Python + FastAPI で実装されています。

スクリーンショット 2024-10-23 14.32.37.png

サンプル API を自端末へダウンロード

サンプル API が公開された GitHub レポジトリへアクセスします。
https://github.com/Yoshihiro-Mitsutomi-MuleSoft/ym-simple-fastapi-sample/tree/main

Code ボタンを押下し、ドロップダウンを表示させます。
Download ZIP ボタンを押下してソースをダウンロードします。

スクリーンショット 2024-10-23 14.37.05.png

サンプル API の実行

ダウンロードした Zip ファイルを解凍します。
解凍されたフォルダへ Terminal もしくは Command Prompt にて cd します。

下記コマンドを実行して API を起動します。

python main.py

正常に起動された場合のイメージ:
スクリーンショット 2024-10-23 14.45.18.png

上図のように起動されましたら、
http://localhost:8080/api/v1/docs
へ移動し、内包された client console を開きます。

イメージ:
スクリーンショット 2024-10-23 14.47.37.png

幾つかメソッドを実行し、挙動を確認します。

GET /customers の実行イメージ:
スクリーンショット 2024-10-23 14.50.34.png

挙動が確認できましたら 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 ボタンを押下します。
スクリーンショット 2024-10-23 15.09.28.png

任意の名前を指定し、Private の GitHub Repository を作成します。

作成後のイメージ:
スクリーンショット 2024-10-23 15.40.54.png

作成したレポジトリへ 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 ボタンを押下します。
スクリーンショット_2024-10-23_16_04_47.png

Deploy タブにおける Deployment method 欄にて GitHub を選択します。
Connect to GitHub 欄に上で作成した GitHub Repository を指定し、Connect します。
スクリーンショット 2024-10-23 16.12.24.png

Manual deploy 欄にて Deploy Branch ボタンを押下して Deploy 処理をキックします。
スクリーンショット 2024-10-23 16.12.49.png

Your app was successfully deployed のメッセージが出力された正常にデプロイできたことを確認します。
スクリーンショット 2024-10-23 16.14.44.png

画面上部の Open app(internal) ボタンを押下し、指定されたアドレスへアクセスできないことを確認します。Host 名に /api/v1/customers を付加して GET /customers へアクセスしようにも同様であることを確認します。
スクリーンショット 2024-10-23 16.17.54.png

本 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/

画面左上のハンバーガーメニューをクリックします。
スクリーンショット 2024-10-23 17.09.44.png

Runtime Manager を選択します。
スクリーンショット 2024-10-23 17.09.19.png

左ペインにて Flex Gateways をクリックします。
スクリーンショット 2024-10-23 17.12.59.png

Add Gateway ボタンをクリックします。
スクリーンショット 2024-10-23 17.14.00.png

Container > Docker を選択します。

Anypoint Platform と 通信するための構成ファイルを生成

スクリーンショット_2024-10-23_17_16_10.png

上図の手順に従い、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 が生成されたことを確認します。
スクリーンショット 2024-10-23 17.34.35.png

補足:
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

Deploy to Heroku ボタンを押下します。
スクリーンショット 2024-10-23 17.39.13.png

App name 欄は任意の名前を、Choose a region or a Private Space では Private Space を選択します。
また、ここでは Make this app internal to this Private Space のチェックボックスは入れずに下へスクロールします。
スクリーンショット_2024-10-23_17_41_40.png

前章で生成した registration.yaml をテキストエディタで開きコンテンツをコピーします。
コピーした内容を FLEX_CONFIG 欄にペーストします。

イメージ:
スクリーンショット_2024-10-23_17_46_13.png

他の設定項目はデフォルトのまま、Deploy app ボタンを押下します。

Your app was successfully deployed のメッセージが出力されることを確認します。スクリーンショット 2024-10-23 17.50.37.png

Heroku 上に Deploy した Flex Gateway が Anypoint Platform と正しく通信していることを確認

Anypoint Platform のコンソールに戻ります。
Anypoint Platform のコンソールにて ← Flex Gateways をクリックします。
スクリーンショット 2024-10-23 17.52.44.png

Deploy した Flex Gateway のステータスが Connected になっていることを確認します。
スクリーンショット_2024-10-23_17_54_12.png

顧客 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 へのリンクが生成されていますので、これを右クリックからローカルダウンロードします。

イメージ(Google Chrome を使った場合の例):
スクリーンショット 2024-10-24 15.04.59.png

Terminal / Command Prompt へ戻り、Ctrl + C でアプリを停止します。

Anypoint Platform の管理コンソールに戻ります。
左上のハンバーガーメニューから Exchange を選択します。
スクリーンショット 2024-10-24 15.17.26.png

Publish new asset ボタンを押下します。
スクリーンショット 2024-10-24 15.22.14.png

下記のような設定をした上で Publish ボタンを押下します。

設定欄 設定値
Name 任意の API 名を指定
Asset types REST API
Method Upload an OAS
File upload 先程ダウンロードした openapi.json
Lifecycle state stable

イメージ:
スクリーンショット 2024-10-24 15.27.21.png

Publish 処理が進み、API 仕様をベースに Human Friendly な形式でドキュメント化されていることを確認します。

イメージ:
スクリーンショット 2024-10-24 15.29.40.png

顧客 API を Flex GW の管理下へ配備

本章では Heroku へ配備した Flex Gateway に顧客 API へのルートを作成します。

Anypoint Platform の管理コンソールに戻ります。
ハンバーガーメニューから API Manager を選択します。
スクリーンショット 2024-10-24 15.36.12.png

Add API ボタンを押下し、Add new API を選択します。
スクリーンショット 2024-10-24 15.38.18.png

Select runtime 欄で Flex Gateway を選択します。
Select gateway では Heroku へ deploy した Flex Gateway を選択します。
Next ボタンを押下します。
スクリーンショット 2024-10-24 16.35.53.png

Select the API you want to manage 欄では Select API from Exchange を選択します。
前章でカタログ登録した API を選択します。
イメージ:
スクリーンショット 2024-10-24 16.55.52.png

他の選択肢は default 設定のまま Next ボタンを押下します。
スクリーンショット 2024-10-24 16.57.25.png

Protocol 及び Port 欄はデフォルトをキープします。
Base path 欄は /privatecust とします。
Instance label 欄は flex-sandbox とします。
Next ボタンを押下します。
スクリーンショット 2024-10-24 17.03.01.png

Upstream URL 欄に Heroku へデプロイした API の URL を指定します。
ここではホスト URL + /api/v1 を指定します。
Next ボタンを押下します。
スクリーンショット 2024-10-24 17.06.46.png

補足:
ここで指定した URL は外部公開されていないため、先のテストではアクセスに失敗しました。しかし、今回は同じ Private Space 内にある Flex Gateway からのアクセスになるため、Private 通信が可能となりアクセスルートが確立されます。

構成内容を確認の上、Save & Deploy ボタンを押下します。
スクリーンショット 2024-10-24 17.12.11.png

API Status 欄が Active になっていることを確認します。
スクリーンショット 2024-10-24 17.16.22.png

挙動の確認

前章では、外部アクセスが許可されていない API へのルートを Flex Gateway に構成しました。
本章では、下記の要領で Flex Gateway の挙動を確認します。

  1. Private API(顧客 API) へのルートが正しく構築されていることの確認
  2. API Policy を適用しアクセス管理ができることの確認

Private API(顧客 API) へのルートが正しく構築されていることの確認

Heroku の管理コンソールへ移動し、Flex Gateway のページを開きます。
Open app ボタンを押下します。
スクリーンショット 2024-10-24 17.21.21.png

Flex Gateway の URL がブラウザの新しい tab で開かれます。
/privatecust/customers
を URL に append します。
Private API へ Flex Gateway 経由で正しくアクセスできることを確認します。

イメージ:
スクリーンショット 2024-10-24 17.43.21.png

API Policy を適用しアクセス管理ができることの確認

ここまで、API のルーティングが正しく機能することを確認してきました。
ただ、現時点では特にアクセスポリシーが加えられていないため、誰でもアクセス可能な状態になっています。
そこで、下図のようにアクセス認証が通った API Consumer のみがアクセス許可されるようポリシーを加えます。
また、バックエンドやリソースの過剰使用を保護するべく API Consumer のタイプ別に流量制限を設けてみます。
スクリーンショット 2024-10-29 14.05.51.png

Anypoint Platform の管理コンソールに戻ります。
API Manager を開きます。
前章で登録した API を開きます。
SLA Tiers をクリックします。
スクリーンショット 2024-10-24 17.47.59.png

Add SLA Tier ボタンを押下します。
スクリーンショット 2024-10-24 17.50.47.png

下記の要領で SLA Tier を設定し、Add ボタンを押下します。

設定欄 設定値
Name trial
Approval Automatic
# of Reqs 1
Time Period 1
Time Unit Minute
スクリーンショット 2024-10-24 17.52.10.png

再度 Add SLA Tier ボタンを押下します。
下記の要領で SLA Tier を加えます。

設定欄 設定値
Name enterprise
Approval Manual
# of Reqs 1
Time Period 1
Time Unit Millisecond
スクリーンショット 2024-10-24 17.56.55.png

構成後のイメージ:
スクリーンショット 2024-10-24 17.58.46.png

1 分に 1 回のアクセスが許可された trial tier、並びに 1 ミリ秒に1回のアクセスが許可された enterprise tier を準備いたしました。

Policies をクリックします。
スクリーンショット 2024-10-24 17.59.10.png

Add policy をクリックします。
スクリーンショット 2024-10-24 18.00.27.png

Rate Limiting - SLA Based を選択し、Next ボタンを押下します。
スクリーンショット 2024-10-24 18.02.17.png

デフォルト設定のまま Apply ボタンを押下します。
スクリーンショット 2024-10-24 18.04.06.png

The policy was created successfully のポップアップが表示されることを確認します。
スクリーンショット 2024-10-24 18.04.50.png

しばらく時間を置いて、先程アクセスできた Flex Gateway 経由の Private API への URL にアクセスしてみます。
認証ができず、アクセスに失敗することを確認します。

イメージ:
スクリーンショット 2024-10-24 18.06.54.png

Anypoint Platform のコンソール画面に戻ります。
Exchange をハンバーガーメニューから選択します。
先にカタログ登録した API のページを開きます。
API Gateway とドッキングしたため、Request Access ボタンが追加されたことが確認できます。

イメージ:
スクリーンショット 2024-10-24 18.08.35.png

この Request Access ボタンを押下します。

API Instance 欄では API Manager に構成した flex-sandbox を選択します。
Application 欄にて Create a new application をクリックします。
スクリーンショット 2024-10-24 18.10.57.png

Application Name 欄に任意の Application 名(API Consumer アプリ名)を指定して、Create ボタンを押下します。
スクリーンショット 2024-10-24 18.14.48.png

SLA tier 欄にて trial を選択の上、Request access ボタンを押下します。
スクリーンショット 2024-10-24 18.16.06.png

アクセスが承認されたことが確認できます。
この画面に出力される Client ID と Client Secret を控えておきます。
スクリーンショット_2024-10-24_18_20_43.png

補足: 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

Postman で API Call した場合のイメージ:
スクリーンショット_2024-10-24_18_28_44.png

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回のみのアクセスが許容されており、そのポリシーが正しく機能していることが確認できました。
スクリーンショット_2024-10-24_18_29_19.png

さいごに

本記事では外部からのアクセスが遮断された Private API への Gateway を構築するようすを確認いたしました。また、この Gateway にアクセス管理関連のポリシーを適用し、意図された API Consumer から意図された流量で利用される仕組みを実装できることも確認しました。
これって別に MuleSoft Flex Gateway に限らず他製品でもできることだとは思いますが、稼働環境問わず稼働する軽量且つ高度な API Gateway を直感的な操作で構築できるのはポイントだと感じました。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?