それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

cloudflare のレコードをphpから処理

cloudflare のレコードをphpから処理

cloudflare のAPIを使う。

php が手軽かなと思って選んだ。

インストール

composer require cloudflare/sdk

初期化例。

API-TOKENを使う(最近はこっち)

<?php 
$api_token = 'P-xxxxxxxxxxxxxxxx';
$token   = new \Cloudflare\API\Auth\APIToken($api_token);
$adapter = new \Cloudflare\API\Adapter\Guzzle($token);
$zone = new \Cloudflare\API\Endpoints\Zones($adapter);
$zone_id = $zone->getZoneID('example.tld');
$dns = new \Cloudflare\API\Endpoints\DNS($adapter);

API-キーを使う(まえはこっちだった、今でももごく)

<?php 
$key     = new \Cloudflare\API\Auth\APIKey($mail, $api_key);
$adapter = new \Cloudflare\API\Adapter\Guzzle($token);
$user    = new \Cloudflare\API\Endpoints\User($adapter);
$ret =  $user->getUserID();

APIキーは何でも出来るので、機能を限定したAPIトークンを使うのがベター

APIトークンの発行

API TOKENでユーザーにアクセスするには、User/UserDetailsへのアクセスを許可する必要がある。

ユーザーを許可しないと、次のサンプルコマンドが動かない。

$ret =  $user->getUserID();

これに気づかないと、サンプルが動かないとハマることになる。

サンプル・ゾーンに含まれる。DNSレコードを取り出す

ゾーンに含まれるDNSレコードを取り出す。

<?php 
$api_token = 'P-81xxxxxxxxxxxxx';
$token   = new \Cloudflare\API\Auth\APIToken($api_token);
$adapter = new \Cloudflare\API\Adapter\Guzzle($token);
$zone = new \Cloudflare\API\Endpoints\Zones($adapter);
$zone_id = $zone->getZoneID('example.tld');
$dns = new \Cloudflare\API\Endpoints\DNS($adapter);
$ret = $dns->listRecords(...['zoneID'=>$zone_id,'perPage'=>100]);
foreach ( $ret->result as $item ) {
 echo $item->name.PHP_EOL;
}

サンプル DNSレコードの詳細を確認する。

ゾーンー>ドメインー>DNSレコードと辿っていて、DNSのレコードをを取り出す。

ここで、レコードIDを発見すれば、あとはすきに操作できる。

<?php 
$api_token = 'P-81xxxxxxxxxxxxx';
$token   = new \Cloudflare\API\Auth\APIToken($api_token);
$adapter = new \Cloudflare\API\Adapter\Guzzle($token);
$zone = new \Cloudflare\API\Endpoints\Zones($adapter);
$zone_id = $zone->getZoneID('example.tld');
$dns = new \Cloudflare\API\Endpoints\DNS($adapter);
$record_id = $dns->getRecordID(...['zoneID'=>$zone_id,'name'=>$name]);
$ret = $dns->getRecordDetails($zone_id,$record_id);

ドメインサブドメイン)の追加

ドメイン名を追加するときは、次のようにコマンドを掛けば良い。

<?php
$name = 'my.respose.example.tld'
$dns->addRecord(...['zoneID'=>$z_id,'type'=>'A',          'name'=>$name,'content'=>'10.0.0.1']);
$dns->addRecord(...['zoneID'=>$z_id,'type'=>'CNAME','name'=>$name,'content'=>'example.tld' ]);
$dns->addRecord(...['zoneID'=>$z_id,'type'=>'TXT',      'name'=>$name,'content'=>'sample',  'proxied'=>false]);

ただし、TXT レコード追加するときは、proxied=false をつけないとValidationで弾かれる。(省略時デフォルト true で、TXTはTrue に不可のため。これはCloudflare側のValidationがバグってる。)

<?php

$dns->addRecord(...[
  'zoneID'=>$z_id,
  'type'=>'TXT',
  'name'=>$name,
  'content'=>'sample',
  'proxied'=>false  # ← TXT のとき、ココを忘れないようにしてください。
]);

レコードを消す

プログラミングして実験をしているとき、ゴミレコードを大量に作ってしまった場合など、まとめて削除する。

$dns->deleteRecord($zone_id,$record_id); を使う。deleteRecord メソッドで消すことが出来るので、listRecordの結果からrecord_idを取り出して、まとめて消す。

<?php

$api_token = 'YOUR_TOKEN_ID';
$base_domain = 'example.tld';
$token = new \Cloudflare\API\Auth\APIToken( $api_token );
$adapter = new \Cloudflare\API\Adapter\Guzzle( $token );
$zone = new \Cloudflare\API\Endpoints\Zones( $adapter );
$zone_id = $zone->getZoneID( $base_domain  );
$dns = new \Cloudflare\API\Endpoints\DNS( $adapter );

$ret = $dns->listRecords(...['zoneID'=>$zone_id,'perPage'=>100]);
foreach ( $ret->result as $item ) {
  $name = $item->name;
  if (preg_match('/php-le-test|challenge/', $name)){
    echo "{$item->id} {$item->name}".PHP_EOL;
    $dns->deleteRecord($zone_id,$item->id);
  }
}

2023-02-14

追記。TXT レコードが追加できないので調べた。

2023-10-31

追記。DELETEをまとめて行う方法を追記。