プログラマならば使うべき:GitHubでDNSゾーン管理ができる Luadns


さきほどTwitterで流れてきたのでたまたま見つけたのですが、LuadnsというDNSホスティングサービスがかなり凄いです。Luaスクリプトでゾーン設定を書いてGitHubにpushするだけで即座にDNS設定ができてしまいます。

DNSホスティングサービスというと、多くの場合ブラウザを開いてログインしてコントロールパネルからポチポチと入力して送信して、、、という手順を踏まないと設定が更新できないわけですが、Luadnsは違います。example.com.lua ファイルをEmacsやVim(やその他エディタ)で開いてLuaスクリプトを書き、git commitgit push で設定が完了してしまいます。push にフックして Luadns の設定が自動的に更新されます。 マウスまで手を動かすのが無限に遠く感じられるプログラマにとっては、これほど素早く簡単にDNSが設定できるのはかなり魅力的ではないでしょうか。

更に、設定がLuaスクリプトで書けるということは、即ちプログラムで設定を生成するなんてことも簡単にできてしまいます。 hoge000hoge001hoge002hoge003、、、のような大量のホストの設定を行う場合には、Webベースのコントロールパネルで設定するというのは有り得ない話ですが、Luadnsならば設定テンプレートの関数を書いてループを回すだけでスマートに解決可能です。

3ドメイン(30レコード)までは無料でホストできるので、個人でVPSなどを運用している人にもうってつけではないでしょうか。

Luadnsを使い始める

プラン選択のページから希望する価格のプランを選んで、希望するユーザ名、パスワード、メールアドレスを入力するだけで登録が完了します。有料プランの場合には、そのまま支払いもおこなってしまいましょう。

その後、GitHubにレポジトリを作成し、luadnsユーザに読み取り権限を与え(公開レポジトリの場合はそのままでOK)、LuadnsのAccountページにGitHubレポジトリのURLを設定すれば基本的な設定は完了です。 公開レポジトリのURLを設定する際には、間違ってプライベートな方のURL(git@github.com:/…)を設定しないよう注意しましょう。

更に便利にするために、GitHubのフックを設定することができます。作成したGitHubレポジトリのページから Admin → Server Hooks → Post-Receive URL とリンクを辿って、Luadnsの通知用URL(Domainsページ の下に書いてある https://api.luadns.com/notifications/API-TOKEN/push)を設定すればOK。

このブログのあるhayamiz.comのDNSはVALUE-DOMAINでホスティングしているのですが、試しにLuadnsに乗り換えようかと https://github.com/hayamiz/luadnsconf で色々設定を試しています。

Luadnsでドメインの基本的な設定をする

まず、ドメイン名+”.lua” というファイル名でレポジトリ直下にファイルを作成します。 たとえば、hayamiz.com のゾーン設定ファイルは hayamiz.com.lua です。 このように、基本的には1ドメイン1ファイルで管理するのが最も基本的な方法のようです。

Luadnsでは、SOA、A、NS、MX、CNAME、TXTレコードに対応しています。 それぞれのレコード設定は、Luaの対応する関数を呼び出すことで行います。

SOAレコード

Luadnsのシステムにより自動設定されるため記述する必要はありません。

Aレコード

-- @name  = domain name
-- @ip    = IPv4 address
-- @ttl   = TTL (seconds)
a(name, ip, ttl)

Aレコードは、”a”という関数を呼び出すことで設定できます。

-- 例: hayamiz.com のIPアドレスを59.106.186.140に設定する
a("hayamiz.com", "59.106.186.140")

また hayamiz.com.lua に記述する場合には、”_a” という変数に予めドメイン名が文字列として代入されているため

a(_a, "59.106.186.140")

と書くこともできます。

NSレコード

-- @name    = domain name
-- @server  = name server (fqdn)
-- @ttl   = TTL(seconds)
ns(name, server, ttl)

ns1.luadns.netns4.luadns.net のNSレコードは自動的に挿入されるため、多くの場合は特に設定する必要はないと思います。

MXレコード

-- @name      = domain name
-- @exchanger = mail exchanger(fqdn)
-- @prio      = priority
-- @ttl       = TTL (seconds)
mx(name, exchanger, prio, ttl)

CNAMEレコード

-- @name    = domain name
-- @alias   = alias (fqdn)
-- @ttl     = TTL (seconds)
cname(name, alias, ttl)

TXTレコード

-- @name    = domain name
-- @string  = string
-- @ttl     = TTL(seconds)
txt(name, string, ttl)

Luaスクリプトの書き方

Luaを知らなくとも、簡単なゾーン設定を書くだけであれば下記のルールを知っているだけで十分でしょう。

  • コメント:ハイフン2つ(–)から始まる行はコメントとみなされる
  • 文字列の結合:Lua組み込みの “..” 演算子か、Luadns組み込み関数の concat を使う
    • 例: "www." .. "example.com" => "www.example.com"
    • 例: concat("www", "example.com") => "www.example.com"
    • Luadnsの提供するconcat関数は、間にドットを挟んでくれるのでサブドメイン名を繋げるのに便利です

ドメインエイリアス機能

example.com、example.org、example.netなどの複数のドメインに対して全く同じ設定を適用したい場合、ドメインエイリアス機能を利用することができます。 example.com.lua にゾーン設定を書いた後に、example.com.clones というファイルを作成して下記の内容を書いておくだけで設定は完了です。

example.org
example.net

テンプレート機能

全く同じではないけれど、ほとんど同じな設定を使いまわす際には、テンプレート機能が使えます。 テンプレート機能といっても、実際にはドメイン名など必要な情報を引数として受け取って、上記のAレコードやMXレコードなどを設定する関数を呼ぶ関数を定義するだけです。プログラマブルな設定ファイル素晴らしい。 テンプレート用の関数は templates.lua に記述しておきます。

例:Google Apps を hayamiz.com のホスティングに使う

--     
-- File: templates.lua
--

function google_app(domain)
  -- Configure mail exchangers
  mx(domain, "aspmx.l.google.com", 5)
  mx(domain, "alt1.aspmx.l.google.com", 10)
  mx(domain, "alt2.aspmx.l.google.com", 10)
  mx(domain, "aspmx2.l.google.com", 20)
  mx(domain, "aspmx3.l.google.com", 20)

  -- Additional Google Apps records
  cname(concat("calendar", domain), "ghs.google.com")
  cname(concat("docs", domain), "ghs.google.com")
  cname(concat("mail", domain), "ghs.google.com")
  cname(concat("sites", domain), "ghs.google.com")

  -- Configure SPF
  txt(domain, "v=spf1 a mx include:_spf.google.com ~all")
end

-- File: example.com.lua
-- Variable _a is replaced with zone name by Luadns
-- _a = "example.com"

-- A records
a(_a, "1.2.3.4")

-- CNAME records
cname("www", _a)
cname("ftp", _a)

-- Templates
google_app(_a)

Comments

Powered by Facebook Comments

コメントは受け付けていません。