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 くん、がんばって組み立ててる... かわいい ...