IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

PHPでIDCFクラウドDNS/GSLBのAPIを操作してみよう

こんにちは、UX開発部の橋口です。

Webサービスを運用する上で、DNSの管理は必須ですよね。 大量に管理しているDNSのゾーンやレコードの設定を、1つ1つ手動でやるのはかなり時間がかかります。既に、PythonやRubyからAPIを操作し、DNSの管理を自動化されている方も多いと思います。
今回は、idcf/clientを用いてPHPでIDCFクラウドDNS/GSLBのAPIを使う方法をご紹介します。

idcf/clientとは

※idcf/clientは、橋口個人が作成した非公式のツールです。IDCフロンティアのサポートおよび動作保障はございませんのであらかじめご了承ください。

idcf/client は、REST APIのPHP用クライアントです。現在、IDCFが提供している次のサービスのAPIに対応しています。

不具合を発見した場合はこちらからissueを起票していただければ幸いです。

機能はシグネチャーを計算してリクエストを送るだけととてもシンプルです。使用したサービスのAPIドキュメントを参考に、メソッドやパスを設定します。
説明するより試してみたほうが早いので、実際にインストールし使っていきたいと思います。

IDCFクラウドDNS/GSLBのAPIドキュメントはこちら

インストール

PHPのパッケージ管理ツールであるcomposerを使ってライブラリをインストールします(composerについての説明は割愛します)。

$ composer require idcf/client
Using version ^0.0.1 for idcf/client
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing idcf/client (v0.0.1): Downloading (100%)
Writing lock file
Generating autoload files

オブジェクトの作成

インストールが完了したら、はじめにクライアントのオブジェクトを作成します。
API KeyとSecret KeyはIDCFクラウド コンソールからご確認ください。

<?php
require_once "vendor/autoload.php";
$api_key = "";
$secret_key = "";
$client = new \Idcf\Client\Dns($api_key, $secret_key);

これで、IDCFクラウド DNS/GSLBを使う準備ができました!

ゾーンの操作

ここからは、ゾーンの操作をご紹介いたします。ゾーン操作では、一覧取得、作成と削除、更新もできます。 紹介する操作では、ゾーン毎にユニークに割り当てられているzone_uuid を使用します。

ゾーン一覧の取得

$client->get("zones");

はじめはゾーンがないため、空の配列が返ります

array(0) {
}

ゾーンの作成

$params = array(
  "name" => "example.com",
  "email" => "postmaster@example.com",
  "description" => "zone description",
  "default_ttl" => 3600
);
$client->post("zones", $params);

ゾーンの作成ができました。 IDCFクラウドDNS/GSLBでは、リソースの識別にUUIDを使用しているので、UUIDを指定して操作を実施します。 今回作成したゾーンのUUIDは e374628a-9f4a-40e7-b5c9-9299590d454c となっています。

object(stdClass)#2 (8) {
  ["uuid"]=>
  string(36) "e374628a-9f4a-40e7-b5c9-9299590d454c"
  ["name"]=>
  string(11) "example.com"
  ### 中略 ###
}

ゾーン認証情報の取得

$zone_uuid = "";
$client->get("zones/${zone_uuid}/token");

IDCFクラウドDNS/GSLBでは、ゾーン認証が必要となっていますので、認証レコードを新規の場合はNSレコードを委譲元に、移行などの場合はTXTレコードを現用のゾーンに記載します。

object(stdClass)#2 (2) {
  ["TXT"]=>
  array(1) {
    [0]=>
    string(47) "idcf-dns-token=0123456789abcdef0123456789abcdef"
  }
  ### 中略 ###
}

ゾーンの認証

$zone_uuid = "";
$client->post("zones/${zone_uuid}/verify");

認証に成功すると空のオブジェクトが返ります。

object(stdClass)#2 (0) {
}

認証に成功したら実際に名前解決ができるか試してみましょう。 TXTレコードで認証している場合はDNSサーバーを指定して、名前解決ができるか試験してから移行すると事故が未然に防げます!!

$ dig soa example.com @ns01.idcfcloud.com

; <<>> DiG 9.8.3-P1 <<>> soa example.com @ns01.idcfcloud.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30941
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;example.com.           IN  SOA

;; ANSWER SECTION:
example.com.        3600    IN  SOA ns01.idcfcloud.com. postmaster.example.com. 1 10800 3600 604800 3600

### 略 ###

ゾーン作成後、更新・削除を行いたい場合は次の通り実行可能です。

ゾーンの更新

$zone_uuid = "";
$params = array(
  "description" => "zone description",
  "default_ttl" => 3600
);
$client->put("zones/${zone_uuid}", $params);

ゾーンの削除

$zone_uuid = "";
$client->delete("zones/${zone_uuid}");

削除に成功すると空のオブジェクトが返ります。

object(stdClass)#2 (0) {
}

レコードの操作

続いて、レコードの操作をご紹介します。ゾーンの操作と同じく、一覧取得や作成削除、更新が可能です。 zone_uuidrecord_uuid には、それぞれ操作したいゾーン・レコードにユニークに割り当てられているUUIDをセットしてください。

レコード一覧の取得

$zone_uuid = "";
$client->get("zones/${zone_uuid}/records");

レコードの作成

$zone_uuid = "";
$params = array(
  "name" => "www.example.com",
  "type" => "A",
  "content" => "192.0.2.1",
  "ttl" => 3600
);
$client->post("zones/${zone_uuid}/records", $params);
object(stdClass)#7 (8) {
  ["uuid"]=>
  string(36) "c817a15d-4a90-424f-bd0c-e02366776f95"
  ["name"]=>
  string(15) "www.example.com"
  ### 中略 ###
}

登録ができたらdigをして確認してみましょう。

$ dig www.example.com @ns01.idcfcloud.com

; <<>> DiG 9.8.3-P1 <<>> www.example.com @ns01.idcfcloud.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21044
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.example.com.       IN  A

;; ANSWER SECTION:
www.example.com.    3600    IN  A   192.0.2.1

レコードの取得

$zone_uuid = "";
$record_uuid = "";
$client->get("zones/${zone_uuid}/records/${record_uuid}");

レコードの更新

$zone_uuid = "";
$record_uuid = "";
$params = array(
  "name" => "www.example.com",
  "type" => "A",
  "content" => "192.0.2.1",
  "ttl" => 3600
);
$client->put("zones/${zone_uuid}/records/${record_uuid}", $params);

レコードの削除

$zone_uuid = "";
$record_uuid = "";
$client->delete("zones/${zone_uuid}/records/${record_uuid}");

削除に成功すると空のオブジェクトが返ります。

object(stdClass)#2 (0) {
}

エラー処理

予期しない事象が発生した場合は次のエラーを返します。
\Idcf\Client\Exception\ClientError : 通信に失敗している
\Idcf\Client\Exception\ServerError : ステータスコードが200番台以外
\Idcf\Client\Exception\DecodeError : JSONのデコードに失敗している

さいごに

今回は、idcf/clientを利用したIDCFクラウドDNS/GSLBのAPIを操作する方法をご紹介しました。 機会があれば、インフィニットLB・コンテンツキャッシュ・ビリングAPIの操作方法もご紹介したいと思います。
IDCFクラウドでは、ライブラリや、IDCFクラウドCLIなどの統合CLIツールを公開しています。 引き続きテックブログにて、お客様の自動化に役立つツールや情報をご紹介できればと思います!

Copyright © IDC Frontier Inc.