Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Node.js のサーバーをなるべく自動生成に頼って Go にリプレイスした話 / A sto...

Node.js のサーバーをなるべく自動生成に頼って Go にリプレイスした話 / A story about replacing a Node.js server with Go, relying on automatic generation as much as possible.

登壇者名:大高浩太郎
登壇したイベントタイトル:Go Far. 〜 ナレッジワーク × メルカリ × マネーフォワード × ビットキー 〜
登壇したイベントのURL:https://bitkey.connpass.com/event/318523/

More Decks by 株式会社ビットキー / Bitkey Inc.

Other Decks in Technology

Transcript

  1. Copyright © Bitkey Inc. All rights reserved. Node.js のサーバーをなるべく 自動生成に頼って

    Go にリプレイスした話 株式会社ビットキー おーたかこーたろー / @otakakot The Go gopher was designed by Renée French.
  2. 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くんかわいい … )
  3. Copyright © Bitkey Inc. All rights reserved. #gofar_dev なんでリプレイス? 共通基盤「bitkey

    platform」 サーバーを Go で実装 一箇所だけ Node.js が存在 脆弱性対応・バージョン・トレンド etc 管理する言語は少なくしたい The Go gopher was designed by Renée French.
  4. Copyright © Bitkey Inc. All rights reserved. #gofar_dev なぜリプレイス? リプレイスも楽したい

    共通基盤「bitkey platform」 サーバーを Go で実装 一箇所だけ Node.js が存在 脆弱性対応・バージョン・トレンド etc 管理する言語は少なくしたい The Go gopher was designed by Renée French.
  5. Copyright © Bitkey Inc. All rights reserved. Outline Copyright ©

    Bitkey Inc. All rights reserved. #gofar_dev 1. リプレイス対象サーバー 2. 自動生成ライブラリ 3. 検証・動作確認 4. 結果・感想 5. 今後の展望
  6. Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey

    Inc. All rights reserved. #gofar_dev リプレイス対象サーバー
  7. Copyright © Bitkey Inc. All rights reserved. #gofar_dev • workhub

    • Room Support • 事前に顔情報を登録 • 顔をかざして解錠 顔認証による解錠
  8. Copyright © Bitkey Inc. All rights reserved. #gofar_dev frs (

    Face Recognition System ) • faceme-server へ顔特徴量抽出の依頼 • 顔特徴量の暗号化 • 暗号化に使った  鍵自体も CKM にて暗号化 • データベースにて管理 ※ 説明のため簡略化しています。
  9. Copyright © Bitkey Inc. All rights reserved. #gofar_dev frs (

    Face Recognition System ) ※ 説明のため簡略化しています。 • faceme-server へ顔特徴量抽出の依頼 • 顔特徴量の暗号化 • 暗号化に使った  鍵自体も CKM にて暗号化 • データベースにて管理
  10. Copyright © Bitkey Inc. All rights reserved. #gofar_dev Node.js による実装

    • API は 7 つほど提供 ◦ 使っていない機能もいくつか • Express によるサーバー実装 ◦ OpenAPI などの仕様書はなし • Sequelize によるマイグレーションおよびORM • Cloud Key Management は 公式の SDK を利用
  11. Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey

    Inc. All rights reserved. #gofar_dev 自動生成ライブラリ
  12. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリの活用 •

    Why ? ◦ 実装コストを下げたかったから(楽をしたかったから) • 自動生成の対象は以下 ◦ API の実装 ◦ ORM の実装
  13. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜

    API 編 〜 • スキーマファースト(OpenAPI)を採用 ↔ コードファースト ◦ コードファーストより実装量が少なそう ◦ そもそも API の仕様書がなかったのでほしかった ◦ bitkey platform のAPIも OpenAPI (swagger) を採用している • 比較検討したライブラリ どちらも OpenAPI をもとにコードを生成 ◦ oapi-codegen ◦ ogen  ※ スター数が多いopenapi-generator というライブラリもあるがかっちりとしたフレームワークという印象だったので除外
  14. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜

    API 編 〜 特徴 oapi-codegen • ルーティングエンジンとして echo をデフォルトで採用 • ほかにも chi, Gin, gorilla/mux などが選択可能 ◦ Go 1.22 のルーティングにも対応 • client や type のみなど個別に生成が可能
  15. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜

    API 編 〜 特徴 ogen • ルーティングは独自機構による実装 • 生成されたコードでは reflect や interface{} を使っていない • Optional や Nullable に対応 • OpenTelemetry に対応 • 開発しているときの実装感覚が gRPC (proto) のコード生成に近い
  16. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜

    API 編 〜 • OpenAPI は自力で Express のコードを読んで作成 ◦ 生成AIの力を借りたら楽にできたかもしれない • より厳密に実装ができる(補完によるサジェストも強力) ◦ 特にレスポンス ◦ oapi-codegen は型は生成してくれるがAPI単位で担保できない → ogen を採用
  17. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜

    API 編 〜 oapi-codegenによる実装 ogenによる実装
  18. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜

    API 編 〜 • oapi-codegen のおすすめポイント ◦ echo など慣れ親しんだライブラリがある場合 ◦ ミドルウェア(リクエストごとの共通処理)の実装 ◦ echo などライブラリとしてミドルウェアのサポートが豊富 • 実は bitkey platform がまだ swagger ◦ OpenAPI に移行するなら oapi-codegen を採用したい
  19. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜

    ORM編 〜 • データベースファーストを採用 ◦ コードファースト ( GORM, ent. ) や スキーマファースト ( sqlc ) は検討外 • 実際のテーブルからコードを自動生成 • 比較検討したライブラリ ◦ sqlboiler ◦ xo
  20. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 自動生成ライブラリ 〜

    ORM編 〜 • INSERT, UPDATE, UPSERT, DELETE の使い方は同じ • SELECT に関しては ◦ sqlboiler は柔軟なクエリを実行可能 ◦ xo はインデックスが貼られた要素に対するクエリが生成 → sqlboiler を採用
  21. Copyright © Bitkey Inc. All rights reserved. #gofar_dev たまに xo

    を採用していると耳にする ... なんで ... ???
  22. Copyright © Bitkey Inc. All rights reserved. #gofar_dev Go Conference

    2024 ( Pre Party ) にて ...  xo いいですよ  xo meetup しましょうよ template
  23. Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey

    Inc. All rights reserved. #gofar_dev 検証・動作確認
  24. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 検証・動作確認 •

    チームが保有する E2E (シナリオ)テスト • Unitテストによるコードレベルの互換性担保 • E2E テストによるエンドポイントレベルの互換性担保
  25. Copyright © Bitkey Inc. All rights reserved. #gofar_dev チームが保有する E2E

    (シナリオ)テスト • Python ( Jupyter ) で実装されている秘伝のシナリオテスト • ローカル環境で実施 • 開発環境(GKE)で実施
  26. Copyright © Bitkey Inc. All rights reserved. #gofar_dev • exec.Cmd

    にて node を実行 • node の実行環境が必要 • 標準出力でNodeの結果を取得 • 引数は Go で準備 • Node.js の結果と Go の結果 Unitテストによるコードレベルの互換性担保
  27. Copyright © Bitkey Inc. All rights reserved. #gofar_dev E2E テストによるエンドポイントレベルの互換性担保

    • 新旧同時に起動 • CKM はクラウド環境を利用 • API とORMの実装に 言語間で差異がないことを検証 ※ 説明のため簡略化しています。
  28. Copyright © Bitkey Inc. All rights reserved. #gofar_dev E2E テストによるエンドポイントレベルの互換性担保

    • main.go にて以下を検証 ◦ 旧APIで作成 新旧APIで取得・比較 ◦ 新APIで作成 新旧APIで取得・比較 • Client実装 に ogen を利用 ※ 説明のため簡略化しています。
  29. Copyright © Bitkey Inc. All rights reserved. #gofar_dev E2E テストによるエンドポイントレベルの互換性担保

    • main.go にて以下を検証 ◦ 旧APIで作成 新旧APIで取得・比較 ◦ 新APIで作成 新旧APIで取得・比較 • Client実装 に ogen を利用 ※ 説明のため簡略化しています。
  30. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 検証・動作確認 •

    チームが保有する E2E (シナリオ)テスト • Unitテストによるコードレベルの互換性担保 • E2E テストによるエンドポイントレベルの互換性担保
  31. Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey

    Inc. All rights reserved. #gofar_dev 結果・感想
  32. Copyright © Bitkey Inc. All rights reserved. #gofar_dev 感想 •

    自動生成ライブラリを活用したことで書いたコードは少なかった • リプレイスしたことでこのシステムの解像度が向上 • 全部 Go に置き換えたことでちゃんと説明できる • リプレイスしないにしてもこういったツールを使って 対象のサーバーをキャッチアップするのはありかもしれない
  33. Copyright © Bitkey Inc. All rights reserved. Copyright © Bitkey

    Inc. All rights reserved. #gofar_dev 今後の展望
  34. Copyright © Bitkey Inc. All rights reserved. #gofar_dev マイグレーション対応 この子。

    最近 個人的 に sqlc と sqldef に夢を見ている ので検討したい ※ 説明のため簡略化しています。
  35. Copyright © Bitkey Inc. All rights reserved. #gofar_dev サーバー間通信を gRPC

    へ置換 • bitkey platform はマイクロサービスで構築 • 保守の観点から gRPC へと完全移行したい • コアなロジックが問題ないことを確認したいので着手したい • 検証の方針は今回説明したものと同じ
  36. Copyright © Bitkey Inc. All rights reserved. #gofar_dev End of

    File The Go gopher was designed by Renée French. Gopher くん、がんばって組み立ててる... かわいい ...