2016-04-25

PointDNSのAPIをforce.comから叩く

PointDNSはDNSのサービスで、HerokuでAddonとしても提供されています。 今回は、ApexからPointDNSのAPIを叩いてDNSレコードの追加、変更を自動化できるようにします。

APIの認証はBasic認証で、ユーザ名/パスワードは以下のように取得します。

Usersタブでユーザ名(=メールアドレス)を取得

pointdns_username

AccountタブでAPIキー(=パスワード)を取得

pointdns_password

あとはリファレンスにしたがってコールするだけ。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レコードを登録してあげます。

pointdns_delegate

登録するNSレコードはPointDNSで登録されたNSレコードになります。

pointdns_nsrecords

参考URL

このエントリーをはてなブックマークに追加