外部サービスの調査をすることが最近多く、それらからのリクエストをデバッグ等したいケースが多々あるので ngrok を使っていましたが、ngrok-go というものがあったので触ってみつつ、ngrok のドキュメントもちゃんと読んでなかったので簡単に目を通してみました。それらの雑なメモ書きです。
ngrok
ngrok は分散型リバースプロキシとのことです。 ngrok edge と呼ばれるグローバルなプロキシによって、外部からのトラフィックを受け入れ、アップストリームサービス(エージェントソフトウェア側)に転送することができるようです。 ローカル端末等では、エージェントソフトウェアを実行することで、 TLS で ngrok のグローバルサービス(おそらくngrok edge)との通信を確立し、ngrok エッジのエンドポイントでトラフィックが受信されると、そのトラフィックは TLS 接続を介してエージェントに送信され、最終的にエージェントからアップストリームサービスに送信される、といったような仕組みのようです。
- Get Started with ngrok - ngrok documentation
- Best security practices for developer productivity - ngrok documentation
ngrok-go
ngrok-go は ngrok の Go 言語用のクライアントライブラリです。 ngrok-go を使うことで、Go 言語で ngrok のエージェントを実装することができるようです。
インストール
作業用ディレクトリを作成します。
% mkdir ngrok-go-sample % cd ngrok-go-sample
Go モジュールを初期化します。
% go mod init ngrok-go-sample
ngrok-go をインストールします。
% go get golang.ngrok.com/ngrok
サンプルコード
下記のリンクを元にサンプルコードを作成します。
- Go SDK Quickstart - ngrok documentation
- GitHub - ngrok/ngrok-go: Embed ngrok secure ingress into your Go apps as a net.Listener with a single line of code.
package main ackage main import ( "context" "fmt" "log" "net/http" "golang.ngrok.com/ngrok" "golang.ngrok.com/ngrok/config" ) func main() { if err := run(context.Background()); err != nil { log.Fatalf("Error: %v", err) } } func run(ctx context.Context) error { listener, err := ngrok.Listen(ctx, config.HTTPEndpoint(), ngrok.WithAuthtokenFromEnv()) if err != nil { return err } fmt.Println(listener.URL()) log.Println("App URL", listener.URL()) return http.Serve(listener, http.HandlerFunc(handler)) } func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") }
実行
ngrok の authtoken を環境変数に設定して、サンプルコードを実行します。 これで ngrok エージェント相当(アップストリームサービス)の動きをするアプリケーションが起動した状態になるようです。
% NGROK_AUTHTOKEN="*********" go run main.go https://abcd-12-34-56-***.ngrok-free.app 2025/01/26 12:15:19 App URL https://abcd-12-34-56-***.ngrok-free.app
ngrok 管理画面の「endpoint 」欄にも生成されたエンドポイントが追加されていました。
出力された ngrok のエンドポイントにアクセスすると、Hello, World! が表示されました。
参考
- Go SDK Quickstart - ngrok documentation
- GitHub - ngrok/ngrok-go: Embed ngrok secure ingress into your Go apps as a net.Listener with a single line of code.
- Introducing ngrok-go: Ingress to Your Go Apps as a net.Listener | ngrok blog
- ngrok package - golang.ngrok.com/ngrok - Go Packages
- ngrok Agent - ngrok documentation
- Best security practices for developer productivity - ngrok documentation