Apache Traffic Server における WebAssembly 拡張の実現と課題

はじめに

Apache Traffic Server (ATS) は、エッジサーバーにおけるプロキシサーバーとして、ユーザーのリクエストをアプリケーションサーバーに転送する重要な役割を擔っています。近年、ATS の機能拡張に向けた新たな技術として、WebAssembly(Wasm)が注目されています。この記事では、ATS における WebAssembly 拡張の技術的背景、実裝方法、利點と課題を詳しく解説します。

Apache Traffic Server のアーキテクチャと機能

ATS は、DDoS 防禦、Web アプリケーションファイアウォール(WAF)、GDPR 合規性管理、ルーティング、靜的リソースキャッシュ(畫像、JavaScript、CSS)などの主要機能を提供します。これらの機能を柔軟に拡張するためには、強力なプログラマビリティが求められます。

現行のプラグインシステムと課題

ATS は C++ を使用したプラグインシステムを採用しており、リクエスト/レスポンスのライフサイクルイベントを監視できます。しかし、このシステムには以下のような課題があります:

  • 特定の指令やドメイン言語を學習する必要がある
  • 表現力が限られ、拡張性が低い
  • 新機能を追加する際には、プラグインの API を再設計する必要がある

Lure スクリプト言語とツールチェーン

Lure スクリプト言語は、ATS プラグイン開発を簡略化するためのツールとして注目されています。Visual Studio Code の Copilot と併用することで、コード生成が自動化され、開発効率が向上します。また、Lure JIT エンジンは Foreign Function Interface(FFI)をサポートしており、共有ライブラリ関數を呼び出すことが可能です。ただし、Lure の人気は低下しており、コミュニティの活性化が課題です。

Proxy VASM と WebAssembly 拡張

Proxy VASM は、WebAssembly をサポートするプロキシサーバーフレームワークであり、C++、Rust、AssemblyScript、TinyGo などの言語をサポートしています。ATS における WebAssembly プラグインアーキテクチャは、クライアントとソース間でライフサイクルイベントを監視し、Runtime エンジンで WebAssembly モジュールを実行します。ATS 提供の API を介してリクエスト/レスポンスを変更することが可能です。

実裝例と応用シナリオ

Rust を使用した例では、リクエストヘッダー內のトークンが素數かどうかを検証し、素數であればプロキシを継続し、そうでなければカスタムレスポンスを返す処理が実裝されています。実際の応用例として、Carasa プロジェクトでは Go で実裝された WAF を WebAssembly モジュールにコンパイルし、ModSecurity のルール言語と互換性を持たせています。今後は、エッジAI推論などの新たなシナリオも期待されています。

技術的利點と課題

利點

  • 複數の言語(C++、Rust、Go など)をサポート
  • WebAssembly モジュールは Sandbox で実行され、ATS の崩壊を防ぐ
  • Envoy などの他のプロキシサーバーと互換性がある

課題

  • Proxy VASM の一部機能(例:Trailer ヘッダー処理、gRPC ライフサイクル処理)が ATS でサポートされていない
  • ATS の內蔵キャッシュ機能と WebAssembly モジュールの互換性問題
  • パフォーマンスとリソース競合の最適化が求められる

今後の方向性

WebAssembly モジュールと ATS の統合を進めるため、パフォーマンスのボトルネックを解消し、異なる Runtime エンジンの選択肢を検討する必要があります。また、Component Model の導入により、モジュールの柔軟性と機能性を向上させることが期待されています。

安全性とエラー処理

WebAssembly モジュールは Sandbox で実行され、悪意のあるコードが ATS を崩壊させるのを防ぎます。実行時エンジンは、異常な挙動を検出し、エラーメッセージとして処理します。

技術的展望とトレンド

WebAssembly は今後も重要な技術として注目され、コミュニティと企業の関心が高まっています。今後、Component Model の導入により、モジュールの柔軟性が向上すると予想されます。

現在の制限と課題

功能制限

  • Proxy VASM の一部機能(HTTP/2 尾部ヘッダー操作、メタデータフレーム処理、gRPC ライフサイクル処理)が ATS でサポートされていない
  • ATS の內蔵キャッシュ機能と WebAssembly モジュールの互換性問題

パフォーマンス問題

  • 現在の実裝は初期段階であり、大量のテストと最適化が必要
  • リソース競合問題があり、パフォーマンスチューニングが求められる
  • 適切な Runtime エンジンの選択が重要

サポートされるランタイム環境

BCO アライアンス

  • WAMR(WebAssembly Micro Runtime):C 言語で開発され、LLVM JIT 編集と解釈実行をサポート。低メモリ使用量で、エミベーデッドやリソース制限環境に適している。
  • Vast:Rust 言語で開発され、メモリセキュリティと実行効率を重視。高メモリ使用量だが、AI 推論などの高階アプリケーションに適している。

その他のランタイム

  • V8:ブラウザで広く使用される WebAssembly エンジンだが、依存関係が多いため ATS での統合が進んでいない。
  • VasEdge:C++ で開発され、AI 推論に特化。多數の AI アプリケーション例と最適化技術を提供。

技術的課題と今後の方向性

ランタイム選択

  • 解釈実行、JIT 編集、メモリ使用量、セキュリティ支援などの特性に応じて、アプリケーションのニーズに応じたランタイムを選択する必要がある。

標準化と競合規格

  • 現在は Proxy VASM 規格に依存しているが、他の競合規格(例:VHtp)も存在する。今後は、他の規格への対応を検討する可能性がある。

ツールチェーンと開発支援

  • パフォーマンス分析やデバッグを支援するツールチェーンの構築が求められる。
  • AI 推論分野などの新しい使用ケースの探索。
  • V8 などの他のランタイムへの支援拡大。

現在の進捗と目標

  • 複數の言語とランタイムをサポートする実裝が既に達成されている。
  • 今後の重點改善方向は以下の通り:
    • パフォーマンスの最適化(リソース競合の削減、実行効率の向上)
    • ツールチェーンの支援強化(パフォーマンス分析、デバッグ)
    • 新しい使用ケースの拡大(AI 推論、高度なネットワーク機能)