このエントリは2019/11/05現在の情報に基づいています。このサービスはPreviewのため、機能追加や変更により、記載内容との乖離が発生する可能性があります(2020/04/29に一般提供されました)。
Self-hosted API gatewayとは
USのFlorida、Orlandoで開催されているIgniteで発表があった通り、Azure API ManagementのGatewayを任意の場所で動作させることが可能なSelf-hosted GatewayがPreviewとしてリリースされた。これはDockerコンテナで動作するもので、Kubernetesでももちろん動作する。
Azure Arc enabled API Management is now available in preview
https://azure.microsoft.com/en-us/updates/azure-arc-enabled-api-management-is-now-available-in-preview/
Gatewayの機能はこれまでのものと同じで、デプロイされた Self-hosted API Gatewayは定期的にポーリング、アーティファクトの更新をチェックし、更新があれば取り込む、というどこかのAPI Managementサービスと同じ挙動をする。
重要なことが以下のドキュメントにさらっと記載されているので、チェックされることをお勧めする。
Connectivity to Azure
https://docs.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview#connectivity-to-azure
- Self-hosted API GatewayはAPIMインスタンスの一つとのみ関連付けることができる
- 443/tcp (TLS) でAzureに接続する。この接続を使って以下を実現する
- 60秒ごとにSelf-hosted API GatewayのステータスをAPIMインスタンスに送信する
- 10秒ごとに構成の更新があるかどうかをチェックする
- (構成している場合のみ)ログやメトリックをAzure Monitorに、イベントをApplication Insightsに送信する
- 接続が切れた場合、Self-hosted API Gatewayは構成の更新、ステータスの送信、テレメトリデータの送信ができなくなるが、Self-hosted API Gatewayはfail staticであるように設計されており、Azureとの接続が一時的に切断した場合にも動作するようになっている。
- Self-hosted API Gatewayは構成のバックアップを取る構成、取らない構成の両方でデプロイできる。
- バックアップありの場合
- 定期的に構成のコピーを永続ボリュームに保存する。
- 実行にあたっては、メモリ上の構成のコピーを使う。
- 停止後の再起動時にはバックアップした構成を使う。
- 再起動後、紐付けたAPIMインスタンスに接続し、接続できなかった期間にあった構成のアップデートをダウンロードする。
- バックアップなしの場合
- メモリ上の構成のコピーを使って動作する。
- (バックアップがないので)停止した Self-hosted API Gateway は起動できない。
- バックアップありの場合
Self-hosted API gatewayを試してみる
ドキュメントに従えば可能だが、備忘録として残しておく。
Provision a self-hosted gateway in Azure API Management
https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-provision-self-hosted-gateway
APIM側の設定
下図の通り、APIMインスタンスの設定>Gatewaysをクリックし、[+追加]をクリックする。

名前、リージョン、デプロイしたいAPIを指定する。

上記画面の下部にある[追加]をクリックと、以下の表示に変わり、Gatewayが追加されたことがわかる。

Self-hosted API Gatewayのデプロイ
今回はDocker上にデプロイする。ドキュメントに従ってデプロイすればOKだが、備忘録として残しておく。
Deploy an Azure API Management self-hosted gateway to Docker
https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-deploy-self-hosted-gateway-to-docker
Kubernetes上にデプロイする場合は以下のドキュメントを参照。
Deploy a self-hosted Azure API Management gateway to Kubernetes
https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-deploy-self-hosted-gateway-to-k8s
先ほど登録したSelf-hosted API Gatewayをクリックし、Settings > Deploymentを選択する。

Access Tokenの有効期限は必要に応じて変更する。Deployment scriptsがDockerになっていることを確認しておく(Kubernetesになっている場合、YAMLが出てきているはず)。
env.confをクリックしてダウンロードしておく。このファイルはdocker runコマンドを実行する際に参照している。
runのフィールドにdocker runのコマンドパラメータが記載されているので、コピーして実行する。ポート番号のマッピングは適宜変更する。docker runコマンドで先ほどダウンロードしたenv.confを参照しているので注意する(今回はdocker runコマンドを実行するディレクトリにenv.confを配置した)。
docker run -d -p 80:8080 -p 443:8081 --name <gateway-name> --env-file env.conf mcr.microsoft.com/azure-api-management/gateway:<tag>
Azure Portalを確認すると、Heartbeatを確認していることがわかる。

APIを呼び出してみる
デフォルトで用意されているEcho APIを呼び出してみる。その前にEcho APIのSettingsを見てみると、Gatewaysの欄にManagedとSelf-hosted API Gateway(今回はonpgw)の表示があり、これらにデプロイされることがわかる。

では実際に呼び出してみる。Echo APIはなぜかバイナリデータがレスポンスに付加されてしまうので、curlで呼び出す際に-oを付けてファイルに吐き出すようにしている。

ということで、無事にEcho APIを呼び出すことができた。
現時点では、Self-hosted API GatewayにのみAPIをデプロイする仕組みが存在しないが、おそらく今後機能追加されるのかもしれない。