ELB を使って STNS サーバを冗長化する
Posted on
- #stns
徐々に盛り上がりつつある 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 のソースコードを読むと /healthcheck
というパスが用意されているので、ELB のヘルスチェックはここに向けます。
最後にクライアント側が問い合わせする先を Internal ELB に向けます。 /etc/stns/libnss_stns.conf
の api_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 はユーザー管理のデファクトスタンダードになりそうなセンスの良さを感じます。これからに期待です!