- 記事作成日:2022/12/17
情報
名前 | URL |
---|---|
Github | https://github.com/ngrok/ngrok-go |
公式サイト | https://ngrok.com/docs |
デモサイト | |
開発母体 | ngrok |
version | |
言語 | Go |
価格 | 無料 |
ライセンス | MIT |
何ができるもの?
ローカルで起動したサーバを インターネットからアクセスできるようにします。
具体的には、起動したサーバと外部の ngrok cloud のサーバ間で常時接続を行い、ngrok 宛の通信を自分のサーバにプロキシすることで動作しています。
クラッキングでよくある C2C サーバとやってることは同じですね。
Ngrok. let’s understand open source Ngrok… | by Suraj Panker | Medium より引用
利用シーン
- 閉じられた環境のサーバにアクセスする場合
- ローカルでの開発物を簡単にネットで公開したい場合
など
登場背景
by DeepL
これはライブラリ形式の ngrok エージェントで、Go アプリケーションに直接統合するのに適しています。これにより、別途管理するプロセスなしに、アプリケーションに素早く ngrok を組み込むことができます。
所感
- 超簡単だった
net/http
と組み合わせて使えるので楽したい時に良い
使い方
ngrok でアカウントを作る
ngrok でトークンを取得
サンプルを動かす
package 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.Fatal(err) } } func run(ctx context.Context) error { tun, err := ngrok.Listen(ctx, config.HTTPEndpoint(), ngrok.WithAuthtokenFromEnv(), ) if err != nil { return err } log.Println("tunnel created:", tun.URL()) return http.Serve(tun, http.HandlerFunc(handler)) } func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello from ngrok-go!") }
通常の http.Serve
の net.Listener
に ngrok との接続を渡すだけで、他に特別なことはしていません。(interface の強力さを感じますね)
起動
❯ NGROK_AUTHTOKEN=xxxx go run main.go 2022/12/16 22:55:01 tunnel created: https://d98d-122-26-8-8.jp.ngrok.io
接続
❯ curl https://d98d-122-26-8-8.jp.ngrok.io Hello from ngrok-go!
ブラウザ
インターネットからアクセスできるURLを超簡単に発行できました。