サーバの uid 管理を Fusion Tables から社内人事データベースシステムに移管した

こんにちは!技術部の小池です。

この記事は Tech Kayac Advent Calendar Migration Track 7日目の記事です。すっかり年の瀬になりましたがみなさまいかがお過ごしでしょうか〜。僕は肝臓の声なき声に耳を傾けながら人生を歩んでいこうというお気持ちで日々過ごしています。

今回は Linux サーバの uid 管理を Fusion Tables から社内人事データベースシステムの areus に移管した話です。

カヤックにおける uid 管理

これまでカヤックでは Linux サーバのローカルアカウントの uid を Fusion Tables で一元管理していました。入社手続きの中で発行された G Suite アカウント情報を検知して uid を発行する GAS がデイリーで動いており、入社後に実際にサーバに接続する際には既に uid が発番されているという状態になっていました。

また、社外のパートナーさん等もサーバに接続するため必要に応じて社員以外の方用の uid を発行する必要があります。こちらは Google フォームで uid 発行を申請し、フォーム送信をトリガとして動く GAS で uid を発番する仕組みになっています。

これらの uid は Slack の Outgoing Webhooks によって叩かれる AWS Lambda 経由で取得することができます。uid-ko さんという素敵な女性が uid を答えてくれます。

f:id:tamiflu75:20191206125928p:plain

ここで取得した uid を Chef の user resource として設定してサーバのローカルアカウントを作成する、というような感じで長らく平穏に運用していました。

ところが昨年12月のある日、 Google Fusion Tables のご提供終了のお知らせ が流れ、2019年12月3日(もう過ぎましたね!)までに移管をしなければならなくなりました。

移行先どうするか〜スプレッドシートか??みたいな話で盛り上がってる中で白羽の矢が立ったのが areus でした。

社内人事データベースシステム areus

areus は従業員情報を一元管理する社内人事データベースシステムです。データストアには MySQL 5.7 を使っており、JSON 型を用いて従業員情報を格納しています。JSON は以下のような構造になっています。

{
  "data": {
    "emp_status": "employed",
    "entered_at": "2017-03-09",
    "slack_id": "xxxx",
    ...
  },
  "meta": {
    "id": "xxxx"
  }
}

人事や労務などの管理業務に必要な情報はもちろんのこと、Slack や GitHub のアカウント情報、それからカヤックはあだ名をつける文化があるのであだ名なども格納されています。本名と Slack の名前と GitHub の名前とあだ名が別々になっていて覚えられない!というようなケースに対しても一覧にしてスプレッドシートの名簿として出力するなんてことが可能です。便利ですね。

meta 以下に利用者が直接操作しない管理対象外のデータ、data 以下に管理対象のデータがつらつらと格納されていきます。なんでもかんでも data 以下に突っ込むと破綻するのでデータのキー名と型を管理画面で定義し、定義済みのもののみ格納するようになっています。管理画面で uid を数値型として格納するよう定義し、uid を格納すると以下のようになります。

{
  "data": {
    "emp_status": "employed",
    "entered_at": "2017-03-09",
    "slack_id": "xxxx",
    "uid": 1091,
    ...
  },
  "meta": {
    "id": "xxxx"
  }
}

これなら Fusion Tables で管理されている uid を移行できそうですね。

移管

以下のような要件が求められていました。

- メールアドレスなどユニークな情報を用いて uid を Slack から取得できる
- 新たに入社した社員に対して自動で uid を発番できる
- 社員以外の方用に Google フォームの送信をトリガに uid を発番できる

Slack 連携

旧 uid 管理システムでは Slack の Outgoing Webhooks を使っていましたが、現在は deprecated になっているので Slack App として作り直しました。

以下ドキュメントからの引用です。

You're reading this because you're looking for info on legacy custom integrations - an outdated way for teams to integrate with Slack. These integrations lack newer features and they will be deprecated and possibly removed in the future. We do not recommend their use.

旧来の Outgoing Webhooks では全 public channel の投稿にフックすることができましたが、Slack App では Bot ユーザを channel に追加しないと動作しないようになっておりその点のみ注意が必要です。しかしながら安全面を考えれば妥当な変更だなあと思ってます。

新たに入社した社員に対しての自動発番

カヤックでは入社手続きの中で SmartHR に従業員登録をしてもらうというプロセスが存在します。ちょうど areus は SmartHR からの Webhook でデータの同期をしていることから、SmartHR から同期されているけど uid が未発番の従業員に対して uid を発番する 、というバッチ処理に切り替えました。ECS の Scheduled Tasks で深夜に動くようになっています。G Suite のアカウント発行よりも SmartHR の従業員登録の方が早いのでより早い段階で uid が発番されるようになりました。

Google フォーム送信トリガによる発番

これまでは GAS が uid を発番してそのまま Fusion Tables に保存していましたが、areus に API を用意して API 側で発番するように変更しました。uid を発番するのは本来の areus の関心事ではないのでここは将来 Lambda か何かで発番するよう変更しようと思っています。

ここまでの作業とデータの名寄せとマイグレーションを週1ぐらいのペースで進めていって2ヶ月くらいで移管しました。移管日は11月の最終週だったのでなんとか間に合ってよかったなあいう感じです。

おわりに

実は areus は MVP 版なのでミニマムでとりあえず動いているという状態です。来年に areus の本プロダクションの開発がはじまるのでまたどこかでその話をお届けできれば良いですね〜。その際は uid の発番を API で処理しているところも修正が入る予定です。従業員情報が一元管理されていてシステムで引ける状態になっているとあちこちのシステムやツールで連携したいみたいな話になっており、本プロダクションが待ち遠しい次第です。

Fusion Tables 今までありがとう!みなさま良いお年をお迎えくださいませ〜。

明日 12/8 は acidlemon こと川添さんGOPATHを掃除してGo Modulesに移行しよう です!お楽しみに!