Backend の記事一覧

コンテナ中でVCS Stampingが失敗する話

こんにちは、garsueです。最近、手元の開発環境を一新していて遭遇したちょっとした小ネタを紹介します。同じ問題に遭遇する人もいそうな気がするので参考になれば幸いです。

事象: DockerにマウントしたGoのプロジェクトでビルドがコケる

当社の開発環境では開発中のコードをDockerのコンテナにマウントしてコンテナ中でビルドしています。その際に一部のコンテナで以下のエラーとともにビルドが失敗していました。

error obtaining VCS status: exit status 128
Use -buildvcs=false to disable VCS stamping.

VCS StampingはGo 1.18から追加された機能で、Gitなどのバージョンコントロールシステムからリビジョン番号などを取得してバイナリに埋め込む機能です。

エラーの詳細としては exit status 128 としか表示されておらず、なぜ失敗しているのか上記のエラーだけではパッとはわかりませんでした。

なお、単にエラーが起きないようにするだけならエラーメッセージにあるようにビルドオプションに -buildvcs=false を追加すればいいだけです。大抵の場合、開発途中では不要かと思います。1

Cloudflare WorkersからTinyGoでビルドしたWabAssemblyバイナリを呼び出す

こんにちは、マネーフォワード ケッサイのテックリードをやっておりますgarsueです。

最近、CDNのエッジで動くサーバレス環境が充実してきましたね。

代表的なものとしてはCloudflare WorkersやfastlyのCompute@Edgeなどがあります。CloudflareではKey-Valueストアもあり、S3やGCSのようなオブジェクトストレージまで揃いつつあるようです。

そんな流れに乗って、Cloudflare Workersを使ってGoで実装した計算ロジックをエッジで動かせるか検証してみました。今回はその結果をレポートします。

TL;DR

  • アップロードサイズ制限があるのでTinyGo使って小さいwasmバイナリを作る
  • wrangler.tomlで type = "CompiledWasm"のモジュールとしてwasmバイナリをアップロードする
  • wasmのエントリポイント内でJavaScriptの名前空間にJavaScriptの関数としてセットする

GoLandでテンプレート中でも補完を効かせる

こんにちは、マネーフォワードケッサイでバックエンドの開発をしているgarsueです。

みなさんGoの開発環境は何を使ってますか? ぼくはVim -> Visual Studio Code -> GoLandと移り変わってきましたが、もう5年位はGoLandで開発しています。

そんなGoLandユーザーのぼくから、GoLandでGo標準のテンプレート1を書く際のちょっと便利な小技をお伝えします。

NestJSでgRPCクライアントを管理するtips

こんにちは、マネーフォワードケッサイでバックエンドの開発をしているgarsueです。

1年くらい前にNestJSでBFFをつくった話を書き、今も引き続きNestJSは活躍してくれています。

その間に得られた知見もいくつかあるので、その中からgRPCを呼び出す際のgRPCクライアントの管理方法についてのtipsを書こうと思います。

gRPCクライアントの初期化における注意点

公式ドキュメントでgRPCクライアントのインスタンス管理方法がいくつか紹介されています。

ほとんどの場合、上記の情報で特に困ることはないですが、gRPCクライアントを利用する箇所が増え、ある程度複雑化してきた場合に困ることがあります。

NestJSでBFFをつくった話

MF KESSAIでバックエンドのエンジニアをやっているgarsueです。 先日当社のnoteのインタビュー企画NestJSを使ったBackend For Frontend(以下BFF)について「ブログお待ちしてます!」と言われてしまったので、重い腰を上げて書くことにしました。

当社ではNestJSをGraphQLをしゃべるBFFとして使っているので、そのあたりの勘所や知見を少し紹介します。

なぜBFFとしてNestJSを採用したか

まず、フロントエンドのフレームワークはNuxtJSで決まっていました。当社での2年以上の実績もあり、もはや定番となっています。 また、NuxtJSと合わせてGraphQLを使うのも定番となっており、今回もGraphQLを使うことが決まっていました。

NuxtJSから呼び出すBFFは今までGoでgqlgenを使ったGraphQLサーバーとして実装していました。 これはこれで悪くないのですが、やりたいことはバックエンドのサービス群を呼び出してフロントエンドの都合のいい形に加工して返すことぐらいなので、もっと軽く開発できる何かにしたいなとも思っていました。

そこで高い抽象度で記述量も少なく抑えられ、フロントエンドエンジニアも触りやすいTypeScript製のフレームワークであるNestJSを採用しました。 GraphQLもサポートされていて、NestJS自体がマイクロサービスアーキテクチャを前提にしてるフレームワークでもあり、今回の要件にマッチしていました。