ConoHa APIを使うには?

ショコラ
ショコラ

ConoHa APIを使うには?

ひとまずマニュアル通りだとうまくいかないです。

もっさん先輩
もっさん先輩

マニュアルだと↓なのですが NG でした。v3だからかなぁ?

curl -i -X POST \
 -H "Accept: application/json"\
 -d '{ "auth": { "passwordCredentials": { "username": "APIユーザーのユーザー名", "password": "APIユーザーのパスワード" }, "tenantId": "テナント情報のテナントID" } }'\
 "Identity ServiceのURLの後ろに/tokensを繋げる"

ネットで調べたところ↓なのです。

curl -i -X POST \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"auth": {"identity": {"methods": ["password"],"password": {"user": {"id": "APIユーザーID","password": "パスワード"}}},"scope": {"project": {"id": "テナントID"}}}}' \
https://identity.c3j1.conoha.io/v3/auth/tokens

やりたかったことは ConoHa のサーバーの一覧のCPU利用率を確認したかったです。

1枚ペラのプログラムです。
{トークン}、{ラベル}、{UUID}、{IPアドレス}を埋めて使ってください。

<?php
// 認証情報
$user = 'admin';
$pass = 'xxx';

// 認証されていない場合
if (
  !isset($_SERVER['PHP_AUTH_USER']) ||
  !isset($_SERVER['PHP_AUTH_PW']) ||
  $_SERVER['PHP_AUTH_USER'] !== $user ||
  $_SERVER['PHP_AUTH_PW'] !== $pass
) {
  header('WWW-Authenticate: Basic realm="Restricted Area"');
  header('HTTP/1.0 401 Unauthorized');
  echo '認証が必要です';
  exit;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.4/dist/semantic.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.4/dist/semantic.min.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<?php
require '../vendor/autoload.php';
use GuzzleHttp\Client;
$token = '{トークン}';
$client = new Client([
  'base_uri' => 'https://compute.c3j1.conoha.io/',
  'timeout'  => 10,
  'headers'  => [
    'Accept' => 'application/json',
    'X-Auth-Token' => $token,
  ],
]);
$servers = [
  ['label'=>'{ラベル}','uuid'=>'{UUID}','ip'=>'{IPアドレス}'  ],
] ;
?>
<div class="ui grid container">
<?php
foreach ( $servers as $i => $server ) {
  $labels = [];
  $values = [];
//$data = [];
  $response = $client->get("v2.1/servers/{$server['uuid']}/rrd/cpu");
  $data = json_decode($response->getBody(), true);
  if (isset($data['cpu']['data'])) {
    foreach ($data['cpu']['data'] as $row) {
      $labels[] = date('H:i', $row[0]); // 時刻
      $values[] = $row[1] / 1_000_000;  // CPU値
    }
  }
?>
<div class="five wide column"><canvas id="cpuChart<?= $i ?>" width="320" height="240"></canvas></div>
<script>
ctx = document.getElementById('cpuChart<?= $i ?>').getContext('2d');
labels = <?= json_encode($labels, JSON_UNESCAPED_UNICODE) ?>;
values = <?= json_encode($values, JSON_UNESCAPED_UNICODE) ?>;
new Chart(ctx, {
  type: 'line',
  data: {
    labels: labels,
    datasets: [{
      label: '<?= $server['label'] ?> <?= $server['ip'] ?>',
      data: values,
      borderWidth: 1,
      tension: 0.3,
      pointRadius: 0
    }]
  },
  options: {
    responsive: false,
    scales: {
      y: {
        beginAtZero: true
      }
    },
  },
})
</script>
<? } ?>
</div>
</body>
</html>
Scroll to Top