はじめに
この記事はLinkbal Advent Calendar 2018の25日目の記事です。技術部の船寄が担当させて頂きます。
🎄🔔聖夜の更新となりました。皆さまいかがお過ごしでしょうか。🤶🎄
今回は、今年の年始にリリースを行った共通認証基盤(リンクバル ID)についてご紹介したいと思います。
共通認証基盤(リンクバル ID)とは
OpenID Connectを利用した、共通認証基盤です。よく、ほげほげ ID
というフレーズを目にすることがあると思いますが、それですね。
1つのIDで複数サービスを利用できるようにするものです。
現在リンクバルでは、machiconJAPAN、CoupLink、KOIGAKUの3サービスで利用されております。
主な機能について
主に下記の機能を実装しています。
- OpenID Provider(OP)としての機能
- Authorization Endpoint
- Token Endpoint
- UserInfo Endpoint
- ユーザ情報の変更(一部)
- パスワードのリセット機能
- メッセージ送信(メール、SMS)
- システム管理者用管理画面
OpenID ProviderのOSS利用
OpenID Provider
に関してはこちらのOSSを使わせていただきました。ory/hydra
OpenID Provider(OP)としての機能を提供してくれるものです。ただし、Authorization Endpointの認証についての機能や、ユーザ情報の保持については自分で実装する必要があります。
もう少し具体的には、下記につて自前で実装する必要がありました。(実装しました。)
- ログイン機能
- 新規登録機能
- プロフィール登録機能
※もちろんUserInfo Endpoint
もhydraには含まれておらず、自前で実装しました。
アプリケーションの分割
実装する機能から、マイクロサービス風に、下記のようにアプリケーションを分割して構築することにしました。
- OP
- hydraそのもの
- IDP
- 新規登録、ログイン、パスワード再発行、ユーザ情報更新などの機能を提供するアプリケーションです。
- UserInfo
- Userinfoエンドポイント
- Message
- メール、SMS送信
- Admin
- 管理画面(CS対応用)
開発言語/ライブラリなど
- golang(go1.9.1)
- gin-gonic/gin
- go-xorm/xorm
- gorilla/securecookie
- gorilla/sessions
- validator.v9
- gorilla/csrf
- gorilla/schema
- spf13/viper
- ory/hydra
- GoogleCloudPlatform/cloudsql-proxy
golangを当社で初めて導入しました。hydra以外に、特に珍しいパッケージなどは利用しておりません。
インフラについて
Google Cloud Platformを利用しております。今回はGoogle Kubernetes Engineを採用し、コンテナでの運用に挑戦しました。
Ingressを利用し、ルーティングルールを設定することにより、単一のロードバランサとパブリックIPアドレスで、複数のアプリケーションを運用しております。
データベースはCloudSQL(MySQL5.7)を利用しています。全てのアプリケーションから単一のデータベースを利用する設計としております。
また、Stackdriver Loggingに全てのログを出力しています。
dockerイメージのビルドとデプロイ
ビルド
Cloud Buildを利用し、dockerイメージをビルドしています。Cloud Buildのトリガーにgithubリポジトリへの タグへの push
をトリガーとして登録しております。
プッシュされたタグをリリースする運用です。
ビルドする際に複数のアプリケーションを1つのイメージの中にまとめています。
デプロイ
kubectl
をでデプロイしています。具体的には下記のようなイメージです。
RELEASE_TAG=$1
sed -e "s/<TAG>/$RELEASE_TAG/g" ./application.yml | kubectl apply -f -
# application.ymlの一部
spec:
containers:
- name: userinfo
image: hoge.gcr.io/linkbal/id:<TAG>
モニタリング
Datadogを利用してモニタリングを行っております。
また、アプリケーションエラーの検知に関してはStackDriver Loggingに出力されたerrorログを検知し、Slackへ通知する仕組みとなっています。
開発環境
docker-composeを利用して環境を構築するようにしています。
複数サービスで利用される基盤であることから、開発者がなるべく簡単に環境を再現できるようにしております。
リポジトリをcloneし、docker-compose up
を叩くだけで初期マスタの投入を含めて環境構築をしてくれます。
運用後のトラブル
hydraの中で適切にindexが貼られておらず、データベースに深刻な負荷を与える事案が発生しました。
slowqeryを確認すると、token周りのテーブルで適切にindexが貼られていないことが判明しました。
その他は、特に大きな問題なく運用を続けることができています。
おわりに
各社で共通IDを持つ事が当たり前になりつつありますが、皆さまどのように構築されているのか気になりますよね。
まだまだお話したいことはあるのですが、この辺りで終わりにしたいと思います。
それでは良いクリスマスを!🎄