Tech Notes

ConoHa APIでチャージ残金を表示するアプリを作ってみる

この記事はConoHa Advent Calender 2021 18日目の記事です。

今回はConoHa APIの簡単な入門+実際に何か作ってみる、みたいな内容を書いていきます。

(ちなみに自分はConoHa Advent Calender初参加です!粗相のないようにしていきたいと思います~)

ConoHa APIとは?

ConoHa VPSで提供される多くのサービスは、管理画面からの設定だけでなくREST APIによる制御に対応しています。つまり手で管理画面にアクセスしなくてもHTTPでJSONをやりとりしたりして制御できるわけですね。この機能を提供するのがConoHa APIです。

使用できるAPI一覧や仕様については公式ドキュメントが用意されています。

簡単なアプリを作ってみる

今回はこれを使って何か作ってみます。手軽に作れて実用的なところで、ConoHaチャージの残金を表示するアプリを作ってみましょう。

言語はPHPで書いていきます。もちろんHTTPが喋れてJSONがパースできれば何の言語でも構いません。

トークンの取得

ConoHa APIの機能を利用するにはまずトークンを取得する必要があります。これはどの機能を使うにしても必要になります。トークン発行に必要なAPIはこれですね。

https://www.conoha.jp/docs/identity-post_tokens.php

トークン発行を行うには管理画面でAPIユーザの設定を行い、「ユーザ名」「設定したパスワード」「テナントid」そして「Identity Serviceのエンドポイント」の4つを確認する必要があります。この辺については公式サポートでかなり丁寧に解説されているので、こちらを読むと良いでしょう。

トークン生成の部分をPHPコードに直すとこんな感じです。こちらの関数は、連想配列の形式で「id」にトークンIDを、「expires」に有効期限を入れて返してくれます。

endpoint_identity, username, password, tenant_idには調べた設定を適宜記入してください。

function getToken()
{
  $endpoint_identity = '(Identity Serviceのエンドポイント)';
  $username = '(ユーザ名)';
  $password = '(設定したパスワード)';
  $tenant_id = '(テナントID)';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $endpoint_identity . "/tokens");
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'auth' => [
      'passwordCredentials' => [
        'username' => $username,
        'password' => $password,
      ],
      'tenantId' => $tenant_id,
    ]
  ]));

  $result = curl_exec($ch);
  curl_close($ch);

  $data = json_decode($result);
  return [
    'id' => $data->access->token->id,
    'expires' => $data->access->token->expires,
  ];
}

チャージ残高の取得

チャージ残高の情報を取得するにはこちらのAPIを使用します。このAPIは「Account(Billing) API」のカテゴリに所属していますね。

ということで、管理画面で「Account Service」エンドポイントのURLを確認しましょう。

APIのカテゴリによって利用するエンドポイントが違うので、使いたいAPIごとに確認する必要があります。気を付けましょう。

あと若干罠っぽい点があります。今回利用するAPIのURLについて、ドキュメントには「/v1/{tenant_id}/payment-summary」と書いてありますが、 この「 /v1/{tenant_id} 」の部分は管理画面で表示されるエンドポイントURLにすでに含まれています。 ということで、実際に利用するURLは

(管理画面で確認したURL) +「/v1/{tenant_id}/payment-summary」

ではなく、

(管理画面で確認したURL) +「/payment-summary」

というURLになります。

さていよいよAPIを利用するわけですが、ここで先ほど取得したトークンを利用します。トークンを利用するには、 X-Auth-TokenというHTTPヘッダに値を指定します。 これはConoHa APIならばどのAPIでも共通です。

ということで、ドキュメントを読みながら実装してみるとこんな感じになりました。どん!

function getDeposit($token_id){
  $endpoint_account = '(Account Serviceのエンドポイント)';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $endpoint_account . "/payment-summary");
  curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Auth-Token: ' . $token_id]);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  $result = curl_exec($ch);
  curl_close($ch);

  $data = json_decode($result);
  return $data->payment_summary->total_deposit_amount;
}

さて、実装したこれらの関数を使ってみましょう。

$token = getToken();
echo getDeposit($token->id);

するとこんな感じでちゃんとチャージ残高が表示できました。

どうやら上手く動作した模様です!

折角なので良い感じに表示してみましょう。

こんな感じでConoHaチャージの残高を確認するアプリが完成しました。

うーん、しかし何か物足りないですね。何が足りないのでしょうか?

そう…

清楚かわいいこのはちゃんに貢いでいる実感が足りない…

ということで

これでいつもかわいいこのはちゃんを見て気持ち良く課金できますね!

トークンを使いまわす

上のコードだと簡単のためにAPIを使用するたびにトークンを生成・取得していますが、もちろんこれは非効率ですね。「expires」の値を確認し、有効期限内ならトークンを使いまわすようにgetToken()の処理を変更してみましょう。有効期限の表記はISO 8601準拠です。

function getNewToken()
{
  // 先ほどのgetToken()と同じ処理
  $endpoint_identity = '(Identity APIのエンドポイント)';
  $username = '(ユーザ名)';
  $password = '(設定したパスワード)';
  $tenant_id = '(テナントID)';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $endpoint_identity . "/tokens");
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'auth' => [
      'passwordCredentials' => [
        'username' => $username,
        'password' => $password,
      ],
      'tenantId' => $tenant_id,
    ]
  ]));

  $result = curl_exec($ch);
  curl_close($ch);

  $data = json_decode($result);
  return [
    'id' => $data->access->token->id,
    'expires' => $data->access->token->expires,
  ];
}

function getToken()
{
  $token_file_path = './token.json';

  if(file_exists($token_file_path)){
    $token = json_decode(file_get_contents($token_file_path));
    if(DateTime::createFromFormat(DateTime::ATOM, $token->expires) < new DateTime('now')){
      $token = null;
    }
  }
  else
  {
    $token = null;
  }

  if($token === null) {
    $token = getNewToken();
    file_put_contents($token_file_path, json_encode($token));
  }
  
  return $token;
}

ConoHa APIを活用しよう!

上の方でも書いた通り、ConoHa VPSで提供されている機能というか、管理画面からアクセスできる機能は本当にほぼ全てAPIが用意されています。今回の例のように表示や通知などを自動化するもよし、負荷等に応じて自動で構成をスケールするもよし。ConoHa APIをぜひ活用しましょう!

余談

ちなみにAPIからしか利用できない機能もあります。というかConoHa管理画面フロントエンドのバグっぽいですが。

ConoHaの管理画面のDNS設定においては*.example.comのようなワイルドカードDNSもサポートされているのですが、*.hoge.example.comのように途中に文字列を挟んだパターンを設定しようとするとエラーが出ます。おそらく内部的に

「*」もしくは「アルファベットとピリオド混交」ならOK

みたいなロジックでバリデーションしているのだと思われます。

バックエンド側としては普通にこのようなワイルドカードDNSにも対応しているようで、ConoHa API越しであれば普通に設定できます。お試しあれ。(使うのはこのAPIですね。)