この記事では、VMware Tanzu Application Platform (以降TAP)が提供する API 自動登録機能について紹介します。
TAP は、開発者向けの TAP GUI という優れた統合 GUI ポータルを提供しており、API 管理も TAP GUI 経由で完結できるようになっています。TAP GUI の詳細については別のブログで紹介していますので参考ください。
まず、TAP 1.2 まではどのように TAP GUI 経由で API `を管理していたかをみてみましょう。
TAP GUI は API ドキュメントプラグイン経由でソフトウェア catalog のコンポーネントやシステムに接続可能な API のリストをスタンドアロンで提供しています。
各 API エンティティを TAP GUI に登録することで、その API を提供するコンポーネントと、その API を消費するコンポーネントのリストを TAP GUI から一元管理することが可能です。
現在、API ドキュメントプラグインは次の API 形式をサポートしています。
- OpenAPI 2 & 3
- AsyncAPI
- GraphQL
- Plain (他の形式をサポートするため)
具体例でみる API ドキュメントプラグイン経由での API 手動登録機能
上記の説明だけではイメージがつかないと思うので、具体的な手順を通じて TAP GUI に API エンティティを手動で登録してみたいと思います。
参考ドキュメントは下記となります。
https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.4/tap/tap-gui-plugins-api-docs-getting-started.html
(ちなみに、そもそも TAP をインストールできず本ブログで紹介する TAP API 関連の機能を含め試せない場合は、こちらのブログを参考に TAP をインストールしてみてください。)
TAP GUI に API エンティティを登録する Step は下記となります。
Step1. TAP GUI にアクセスし、Home -> REGISTER ENTITY をクリックします。
Step2. 下記の YAML ファイルを catalog-info.yaml として Github 上に保存します。
(こちらの Step は TAP GUI の操作ではなく、GitHub 上にファイルを保存する操作となりますので、具体的な GitHub 操作方法に関しては GitHub ドキュメントを参考ください)
catalog-info.yaml ファイルの中身は下記となります。
=========
apiVersion: backstage.io/v1alpha1 kind: Domain metadata: name: demo-domain description: Demo Domain for Tanzu Application Platform annotations: 'backstage.io/techdocs-ref': dir:. spec: owner: demo-team --- apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: demo-app-ms-1 description: Demo Application's Microservice-1 tags: - microservice annotations: 'backstage.io/kubernetes-label-selector': 'app.kubernetes.io/part-of=demo-app-ms-1' 'backstage.io/techdocs-ref': dir:. spec: type: service providesApis: - demo-api lifecycle: alpha owner: demo-team system: demo-app --- apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: demo-app-ms-2 description: Demo Application's Microservice-2 tags: - microservice annotations: 'backstage.io/kubernetes-label-selector': 'app.kubernetes.io/part-of=demo-app-ms-2' 'backstage.io/techdocs-ref': dir:. spec: type: service consumesApis: - demo-api lifecycle: alpha owner: demo-team system: demo-app --- apiVersion: backstage.io/v1alpha1 kind: System metadata: name: demo-app description: Demo Application for Tanzu Application Platform annotations: 'backstage.io/techdocs-ref': dir:. spec: owner: demo-team domain: demo-domain --- apiVersion: backstage.io/v1alpha1 kind: API metadata: name: demo-api description: The demo API for Tanzu Application Platform GUI links: - url: https://api.agify.io title: API Definition icon: docs spec: type: openapi lifecycle: experimental owner: demo-team system: demo-app # Or specify system name of your choice definition: | openapi: 3.0.1 info: title: Demo API description: defaultDescription version: '0.1' servers: - url: https://api.agify.io paths: /: get: description: Auto generated using Swagger Inspector parameters: - name: name in: query schema: type: string example: type_any_name responses: '200': description: Auto generated using Swagger Inspector content: application/json; charset=utf-8: schema: type: string examples: {}
=========
非常に長い YAML ファイルとなりますが、内容を簡単に説明しますと、demo-domain というドメインと demo-app というシステムが含まれています。
demo-app のシステムに更に 2 つのマイクロサービス(demo-app-ms-1とdemo-app-ms-1)があり、demo-app-ms-1 が demo-api という API を提供し、demo-app-ms-2 が demo-api を消費するような定義ファイルになっています。
このような依存関係は YAML 定義ファイルの spec.providesApis と spec.consumesApis で定義されています。
今回の手順では https://github.com/gordon-jin/hello-world 上に Step2 の catalog-info.yaml ファイルをアップロードしています。Step3. TAP GUI に戻って「Select URL」 に「Step2」で保存した GitHub 上の catalog-info.yaml の URL をコピペします。
今回の手順では https://github.com/gordon-jin/hello-world/blob/master/catalog-info.yaml を 「Select URL」にコピペしています。
Step4. Import ボタンをクリックします。
Step5. TAP GUI の Home 画面に戻り、2つの Catalog Entity( demo-app-ms-1 と demo-app-ms-1 ) が登録されているのを確認します。
これで手動での API 登録は完了です。
では、登録されている API の中身をみてみましょう。
TAP GUI の左側パネルの APIs をクリックすると右側に demo-api という API が登録されているのを確認できます。
demo-api をクリックすると、この API の OWNER、SYSTEM、LIFECYCLE などの情報と、一番下にこの API を提供しているコンポーネントと消費しているコンポーネントを確認できます。
また、View graph をクリックすることで graph 経由で API システム構成、API 提供元、API 消費者などを確認できます。
今度は Definition をクリックし、該当 API の仕様書を確認します。
次は、上記の 「Example : type_any_name」 を 「Example : tanzu」に仕様書を変更したいと思います。
demo-api の Overview に戻って、Edit アイコンをクリックします。
GitHub の catalog-info.yaml の編集画面に遷移しますが、ここで「example: type_any_name」を「example: tanzu」に変更し、GitHub を Commit します。
GitHub を更新後、TAP GUI の catalog 上にも反映されているのを確認します。
(TAP GUI の更新には 200 秒かかります)
「example: tanzu」に更新されているのを確認できます。
ここまで API 手動登録機能について紹介しました。
多少長い YAML ファイルを OpenAPI Specification に従って作成して登録する必要がありますが、API エンティティを catalog として TAP GUI に登録することで TAP GUI から API の一元管理が可能です。
また、YAML ファイルを GitHub 上に保存することで、簡単にバージョン管理もできます。
ただ、このような YAML ファイルは API アプリ作成するたびに手動で作って登録する必要があるため、開発者にとっては面倒な作業となります。
この面倒な作業を劇的に改善するのが TAP 1.3 から提供している API 自動登録機能です。
API 自動登録機能とは
API 自動登録機能とは、アプリ の Workload の構成で定義された API 仕様を TAP GUI に自動的に登録する機能です。
API 仕様書は、手動での API 登録のように個別の YAML ファイルを用意する必要はなく、TAP 上に API を提供するアプリの Workload をデプロイするだけで、TAP GUI 上に自動的に登録されるようになるのです。
具体例でみる API 自動登録機能
では、TAP 上に実際の RESTful Web Service をベースとした Spring boot アプリの Workload をデプロイし、関連 API が自動的に TAP GUI 上に登録されることを具体的なイメージを通じてみていきましょう。
今回は、下記の公式ドキュメントにある Spring Boot example app を使います。
https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.4/tap/api-auto-registration-usage.html
Using a Spring Boot app with a REST service
You can use a Spring Boot example app built using Building a RESTful Web Service guide. and has the Springdoc dependency.
下記の tanzu cli コマンドを使って rest-service `アプリの Workload を TAP 上にデプロイします。
tanzu apps workload apply rest-service \ --app rest-service \ --git-repo https://github.com/gordon-jin/rest-service \ --git-branch main \ --type web \ --label apis.apps.tanzu.vmware.com/register-api=true \ --param-yaml api_descriptor='{"description":"simple rest api.","location":{"path":"/v3/api-docs"},"owner":"demo","system":"dev","type":"openapi"}' \ --annotation autoscaling.knative.dev/minScale=1 \ -n demo \ -y
従来のアプリの Workload をデプロイする時と違う点としては、
–label apis.apps.tanzu.vmware.com/register-api=true と
–param-yaml api_descriptor の部分が追加されています。
–param-yaml api_descriptor にパラメータとして API の Owner、system などの情報を記入しています。
しばらく経つと、TAP GUI と Tanzu CLI から rest-service アプリの Workload が正常にデプロイされているのを確認できます。
それぞれの確認方法は下記となります。
TAP GUI 経由での確認:
TAP GUI -> Supply Chains で rest-service アプリの Workload のStatus が Healthy になっているのを確認します。
Tanzu CLI 経由での確認:
下記の Tanzu CLI コマンドを使って rest-service アプリの Workload の Status が Ready になっているのを確認します。
$ tanzu apps wld get rest-service -n demo ? Overview name: rest-service type: web ? Source type: git url: https://github.com/gordon-jin/rest-service branch: main ? Supply Chain name: source-to-url RESOURCE READY HEALTHY TIME OUTPUT source-provider True True 45m GitRepository/rest-service image-provider True True 43m Image/rest-service config-provider True True 43m PodIntent/rest-service app-config True True 43m ConfigMap/rest-service service-bindings True True 43m ConfigMap/rest-service-with-claims api-descriptors True True 43m ConfigMap/rest-service-with-api-descriptors config-writer True True 42m Runnable/rest-service-config-writer ? Delivery name: delivery-basic RESOURCE READY HEALTHY TIME OUTPUT source-provider True True 41m ImageRepository/rest-service-delivery deployer True True 41m App/rest-service ? Messages No messages found. ? Pods NAME READY STATUS RESTARTS AGE rest-service-00001-deployment-54f4cd64bf-nlbtp 2/2 Running 0 41m rest-service-build-1-build-pod 0/1 Completed 0 45m rest-service-config-writer-6ckz8-pod 0/1 Completed 0 42m ? Knative Services NAME READY URL rest-service Ready https://rest-service.demo.172.17.203.60.sslip.io To see logs: "tanzu apps workload tail rest-service --namespace demo"
次に、 rest-service アプリの関連 API が自動的に登録されているかを確認します。
TAP GUI -> APIs をクリックすると、demo/rest-service-172.17.203.60.sslip.io として登録されているのを確認できます。
demo/rest-service-172.17.203.60.sslip.io をクリックすると、Overview のところから該当 API の OWNER、SYSTEM、TYPE、LIFECYCLE の情報を確認できます。
こちらの情報は rest-service アプリの Workload をデプロイ時使っていた –param-yaml で設定した値になります。
今度は上記画面の Definition をクリックし、API 仕様書を確認します。
この画面から API の実行も可能です。
GET / greeting を展開し、[TRY IT OUT] ボタンをクリックします。
name の値は Tanzu にし、EXECUTE ボタンをクリックします。
実行結果は下記となります。
API 自動登録機能の仕組み
では、API 自動登録機能の仕組みについて少し説明します。
TAP GUI 上で API を自動登録するには、下記の要件を満たす必要があります。
1. TAP 上にデプロイするアプリは API を公開するアプリであること
サンプルアプリの作成については下記ドキュメントの 「Building a RESTful Web Service guide」 を参考ください。
Using a Spring Boot app with a REST service
You can use a Spring Boot example app built using Building a RESTful Web Service guide. and has the Springdoc dependency.
2. TAP 上に API Auto Registration package がインストールされていること
(今回は TAP full profile を使っており、API Auto Registration package は デフォルトで入っています)
API Auto Registration package を個別にインストールする場合は、下記のドキュメントを参考ください。
API Auto Registration package をインストールすると、api-auto-registration という Namespace に api-auto-registration-controller という名前の Pod が起動されます。
$ kubectl get pods -n api-auto-registration NAME READY STATUS RESTARTS AGE api-auto-registration-controller-56df54dfc6-kptnw 1/1 Running 8 (97m ago) 14d
API 自動登録のアーキテクチャ
TAP 上に API を公開するアプリの Workload をデプロイすると、上記の図にある Run cluster 中の APIDescriptor が TAP の Supplychain の中で生成され、api-auto-registration-controller はそれを検知して TAP GUI 上に API を登録する仕組みになっています
API 自動登録の流れ
rest-service アプリの Workload をデプロイ中に生成された apidescriptor は下記のコマンドで確認できます。
$ kubectl get apidescriptors -n demo NAME STATUS rest-service Ready sample-api-descriptor-with-absolute-url Ready
もし、アプリのソースコード上 API を公開するように書いていない、かつ、Workload のデプロイのパラメータとして
–label apis.apps.tanzu.vmware.com/register-api=true と
–param-yaml api_descriptor
を追加している場合は、APIDescriptor は生成できず Workload はデプロイ中にエラーとなります。
なお、今回の手順ではアプリの Workload をデプロイ時、つまり、TAP の Supplychain の過程で apidescriptor が生成され、TAP GUI 上に自動登録されていますが、TAP 上にアプリの Workload をデプロイせず、個別に apidescriptor だけを作成して TAP GUI 上に登録してみるのも可能です。
(何らかの理由で API が TAP GUI 上にうまく自動登録できない場合、トラブルシューティングの一つの方法として仮の apidescriptor を登録してみるとよいです。)
例として、下記のコマンドを実行すると、sample-api-descriptor-with-absolute-url という apidescriptor が生成され、TAP GUI 上に登録されます。
kubectl apply -f - <<EOF apiVersion: apis.apps.tanzu.vmware.com/v1alpha1 kind: APIDescriptor metadata: name: sample-api-descriptor-with-absolute-url namespace: demo spec: type: openapi description: A sample APIDescriptor to validate package installation successful system: test-installation owner: test-installation location: path: "/api/v3/openapi.json" baseURL: url: https://petstore3.swagger.io EOF
$ kubectl get apidescriptor -n demo NAME STATUS rest-service Ready sample-api-descriptor-with-absolute-url Ready
TAP GUI -> APIs 経由で demo/sample-api-descriptor-with-absolute-url-172.17.203.60.sslip.io という名前の API が登録されているのを確認できます。
いかがでしょうか?
TAP では YAML ファイルをベースとした API 手動登録機能のほか、TAP 1.3 からは API 自動登録機能も提供しており、TAP 上に API を公開するアプリの Workload をデプロイするだけで API 情報は TAP GUI 上に自動登録され、API 管理はかなり楽になります。
まとめ
ここまで TAP 1.3 から提供している API の自動登録機能について紹介しました。
開発者は API の自動登録機能を利用することで、簡単に API を登録、管理することが可能です。
VMware ブログでは、引き続き TAP の新機能を続々と紹介させていただきます。