フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【新規ツール探し】ngrok-go で速攻でローカルのウェブサーバを外部に公開する

  • 記事作成日: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 を組み込むことができます。

ngrok/ngrok-go: The ngrok agent in library form, suitable for integrating directly into your Go application.

所感

  • 超簡単だった
  • 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.Servenet.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を超簡単に発行できました。