以下の内容はhttps://dshimizu.hatenablog.com/entry/2025/02/09/125026より取得しました。


ngrok のドキュメントを読んで仕組みを雰囲気で把握しつつ ngrok-go を触ってみる

外部サービスの調査をすることが最近多く、それらからのリクエストをデバッグ等したいケースが多々あるので ngrok を使っていましたが、ngrok-go というものがあったので触ってみつつ、ngrok のドキュメントもちゃんと読んでなかったので簡単に目を通してみました。それらの雑なメモ書きです。

ngrok

ngrok は分散型リバースプロキシとのことです。 ngrok edge と呼ばれるグローバルなプロキシによって、外部からのトラフィックを受け入れ、アップストリームサービス(エージェントソフトウェア側)に転送することができるようです。 ローカル端末等では、エージェントソフトウェアを実行することで、 TLS で ngrok のグローバルサービス(おそらくngrok edge)との通信を確立し、ngrok エッジのエンドポイントでトラフィックが受信されると、そのトラフィックTLS 接続を介してエージェントに送信され、最終的にエージェントからアップストリームサービスに送信される、といったような仕組みのようです。

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

サンプルコード

下記のリンクを元にサンプルコードを作成します。

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! が表示されました。

参考




以上の内容はhttps://dshimizu.hatenablog.com/entry/2025/02/09/125026より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14