本番データの漏洩リスクなしにブラウザで複雑なjqフィルターをテストする方法
ターミナルで長いjq式を盲目的に組み立てなければならない経験が何度かあるのではないでしょうか。これは多くの人にとっておなじみの光景です。APIリクエストを送信し、何千行ものテキストの壁を受け取り、それからコンソールで上矢印を繰り返し押し、パイプ、セレクター、スライスを追加していく。一つのかっこを間違えれば、ターミナルはエラーを吐き出すか、空の配列を返します。
このような状況で最初に考えるのは、オンラインフォーマッターを開くことです。しかし、本番ログ、決済レスポンス、ユーザーの個人データを扱っているのであれば、検索結果をランダムにクリックした怪しいサイトに入力するわけにはいきません。
jq開発チームは、この問題をネイティブに解決しました。正式なサンドボックス「playground」を公開したのです。ソースコードはMITライセンスでGitHub上に公開されており動作版にはplay.jqlang.orgからアクセスできます。
这是什么
このプロジェクトは、jqで作業するためのインタラクティブなWebシェルです。画面の左側でソースJSONを貼り付けるか、URLで取得し、上部にフィルターを書き込むと、右側で変換結果が即座に表示されます。
ここでの主な特徴は内部にあります。パースとフィルター実行はすべてローカルでマシン上に行われます。サービスがお inúmer様のJSONボディをリモートサーバーに送信することはありません。
これはjq-wasmポートによって可能になりました—ユーティリティの元のCコードがWebAssemblyにコンパイルされました。その結果、ブラウザが重たい変換を独立して実行でき、OS側にネイティブ依存がありません。
実践的で役立つサンドボックスの活用法
何十もの無名の怪しいサービスとは異なり、このツールは同時にいくつかの応用的な課題を解決します。
まず、デフォルトでのプライバシー保護です。プロセッサーがクライアント上で直接WebAssembly内で実行されるため、社内部データベースのダンプ、インフラ設定、APIダンプを安全にサンドボックスにアップロードできます。网络リクエストは、ご自身が外部URLを貼り付けてJSONを読み込む場合にのみ発生します。
次に、利便的なスニペット共有です。第三者サービスの歪んだレスポンスを正しくパースする方法を同僚に見せる必要がある場合は、Shareボタンを押すだけです。サーバーがフィルターコードを保存し、短縮リンクを生成します。リンクを受け取った人は、再びブラウザ内でローカルに計算が実行されます。
3番目に、レスポンシブなインターフェースです。データを送受信するためのネットワークオーバーヘッドがないため、フィルターを入力しながらリアルタイムで結果が再計算されます。walk()、再帰的な降り降り、カスタム関数などの厄介な構造をデバッグする際に、これは多くの時間を節約できます。
4番目に、サンドボックスは独自の境界内にデプロイできます。インターネットアクセスできないクローズドセグメントで事業を展開している場合、プロジェクトはローカルまたは内部チームサーバーで簡単に起動できます。
内部構造:アーキテクチャとスタック
サンドボックスはTypeScriptを使用し、Next.jsで書かれています。アプリケーション構造は非常に簡潔です:
- Reactを使用したフロントエンド。コードエディターと
jq-wasmの統合。 - PostgreSQLデータベース。共有スニペットの保存にのみ必要。
- バックエンドでリクエストを実行するワーカープールを持つサーバーサイドAPIエンドポイント(
POST /api/jq)。
ソースコードにおける興味深い詳細:/api/jq用のサーバーサイドワーカープールは、インスタンスの利用可能なRAMに密接に結合しています。Node.jsのWebAssemblyインスタンスはメモリ集約的であるため、アプリケーションはRAM量に基づいてスレッド制限を自動的に計算します。例えば、512MBメモリのインスタンスでは、ちょうど2つのパラレルスレッドが起動され、最大キューは40タスクになります。
必要に応じて、これらのパラメータは環境変数でオーバーライドできます:
# Максимальное число параллельных потоков jq
JQ_POOL_MAX_THREADS=4
# Максимальный размер очереди запросов
JQ_POOL_MAX_QUEUE=80
キューがオーバーフローした場合、APIは正直にHTTPステータス429 Too Many Requestsを返し、Out of Memoryによるサービスのクラッシュから保護します。
プロジェクトをローカルにデプロイする方法
パブリックホスティングを使用したくない場合、または企業ネットワーク内に独自のインスタンスが必要な場合は、起動に数分かかります。
Node.jsバージョン14以上とDocker(データベース用)が必要です。
リポジトリをクローンします:
git clone https://github.com/jqlang/playground
cd playground
ローカル開発とテスト的最速の方法は、 готовуюDocker Composeを実行することです。これにより、ローカルPostgreSQLインスタンス вместе с приложениемが起動します:
docker compose up
起動後、ブラウザでhttp://localhost:3000を開きます。
コンテナなしで本番バージョンをビルドするには、標準的なコマンドで十分です:
npm run build
npm run start
本番環境に唯一必要な環境変数は、PostgreSQL接続文字列を持つDATABASE_URLです。リンク生成機能が不要な場合は、他の設定はデフォルトのままにできます。
誰が役立つか
インフラコード、Kubernetesのログ、CI/CDパイプライン、複雑なREST APIを頻繁に触れる人なら 누구나ブックマークする価値があります。
このサンドボックスは、1行のフィルターの構文を確認するためだけにその場限りのbashスクリプトを書く必要性を排除します。そして、2つのコマンドで独自のインスタンスを起動できる機能は、開発チームの内部ツールキットに追加する優れた候補となります。
関連プロジェクト