🐁

どうしてもGoで開発したい!

2022/10/31に公開

はじめに

無料環境大好き!レッツ貧乏エンジニアリング!
無料で開発できる環境は非常にありがたいですが、なかなかGoを実行できるものは少ないです。。。

https://qiita.com/rana_kualu/items/f7fc4916b7dc9797839e

https://qiita.com/relu/items/b60330ea3137f2f745c5

こちらの紹介記事を眺めていたら cyclic という良さげなサービスを知りました。
ただ、開発できるのはNodeとのこと。
どうにかしてGoで開発できるようにならないかなあと思い試してみたのでご紹介します!

cyclicについて

https://docs.cyclic.sh/overview/architecture

によるとcyclicAWSを利用してLambdaなどを利用して構築されるみたいです。

S3DynamoDBも使えるので太っ腹ですね!

https://docs.cyclic.sh/overview/limits

制限はありますがうまく活用すればちょっとしたアプリを構築するのには十分そうです。

ひとまずNodeからGoを起動してみる

NodeからGoを実行するようにしてみれば活路が見出せるのではないかと思い試してみることに。
child-processを参考にGoバイナリにてサーバーを作ってNodeから呼び出してみました。

無事に起動&アクセスすることができました!

npm run start

> fs-go-on-node@1.0.0 start
> node index.js

stderr: 2022/10/31 18:41:38 go server running...
curl http://localhost:3000
Hello, Go!%

(stderr ...???)

試しに作ってみたコードは以下に置いてあります。

https://github.com/takokun778/fs-go-on-node

いざデプロイ

NodeからGoを起動することが確認できたのでいざデプロイへ!

cyclicGitHubを連携してコンソール画面をぽちぽちしてstarter-micro-apiがデプロイできました。
こちらを改造していきます。
(最終的には別リポジトリを作成して連携させることにしました。)

index.jsを改良してデプロイしアクセスすると以下の画面に...

cyclicコンソールのログを確認してみると以下の出力が。

stderr: ./main: ./main: cannot execute binary file

バイナリが実行できないだと...

そういえば、私の開発環境macだったじゃん。
LambdaのOSはAmazon Linux 2か。そしてArchitecturesもx86_64かもな。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

ビルドコマンドを以下に修正してみて再びデプロイしてみることに。

GOOS=linux GOARCH=amd64 go build -o main main.go

無事にデプロイが成功しアクセスにも成功しました!

2022-10-31T10:52:16.320Z: [CYCLIC] Building...
2022-10-31T10:52:16.327Z: [CYCLIC] cached, updating...
2022-10-31T10:52:17.240Z: From https://github.com/takokun778/fs-cyclic-go
 * branch            51607ce26b04d3349ff0001778140149aa4fc2c7 -> FETCH_HEAD
2022-10-31T10:52:17.243Z: Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  007e552 first commit

2022-10-31T10:52:17.245Z: HEAD is now at 51607ce first commit
2022-10-31T10:52:17.390Z: [CYCLIC] verifying...
2022-10-31T10:52:17.664Z: [CYCLIC] using: node:v16.18.0 npm:8.11.0 runtime:nodejs16.x
2022-10-31T10:52:17.666Z: [CYCLIC] installing dependencies from: package.json
2022-10-31T10:52:17.916Z: npm
2022-10-31T10:52:17.918Z:  WARN config production Use `--omit=dev` instead.
2022-10-31T10:52:18.015Z: 
up to date in 119ms
2022-10-31T10:52:18.020Z: [CYCLIC] running build if defined...
2022-10-31T10:52:18.311Z: [CYCLIC] pruning dev dependencies...
2022-10-31T10:52:18.635Z: 
up to date, audited 1 package in 91ms
2022-10-31T10:52:18.637Z: 
found 0 vulnerabilities
2022-10-31T10:52:18.649Z: [CYCLIC] packaging 6.36 MB...
2022-10-31T10:52:18.960Z: [CYCLIC] done packaging
[CYCLIC] deploying...
2022-10-31T10:52:25.040Z: deployed ap-northeast-2 -  6.068s
2022-10-31T10:52:25.042Z: SUCCESS

took 9.0 seconds
api deployed at:
curl https://xxxxx-xxxxxxxxx-xxx.cyclic.app/
Hello, Go!%    

今回使ったコードは以下に置いておきます。

https://github.com/takokun778/fs-cyclic-go

調整したあれこれ

最初はバイナリがデプロイできていないのかなと思い

  1. S3にバイナリを配置
  2. Lambda起動時にダウンロード
  3. バイナリ起動

を試みるもLambda内へは権限的に書き込みが禁止だったっぽくて失敗...

解決したいあれこれ

とりあえず動かしたかっただけだったので
実用化するためには調整することはあります。

  • ログがstderrで吐き出される
  • バイナリをGitHubに保存したくない(デプロイ時にビルドしたい)

その他

ローカル環境は以下になります。

node --version
v16.15.1
go version
go version go1.19.2 darwin/arm64

おわりに

どうにかして無理やりGoで実装する環境を構築してみました。
たったひとつのエンドポイントしか作っていないのでがっつり構築できるかは今後も要調査といったところですね。
まだまだ調整すべきことはたくさんありますがどうしてもGoで開発したい方はぜひ試してみてください!
(wasm使いこなせればもっと無理やりGo開発の環境を開拓できたりするのかなぁ。。。)

Discussion