元々私、オンプレの環境でエンジニアとして育ったこともあり、 IPアドレスに対して親近感がありました。悪く言えば、使うのが当たり前という先入観です。 ただ、最近気づいたことが、 「名前解決をもっと活用すると便利になる」という点です。

IPアドレスの上に一枚Hostnameを入れることで、疎結合になります。 そして具象化することにより、意味を伝えることが出来るようになります。

具体例をバンバン上げて解説していきたいと思います。

開発サーバへ意味を含めたドメイン名を設定する

AWSを想定します。たとえば開発用に外部公開されているSTGがあったとします。まだ名称は決まっていません。 たいていElasticIPなどでIP固定にさせているかもしれまん。 Route53等のDNSサービスでPublic向けのAレコードを以下のように設定させておくと便利です。

//IPは適当です
54.178.158.136 centos01.rkszdev.net
54.178.158.136 centos02.rkszdev.net
54.178.158.137 centos03.rkszdev.net
54.178.158.138 ubuntu01.rkszdev.net
54.178.158.139 ubuntu02.rkszdev.net

サブドメイン名の所で、centosなどインスタンス名の詳細を分かるようにします。 これによりただの数字の羅列から実体のサーバに変わります。

centos01使いますね」のメッセージだけで、AWSのどのサーバを使うのかを 開発者同士で簡単に周知出来るようになります。

応用編としては、ubuntu01micro.rkszdev.netなどもう少し情報を含めることも出来るかと思います。 ただ、あまりこれを増やしすぎてしまうと、逆にそれを推測できなくなってしまうため、 ある程度シンプルにして置くほうがベターです。

社内ツールにドメインを設定する

54.178.158.136 git.rkszdev.net
54.178.158.137 jenkins.rkszdev.net

これは定番かもしれませんが、Gitリポジトリなどあれば、それを設定していまいます。 メンバー間の説明が用意になります。 社内ツールの移行も、DNS側でIPアドレスを付け替えるだけでいいので、手間が少ないです。 Gitリポジトリサーバを移動しただけで、メンバーの全てのoriginを変えてもらうは さすがに運用的にも非効率かと思います。

Chefノードに活用する

基本的にSSH接続などと同じ原理ですが、Chefノードなどにもドメイン名を活用させます。 上記の原則を利用し、knife prepareの段階で、ドメイン名に対して実行すれば、下記のように準備されるはずです。

{chef-root}/nodes/ubuntu01.rkszdev.net.json
{chef-root}/nodes/ubuntu02.rkszdev.net.json

このようにすれば、「ubuntuサーバに実行するのか」などファイル名だけで情報を 送ることが出来ます。非常にメリットが大きいです。

Nginx/Apacheのバックエンド記述に活用する

名前の設定でドメイン名という概念を利用します。

たとえば、rickynewsをNginxでL7ロードバランスするとします。 Upstream記述をしますが、そこでドメイン名も活用出来ます。

upstream www.rickynews.com {
  server 54.178.158.137;
  server 54.178.158.138;
}

ちなみにupstreamの所はGitのリポジトリ名にする戦略もあると思います。 以前は私は上記ポリシーを適応していました。 全体ポリシー統一が出来れば問題なさそうです。

ローカルSSH接続管理 (~/ssh/config)

Mac等でSSH接続を管理する場合、~/.ssh/configに更新していくのは定番だと思います。 ここでもHost名としてドメイン名の形式で記述をします。

HOST bitbucket.com
  IdentityFile ~/.ssh/credentials/rksz-production-key.pem
HOST *.rksz-dev.net
  IdentityFile ~/.ssh/credentials/rksz-test-key.pem
HOST centos*.rksz-dev.net
  User centos
HOST ubuntu*.rksz-dev.net
  User ubuntu

ドメイン名ドリブンです。ssh configではワイルドカード記述も利用出来るため、 インスタンスごとのユーザ切り替えで積極的に活用します。

上記のようにsshconfigを設定すれば、 下記でスムーズにインスタンスにアクセスすることが出来るようになります。

$ ssh ubuntu01.rksz-dev.net

ポイントとしては、IPアドレスを書かなくてもいいところは書かないことです。 DNSの名前解決に委ねたほうが、比較的トラブルは起きにくいです。

Peco連携

SSH接続をドメイン名ドリブンにすることでPecoと連携がスムーズになります。

sshpeco () {
    peco_query=$@
    target=$(grep -iE "^host[[:space:]]+[^*]" ~/.ssh/config|grep -v "*"|peco --query="$peco_query"|awk "{print \$2}")
    if [ ! -z $target ]
    then
        env TERM=xterm ssh $target
    fi
}

bashrc等に上記を仕込んでおけば、かなりFuzzyにリモートサーバへアクセス可能になります。

$ sshpeco git rksz
// ssh git.rkzs-dev.net が発動し、アクセスが出来るようになります

プライベートIPアドレスや、DNSに対するAdmin権限が無い方は、 手元のssh configさえ記載しておけばひとまず恩恵はさずかれます。

HOST ubuntu01.rksz-dev.local
  HostName 192.168.33.104 
  User     vagrant
  IdentityFile ~/.ssh/credentials/insecure_private_key