vm.gowatana.jp

NEOにほんごVMware(仮)

VMware Cloud on AWS のコストを情報を REST API で見てみる。(curl / Ansible)

Japan VMUG vExpert が語る #28 で、REST API で VMware Cloud on AWS のコスト情報を見てみる話をしました。

vmug-jp.connpass.com

 

今回は、VMware Cloud Services の「請求とサブスクリプション」→「概要」あたりで確認できる現在のコスト情報を、REST API でも取得してみた方法を紹介します。

 

今回の内容です。

 

手順の概要

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 エクスプローラーは、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。

gist.github.com

 

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

gist.github.com

 

REST API でのコスト情報取得(curl + jq / current-costs)

じつは、冒頭の Web ブラウザの画面で表示されていた情報は、別の API URL で取得されています。URL を下記に差し替えてたスクリプトも用意してみました。

  • ~/commerce/api/v3/orgs/$ORG_ID/billing-accounts/$BILLING_ID/current-costs

gist.github.com

 

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

gist.github.com

 

REST API でのコスト情報取得(Ansible)

ついでに、Ansible の uri モジュールでも情報取得してみます。

下記のような Playbook を作成しておきます。

gist.github.com

 

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 のコスト情報を取得してみる話でした。