Japan VMUG vExpert が語る #28 で、REST API で VMware Cloud on AWS のコスト情報を見てみる話をしました。
今回は、VMware Cloud Services の「請求とサブスクリプション」→「概要」あたりで確認できる現在のコスト情報を、REST API でも取得してみた方法を紹介します。
今回の内容です。
- 手順の概要
- VMware Cloud Services の API トークン生成
- 今回の実行環境
- REST API でのコスト情報取得(curl + jq / estimated-charges)
- REST API でのコスト情報取得(curl + jq / current-costs)
- REST API でのコスト情報取得(Ansible)
- おまけ: コスト情報取得がエラーになる場合について
- まとめ
- 録画
手順の概要
VMware Cloud on AWS のコスト情報を確認するには、VMware Cloud Services の REST API 操作と同様、あらかじめ API トークンを生成しておきます。
- VMware Cloud Services の「マイ アカウント」ページからAPI トークンを生成
- API コールする際に、API トークン(Refresh Token)から Access Token を取得
- Access Token をもとに、API でコスト情報を取得
API トークンを利用した認証方法の具体的な手順は、下記のリファレンスが参考になります。「Exchange Scoped Token For Access (requires login)」のリンクの先は VMware Cloud on AWS の「API エクスプローラー」になっており、VMware Cloud Services へのログインが必要です。
- VMware Cloud on AWS API Reference
https://developer.vmware.com/apis/vmc/latest/
VMware Cloud on AWS の API エクスプローラーは、VMware Cloud Services の API エクスプローラーとは別画面です。
API エクスプローラーでは、画面から直接 API コールできるようになっていますが、今回は API リファレンスとして参照するだけです。ちなみに、API コールせずにリファレンスを参照する場合にも、 VMware Cloud on AWS が利用できる VMware Cloud Services アカウントでログインする必要があります。
コスト情報は、下記の API メソッドから取得してみます。
- GET /commerce/api/v1/orgs/{orgId}/estimated-charges
REST API をコールするスクリプト(curl + jq)/ Ansible は、手元の Linux マシンから実行します。
VMware Cloud Services の API トークン生成
VMware Cloud Services の「マイ アカウント」→「API トークン」タブで、API トークンを生成しておきます。
このとき、「範囲の定義」では下記の組織ロールを選択しておきます。ちなみに「請求書読み取り専用」や「組織管理者」もありますが、今回の情報取得方法では権限不足でエラーになってしまいました。
- 組織ロール: 組織の所有者
API トークンの生成については通常の VMware Cloud Services の手順と同様なので、画面の様子などは下記の投稿を参考にしてください。
今回の実行環境
手元の VMware Photon OS 5.0 を利用します。
gowatana [ ~ ]$ cat /etc/photon-release VMware Photon OS 5.0 PHOTON_BUILD_NUMBER=dde71ec57
API コールでは、Photon OS 同梱の curl(+ jq)、Ansible を利用しています。jq と ansible は、Photon OS の Yum リポジトリからインストールしてあります。
gowatana [ ~ ]$ rpm -q curl jq ansible curl-8.0.1-1.ph5.x86_64 jq-1.6-2.ph5.x86_64 ansible-2.14.2-1.ph5.noarch
REST API でのコスト情報取得(curl + jq / estimated-charges)
下記のような、curl コマンドを 2回実行するだけのスクリプトを作成してみました。
get_vmc_estimated-charges.sh
- L7で、別ファイルに記載した API_TOKEN と ORG_ID を読み込む。
- L10~の最初の curl で、API Token から Access Token をを取得。
- L19 にある /commerce/api/v1/orgs/$ORG_ID/estimated-charges の部分が、コスト情報を取得する API の URL。
API トークンと環境固有のパラメータは、別ファイルに記載しておきます。
id_and_key.txt
- API_TOKEN: 事前に生成しておいた API トークン(Refresh Token)
- ORG_ID: 組織の ID(リファレンスでは {orgId})。VMware Cloud Service 画面右上あたりなどから確認できる。
export API_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxx" export ORG_ID="xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
スクリプトを実行すると、下記のように情報取得できます。ちなみに金額はいい感じに手作業で加工してあります。
$ bash ./get_vmc-on-aws_estimated-charges.sh
REST API でのコスト情報取得(curl + jq / current-costs)
じつは、冒頭の Web ブラウザの画面で表示されていた情報は、別の API URL で取得されています。URL を下記に差し替えてたスクリプトも用意してみました。
- ~/commerce/api/v3/orgs/$ORG_ID/billing-accounts/$BILLING_ID/current-costs
billing-accounts の ID も必要になるので、別ファイルにも追記しておきます。
ちなみにこの ID は、あらかじめ下記の API などで確認しておきます。
- GET /commerce/api/v3/orgs/{orgId}/billing-accounts
export API_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxx" export ORG_ID="xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" export BILLING_ACCOUNT_ID="xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
スクリプトを実行すると、下記のように情報取得できます。さきほどの例と同様、金額と UUID はいい感じに手作業で加工してあります。
$ bash ./get_vmc-on-aws_current_cost.sh
REST API でのコスト情報取得(Ansible)
ついでに、Ansible の uri モジュールでも情報取得してみます。
下記のような Playbook を作成しておきます。
API トークンと環境固有のパラメータは、別のファイルに記載しておきます。さきほどとは異なり、このファイルも YAML 形式にしてあります。
id_and_key.yml
org_id: "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" api_key: "xxxxxxxxxxxxxxxxxxxxxxxxxx"
ansible-playbook で実行すると、下記のように情報取得できます。
gowatana [ ~ ]$ ansible-playbook get_vmc-on-aws_cost.yml [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [Get VMC cost] *********************************************************************************************************** TASK [Get access token] ******************************************************************************************************* ok: [localhost] TASK [Get cost info] ********************************************************************************************************** ok: [localhost] TASK [Output cost info] ******************************************************************************************************* ok: [localhost] => { "msg": "2023-07-12 04:41:26 55555.0 JPY" } PLAY RECAP ******************************************************************************************************************** localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
おまけ: コスト情報取得がエラーになる場合について
ちなみに VMware Cloud on AWS のコスト情報の取得は、けっこう失敗することがあります。
estimated-charges の場合
{ "moduleCode": 410, "cspErrorCode": "410.701", "requestId": "xxxxxxxxxxxx", "statusCode": 500, "traceId": "xxxxxxxxxxxxxxxxxxxxxxxxxx", "message": "Unmapped SPI Exception calling /spi/v1/organizations/xxxxxxxxxxxxxxxxxx/estimated-charges" }
current-costs の場合
{ "message": "Unable to read SPI response Body: ", "moduleCode": 410, "statusCode": 400, "traceId": "xxxxxxxxxxxxxxxxxxxxxxxx", "requestId": "xxxxxxxxxxxx", "cspErrorCode": "410.701" }
この場合は、Web ブラウザ側でもコスト情報が表示できなくなっているはずです。
そもそもコスト情報は反映が即時ではなくサービス影響が低いためか、この画面表示自体もあまり可用性が高くないようで、(しばらく待って)ブラウザ側での表示が復活すると、API での取得も復活します。
まとめ
- REST API でも、Web ブラウザで表示できる VMware Cloud on AWS 現在のコスト情報は取得可能。
- 今回の情報取得方法では、「組織の所有者」(英語だと Organization Owner)のロールが必要。
- けっこう情報取得できないことがあるので、API で情報取得する場合はエラーを許容できるようにするとよいかと思います。
録画
セッションの録画はこちら。
以上、REST API で VMware Cloud on AWS のコスト情報を取得してみる話でした。