Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Copyright © Bitkey Inc. All rights reserved. Node.js のサーバーをなるべく 自動生成に頼って Go にリプレイスした話 株式会社ビットキー おーたかこーたろー / @otakakot The Go gopher was designed by Renée French.
Slide 2
Slide 2 text
Copyright © Bitkey Inc. All rights reserved. 大高 浩太郎 Kotaro Otaka / @otakakot 2020.04 2022.11 2024.07 新卒社会人として Web業界にてエンジニア人生開幕 AWS Lambda など Serverless による開発を経験 株式会社ビットキーへジョイン 技術本部 / プラットフォーム開発部 BKP & HubCoreModule 認証・認可基盤を Go で実装したり GitHub Actions でピタゴラスイッチ作ったり The Go gopher was designed by Renée French. The icon was designed by @avocadoneko. 2021.04 先輩のススメで Go に出会う 趣味で勉強、そして推し始める (Gopherくんかわいい … )
Slide 3
Slide 3 text
Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey Inc. All rights reserved.
Slide 4
Slide 4 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev ソフトウェアとハードウェアに跨る自社開発プロダクト
Slide 5
Slide 5 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev なんでリプレイス? 共通基盤「bitkey platform」 サーバーを Go で実装 一箇所だけ Node.js が存在 脆弱性対応・バージョン・トレンド etc 管理する言語は少なくしたい The Go gopher was designed by Renée French.
Slide 6
Slide 6 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev なぜリプレイス? リプレイスも楽したい 共通基盤「bitkey platform」 サーバーを Go で実装 一箇所だけ Node.js が存在 脆弱性対応・バージョン・トレンド etc 管理する言語は少なくしたい The Go gopher was designed by Renée French.
Slide 7
Slide 7 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 無事リプレイスに成功 🎉 他言語からのリプレイス Go でさらに遠くへ
Slide 8
Slide 8 text
Copyright © Bitkey Inc. All rights reserved. Outline Copyright © Bitkey Inc. All rights reserved. #gofar_dev 1. リプレイス対象サーバー 2. 自動生成ライブラリ 3. 検証・動作確認 4. 結果・感想 5. 今後の展望
Slide 9
Slide 9 text
Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey Inc. All rights reserved. #gofar_dev リプレイス対象サーバー
Slide 10
Slide 10 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev ● workhub ● Room Support ● 事前に顔情報を登録 ● 顔をかざして解錠 顔認証による解錠
Slide 11
Slide 11 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 顔認証による解錠 〜登録〜 ※ 説明のため簡略化しています。
Slide 12
Slide 12 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 顔認証による解錠 〜解錠〜 ※ 説明のため簡略化しています。
Slide 13
Slide 13 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev frs ( Face Recognition System ) ● faceme-server へ顔特徴量抽出の依頼 ● 顔特徴量の暗号化 ● 暗号化に使った 鍵自体も CKM にて暗号化 ● データベースにて管理 ※ 説明のため簡略化しています。
Slide 14
Slide 14 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev frs ( Face Recognition System ) ※ 説明のため簡略化しています。 ● faceme-server へ顔特徴量抽出の依頼 ● 顔特徴量の暗号化 ● 暗号化に使った 鍵自体も CKM にて暗号化 ● データベースにて管理
Slide 15
Slide 15 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev Node.js による実装 ● API は 7 つほど提供 ○ 使っていない機能もいくつか ● Express によるサーバー実装 ○ OpenAPI などの仕様書はなし ● Sequelize によるマイグレーションおよびORM ● Cloud Key Management は 公式の SDK を利用
Slide 16
Slide 16 text
Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ
Slide 17
Slide 17 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリの活用 ● Why ? ○ 実装コストを下げたかったから(楽をしたかったから) ● 自動生成の対象は以下 ○ API の実装 ○ ORM の実装
Slide 18
Slide 18 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 API 編 〜 ● スキーマファースト(OpenAPI)を採用 ↔ コードファースト ○ コードファーストより実装量が少なそう ○ そもそも API の仕様書がなかったのでほしかった ○ bitkey platform のAPIも OpenAPI (swagger) を採用している ● 比較検討したライブラリ どちらも OpenAPI をもとにコードを生成 ○ oapi-codegen ○ ogen ※ スター数が多いopenapi-generator というライブラリもあるがかっちりとしたフレームワークという印象だったので除外
Slide 19
Slide 19 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 API 編 〜 特徴 oapi-codegen ● ルーティングエンジンとして echo をデフォルトで採用 ● ほかにも chi, Gin, gorilla/mux などが選択可能 ○ Go 1.22 のルーティングにも対応 ● client や type のみなど個別に生成が可能
Slide 20
Slide 20 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 API 編 〜 特徴 ogen ● ルーティングは独自機構による実装 ● 生成されたコードでは reflect や interface{} を使っていない ● Optional や Nullable に対応 ● OpenTelemetry に対応 ● 開発しているときの実装感覚が gRPC (proto) のコード生成に近い
Slide 21
Slide 21 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 API 編 〜 ● OpenAPI は自力で Express のコードを読んで作成 ○ 生成AIの力を借りたら楽にできたかもしれない ● より厳密に実装ができる(補完によるサジェストも強力) ○ 特にレスポンス ○ oapi-codegen は型は生成してくれるがAPI単位で担保できない → ogen を採用
Slide 22
Slide 22 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 API 編 〜 oapi-codegenによる実装 ogenによる実装
Slide 23
Slide 23 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 API 編 〜 ● oapi-codegen のおすすめポイント ○ echo など慣れ親しんだライブラリがある場合 ○ ミドルウェア(リクエストごとの共通処理)の実装 ○ echo などライブラリとしてミドルウェアのサポートが豊富 ● 実は bitkey platform がまだ swagger ○ OpenAPI に移行するなら oapi-codegen を採用したい
Slide 24
Slide 24 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 ORM編 〜 ● データベースファーストを採用 ○ コードファースト ( GORM, ent. ) や スキーマファースト ( sqlc ) は検討外 ● 実際のテーブルからコードを自動生成 ● 比較検討したライブラリ ○ sqlboiler ○ xo
Slide 25
Slide 25 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 ORM編 〜 ● INSERT, UPDATE, UPSERT, DELETE の使い方は同じ ● SELECT に関しては ○ sqlboiler は柔軟なクエリを実行可能 ○ xo はインデックスが貼られた要素に対するクエリが生成 → sqlboiler を採用
Slide 26
Slide 26 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 ORM編 〜 DDL (テーブル定義) DB接続処理
Slide 27
Slide 27 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 ORM編 〜 sqlboiler xo
Slide 28
Slide 28 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜 ORM編 〜 sqlboiler クエリビルダによる検索
Slide 29
Slide 29 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev たまに xo を採用していると耳にする ... なんで ... ???
Slide 30
Slide 30 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev Go Conference 2024 ( Pre Party ) にて ... xo いいですよ xo meetup しましょうよ template
Slide 31
Slide 31 text
Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 検証・動作確認
Slide 32
Slide 32 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 検証・動作確認 ● チームが保有する E2E (シナリオ)テスト ● Unitテストによるコードレベルの互換性担保 ● E2E テストによるエンドポイントレベルの互換性担保
Slide 33
Slide 33 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev チームが保有する E2E (シナリオ)テスト ● Python ( Jupyter ) で実装されている秘伝のシナリオテスト ● ローカル環境で実施 ● 開発環境(GKE)で実施
Slide 34
Slide 34 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev Unitテストによるコードレベルの互換性担保 Node.js のコード Go で呼び出して比較 Node.js の実装 Go の実装
Slide 35
Slide 35 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev ● exec.Cmd にて node を実行 ● node の実行環境が必要 ● 標準出力でNodeの結果を取得 ● 引数は Go で準備 ● Node.js の結果と Go の結果 Unitテストによるコードレベルの互換性担保
Slide 36
Slide 36 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev E2E テストによるエンドポイントレベルの互換性担保 ● 新旧同時に起動 ● CKM はクラウド環境を利用 ● API とORMの実装に 言語間で差異がないことを検証 ※ 説明のため簡略化しています。
Slide 37
Slide 37 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev E2E テストによるエンドポイントレベルの互換性担保 ● main.go にて以下を検証 ○ 旧APIで作成 新旧APIで取得・比較 ○ 新APIで作成 新旧APIで取得・比較 ● Client実装 に ogen を利用 ※ 説明のため簡略化しています。
Slide 38
Slide 38 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev E2E テストによるエンドポイントレベルの互換性担保 ● main.go にて以下を検証 ○ 旧APIで作成 新旧APIで取得・比較 ○ 新APIで作成 新旧APIで取得・比較 ● Client実装 に ogen を利用 ※ 説明のため簡略化しています。
Slide 39
Slide 39 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 検証・動作確認 ● チームが保有する E2E (シナリオ)テスト ● Unitテストによるコードレベルの互換性担保 ● E2E テストによるエンドポイントレベルの互換性担保
Slide 40
Slide 40 text
Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 結果・感想
Slide 41
Slide 41 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 結果 無事リプレイスに成功 🎉
Slide 42
Slide 42 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev 感想 ● 自動生成ライブラリを活用したことで書いたコードは少なかった ● リプレイスしたことでこのシステムの解像度が向上 ● 全部 Go に置き換えたことでちゃんと説明できる ● リプレイスしないにしてもこういったツールを使って 対象のサーバーをキャッチアップするのはありかもしれない
Slide 43
Slide 43 text
Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 今後の展望
Slide 44
Slide 44 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev マイグレーション対応 この子。 最近 個人的 に sqlc と sqldef に夢を見ている ので検討したい ※ 説明のため簡略化しています。
Slide 45
Slide 45 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev サーバー間通信を gRPC へ置換
Slide 46
Slide 46 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev サーバー間通信を gRPC へ置換 ● bitkey platform はマイクロサービスで構築 ● 保守の観点から gRPC へと完全移行したい ● コアなロジックが問題ないことを確認したいので着手したい ● 検証の方針は今回説明したものと同じ
Slide 47
Slide 47 text
Copyright © Bitkey Inc. All rights reserved. #gofar_dev End of File The Go gopher was designed by Renée French. Gopher くん、がんばって組み立ててる... かわいい ...