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をまとめて行う方法を追記。