PointDNSはDNSのサービスで、HerokuでAddonとしても提供されています。 今回は、ApexからPointDNSのAPIを叩いてDNSレコードの追加、変更を自動化できるようにします。
APIの認証はBasic認証で、ユーザ名/パスワードは以下のように取得します。
Usersタブでユーザ名(=メールアドレス)を取得
AccountタブでAPIキー(=パスワード)を取得
あとはリファレンスにしたがってコールするだけ。Apexだとこんな感じで書いていけばOK。リモートサイトの設定も忘れずに。
public with sharing class PointDNSClient {
private static final String POINT_DNS_BASE_URI = 'https://pointhq.com';
private static final String ADD_RECORD_PATH = '/zones/{zone_name}/records';
private String username;
private String password;
public PointDNSClient(String username, String password) {
this.username = username;
this.password = password;
}
public String setRecord(String zone, String recordType, String name, String data, Integer ttl) {
HttpRequest req = new HttpRequest();
req.setHeader('Content-type', 'application/json');
req.setHeader('Authorization', 'Basic ' + EncodingUtil.base64Encode(Blob.valueOf(this.username + ':' + this.password)));
req.setTimeout(60000);
String jsonBody = Json.serialize(new Map<String, Object> {
'zone_record' => new Map<String, Object> {
'name' => name,
'record_type' => recordType,
'data' => data,
'ttl' => ttl
}
});
req.setHeader('Content-Length', String.valueOf(jsonBody.length()));
req.setEndpoint(POINT_DNS_BASE_URI + ADD_RECORD_PATH.replace('{zone_name}', zone));
req.setMethod('POST');
req.setBody(jsonBody);
Http http = new Http();
HTTPResponse res = http.send(req);
return res.getBody();
}
public List<Map<String, Object>> getRecords(String zone) {
HttpRequest req = new HttpRequest();
req.setHeader('Authorization', 'Basic ' + EncodingUtil.base64Encode(Blob.valueOf(this.username + ':' + this.password)));
req.setTimeout(60000);
req.setEndpoint(POINT_DNS_BASE_URI + DNS_RECORD_PATH.replace('{zone_name}', zone));
req.setMethod('GET');
Http http = new Http();
HTTPResponse res = http.send(req);
String resBody = res.getBody();
List<Object> results = (List<Object>)JSON.deserializeUntyped(resBody);
List<Map<String, Object>> records = new List<Map<String, Object>>();
for (Object result : results) {
records.add((Map<String, Object>)result);
}
return records;
}
}
あとはこんな感じで動かすだけ。
PointDNSClient client = new PointDNSClient('{username}', '{password}');
String resBody = client.setRecord(
'pointdns.freedom-man.com',
'A',
'apex',
'27.120.85.234',
3600
);
System.debug(client.getRecords('pointdns.freedom-man.com'));
補足
今回はRoute53で管理されているfreedom-man.comドメインからpointdnsのサブドメインを切って、それをPointDNSに委譲する形で検証しました。PointDNSでゾーンを登録したら、Route53に以下のようにNSレコードを登録してあげます。登録するNSレコードはPointDNSで登録されたNSレコードになります。