ELB を使って STNS サーバを冗長化する

Posted on

徐々に盛り上がりつつある STNS (Simple TOML Name Service)、みなさんはご存知ですか?

freee もユーザー管理には苦労していたので、「乗るしかない このビッグウェーブに」という感じで STNS への移行を進めています。

STNS に限らずユーザーを集中管理するときに重要になるのが冗長化です。集中管理することで得られるメリットが多い反面、そこが落ちるとすべてのサーバにログインできなくなるからです。

冗長化させやすい STNS サーバ

STNS はサーバとクライアント間の通信をステートレスな HTTP で行っています。具体的には /user/name/manabusakai のようなリクエストに対して、ユーザー情報の含まれた JSON が返ってきます。

{
  "metadata": {
    "api_version": 2.1,
    "result": "success",
    "min_id": 2000
  },
  "items": {
    "manabusakai": {
      "id": 2000,
      "password": "",
      "group_id": 2000,
      "directory": "",
      "shell": "",
      "gecos": "",
      "keys": [
        "ssh-rsa ..."
      ],
      "link_users": null
    }
  }
}

状態を持たないステートレスな構成なので、Web サーバと同じようにスケールアウトさせるだけで冗長化できるというメリットがあります。冗長化させるのが面倒で単一障害点になりがちな認証サーバですが、STNS なら手間なくシンプルに解決できます。

ELB を使って STNS サーバを冗長化する

スケールアウトで冗長化できることを確認するために、前段に ELB を置いて複数台の STNS サーバにリクエストを振ってみます。

まず Internal ELB を作ります。 STNS は 1104 ポートを使うので、セキュリティグループも忘れずに変更してください。

STNS 用の Internal ELB

STNS のソースコードを読むと /healthcheck というパスが用意されているので、ELB のヘルスチェックはここに向けます。

最後にクライアント側が問い合わせする先を Internal ELB に向けます。 /etc/stns/libnss_stns.confapi_end_point を変更します。

api_end_point = ["http://internal-stns-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com:1104/v2"]

user = "xxxx"
password = "xxxx"

wrapper_path = "/usr/local/bin/stns-query-wrapper"
chain_ssh_wrapper = "/usr/libexec/openssh/ssh-ldap-wrapper"
request_timeout = 3

ELB に STNS サーバを何台か入れてみて、クライアントからユーザーが参照できれば OK です。 STNS サーバ間で設定が違っていると大変なので、あらかじめ Chef や Ansible でプロビジョニングできる状態にしておくと良さそうです。

応用編

ELB を使って冗長化できることが確認できたので、いろいろと応用することができそうです。

  • Multi AZ 構成にして耐障害性を上げる
  • Auto Scaling 構成にして最低 N 台をキープする
  • 昼と夜でサーバ台数を増減させてコストを削減する
  • ALB と ECS で STNS サーバをコンテナ化する

STNS は夢が広がりますね!

まとめ

STNS はスケールアウト戦略が取れるので、手間がかからず運用がとても楽になります。 LDAP サーバの冗長化で苦労している人は、ぜひ STNS を試してみてはいかがでしょうか。

STNS はユーザー管理のデファクトスタンダードになりそうなセンスの良さを感じます。これからに期待です!