Управление доменами с Selectel DNS API

Selectel DNS API

В сегодняшней статье мы хотели бы поговорить об услуге, о которой ранее почти ничего не писали. Речь идёт о DNS-хостинге. Зарегистрировав домены в любой сторонней компании (мы услуг по регистрации доменов не оказываем), клиенты могут разместить их на наших NS-серверах совершенно бесплатно.
Наши NS-серверы расположены в Санкт-Петербурге, Москве, Екатеринбурге, Новосибирске, Нью-Йорке, Пало-Альто, Лондоне, Амстердаме и Франкфурте.

Для повышения уровня надёжности и отказоустойчивости системы внедрена технология Anycast (подробнее об этом см. здесь).

Через нашу панель управления можно добавлять и удалять домены, а также добавлять и редактировать записи различных типов.

Сегодня мы представляем вам тестовую версию нашего DNS API для автоматизации работы с доменами и обновления информации о них на наших NS-серверах.

Возможности API

В настоящее время с помощью API можно осуществлять следующие операции:

  • добавление, изменение и удаление доменов;
  • добавление и редактирование ресурсных записей SRV, MX, CNAME, TXT, A, AAAA, NS, SPF (этот тип записей оставлен для совместимости, но к использованию не рекомендуется — см. RFC 7208) PTR (запись SOA создаётся автоматически при добавлении домена, значения MINIMUM и EXPIRE будет равны 86400 и 604800 соответственно);
  • добавление и редактирование обратных записей для IP-адресов;
  • пометка доменов тэгами.

Приступая к работе

Прежде чем начинать работу с API, нужно получить ключ здесь (для этого нужно перейти по указанной ссылке, далее всё просто и интуитивно понятно). Сам API расположен по адресу: https://api.selectel.ru/domains/v1/. Для авторизации ко всем запросам необходимо добавлять заголовок X-Token со значением ранее полученного ключа, например:

curl -H 'X-Token: <ключ>' https://api.selectel.ru/domains/v1/

API возвращает результат в формате JSON. В ответ на запросы на изменение, создание и обновление домена возвращается модель объекта, например:

{
	"user_id": 1,
	"name": "selectel.org",
 	"tags": [],
  	"change_date": null,
  	"create_date": 1427473275,
  	"id": 1
  }

В ответ на запрос об удалении домена будет возвращен ответ с кодом 204 (No Content). В случае ошибки при выполнении запроса будет возвращено её описание в следующем формате:

{
	“error”: “описание ошибки”,
	“code”: 400-599,
	“field”: “в каком поле была допущена ошибка”
}

Основные операции

В рамках этой статьи мы приводим лишь краткое описание операций, которые можно выполнять с помощью нашего API. Прочитать более подробное описание, а также выполнить типовые запросы можно на нашей тестовой площадке (страница сгенерирована с помощью популярного инструмента Swagger). Все адреса в описании запросов указаны относительно https://api.selectel.ru/domains/v1/.

Все данные в запросах передаются и возвращаются в формате JSON.

Операции с доменами

Добавление нового домена POST / Добавляет новый домен; в запросе необходимо передать имя нового домена и содержимое файла BIND-зоны (опционально).

Операция Запрос Описание
Получение списка доменов GET / Возвращает список доменов
Просмотр информации о домене GET /{domain_id} Возвращает сведения об указанном домене (имя, дата создания, дата изменения, тэги, идентификатор пользователя).
Обновление домена PATCH /{domain_id} Под обновлением домена понимается присвоение ему тэга. В запросе нужно передать идентификационный номер домена и идентификационные номера тэгов, которыми требуется отметить этот домен. Возвращает информацию об обновленном домене (имя, дата создания, дата изменения, тэги, идентификатор пользователя).
Удаление домена DELETE /{domain_id} Удаляет указанный домен; в случае успешного удаления будет возвращён ответ с кодом 204 (No Content).

Операции с ресурсными записями

Добавление новой ресурсной записи PUT /{domain_id}/records Добавляет новую ресурсную запись. В запросе нужно обязательно передать идентификационный номер номер записи, её имя и тип. Для каждого типа записей в запрос включаются также индивидуальные параметры (подробнее см. на тестовой странице API).

Операция Запрос Описание
Получение списка ресурсных записей для указанного домена GET /{domain_id}/records/ Возвращает сведения о ресурсных записях для указанного домена (идентификатор записи, имя, тип, время жизни, дату создания, дату изменения).
Обновление ресурсной записи PUT /{domain_id}/records/{record_id} Под обновлением записи понимается изменение её параметров. В запросе обязательно нужно передать идентификационный номер домена, имя записи, её идентификационный номер и тип. Для каждого типа записей в запрос включаются также индивидуальные параметры (подробнее см. на тестовой странице API).
Удаление ресурсной записи DELETE /{domain_id}/records/{record_id} Удаляет указанную ресурсную запись; в случае успешного удаления будет возвращён ответ с кодом 204 (No Content).

Операции с обратными записями

Добавление новой ресурсной записи PUT /ptr Возвращает информацию обо всех имеющихся обратных записях (идентификатор записи, обратный адрес, имя домена, идентификатор пользователя), включая новую.

Операция Запрос Описание
Получение списка обратных записей для указанного домена GET /{domain_id}/ptr/ Возвращает сведения обратных записях для указанного домена (идентификатор записи, имя, тип, время жизни, дату создания, дату изменения).
Просмотр информации о обратной записи GET /ptr/{ptr_id} Возвращает информацию об указанной обратной записи (идентификатор записи, обратный адрес, имя домена, идентификатор пользователя).
Обновление обратной записи PUT /ptr/{ptr_id} Под обновлением обратной записи понимается изменение её параметров. В запросе нужно передать идентификационный номер записи, IP-адрес и имя домена.
Удаление ресурсной записи DELETE /ptr/{ptr_id} Удаляет указанную обратную запись; в случае успешного удаления будет возвращён ответ с кодом 204 (No Content).

Операции с тэгами

Многие из наших клиентов размещают у нас сотни и даже тысячи доменов. Чтобы упростить управление таким большим количеством доменов, в нашем API предусмотрена возможность добавления тэгов. С помощью тэгов можно структурировать список имеющихся доменов, разбив его на группы. Это позволяет ускорить поиск нужного домена, а также автоматизировать массовые операции с доменами. Основные операции с тэгами описаны в таблице ниже.

Операция Запрос Описание
Получение списка тэгов для указанного домена GET /tags/ Возвращает список тэгов, содержащий имена и идентификаторы тэгов, а также список отмеченных тэгами доменов.
Получение списка доменов по тэгу GET /tags/{tag_id} Возвращает список доменов, отмеченных указанным тэгом
Добавление нового тэга POST /tags/ Возвращает созданный тэг.
Обновление тэга PUT /tags/{tag_id} Под обновлением тэга понимается изменение его имени. В запросе нужно передать идентификационный номер тэга и его новое имя.
Удаление тэга DELETE /tags/{tag_id} Удаляет указанный тэг; в случае успешного удаления будет возвращён ответ с кодом 204 (No Content).

Скрипт для загрузки BIND-зоны

Недавно один из наших клиентов изъявил желание перенести к нам свои домены. Сложность ситуации заключалась в том, что нужно было перенести более
1000 А-записей. Понятно, что делать всё это вручную крайне сложно и неудобно. После долгих обсуждений мы написали скрипт для автоматизации переноса. Cкачать его можно здесь .

Чтобы загрузить BIND-зону, достаточно ввести команду вида:

$ bind_upload.py [-h] --key <key> --name <name> --zone <zone>

В качестве значения параметра −−key указываем ключ доступа к API, параметра −−name — имя домена, который будет добавлен. В параметре −−zone передаём путь к файлу зоны.

Скрипт возвращает информацию о добавленном домене в формате JSON. Если при добавлении какой-либо ресурсной записи возникают ошибки, информация о них будет включена в ответ.

Заключение

Как уже было сказано выше, наш DNS API сейчас функционирует в тестовом режиме. Сообщить обо всех замеченных ошибках, а также высказать пожелания и предложения по улучшению API, можно в комментариях к этому посту. Наиболее интересные идеи мы примем к сведению и постараемся реализовать.