HTTP Lambdaをルーティングする lamux - fujiwara-ware 2024 day 24
この記事は fujiwara-ware advent calendar 2024 の24日目です。
lamux とは
lamux は、HTTP リクエストを AWS Lambda にルーティングするためのツールです。Lambda MultiPlexer の略です。
なぜ作ったのか
Lambda Function URLs を使うと、HTTP を処理するサーバーを Lambda で簡単に作ることができます。また Function URLs が生成する URL は Lambda 関数のエイリアスごとに異なるため、ステージング環境や本番環境などを分けて運用することができます。
この機能を使って、20日目に紹介した mirage-ecs のようなことができるなと思いつきました。
-
foo.example.com
にリクエストが来たらfoo
というエイリアスの Lambda 関数を呼び出す -
bar.example.com
にリクエストが来たらbar
というエイリアスの Lambda 関数を呼び出す
というようにリクエストのホスト名に応じて Lambda 関数を呼び出すことができれば、Lambda で簡単にブランチに応じた開発・プレビュー環境を作ることができそうです。
そこで lamux を作りました。
動作原理
lamux は HTTP サーバーとして動作します。10日目に紹介した ridge を使っているため、AWS Lambda で動かすことも、EC2 や ECS などで動かすこともできます。
lamux が HTTP リクエストを受け取ると、リクエストのホスト名に応じて Lambda 関数とエイリアスを決定します。HTTP のリクエストを Lambda 用のペイロードに変換して関数を呼び出します。Lambda が返したレスポンスを HTTP レスポンスに変換してクライアントに返します。(この相互変換は ridge に含まれるユーティリティ関数で行っています)
ブランチ別環境を作る例
mirage-ecs のようなブランチ別環境を作る例を紹介します。
CloudFront と Lambda Function URLs で動作した lamux を用意し、ワイルドカードの DNS レコードを設定します。lamux はリクエストのホスト名に応じて Lambda 関数を呼び出すため、リクエストのホスト名にブランチ名を使うことで、ブランチ別環境を作ることができます。
アプリケーションは、ブランチごとに Lambda 関数のエイリアスを作成してデプロイすればよいのです。
mirage-ecs では起動する環境は ECS タスクでした。ECS タスクはリクエストを処理していなくても起動しているため、継続的にコストが掛かります。一方で lamux ではリクエストが来たときだけ Lambda 関数が起動されるため、リクエストがないときはコストが掛かりません。低コストでブランチ別環境を作ることができます。
lamux をサービスメッシュのデータプレーンとして使う
lamux は HTTP リクエストを Lambda にルーティングするためのツールです。Lambda で実装されたマイクロサービスがある場合、その Lambda を呼び出すためのデータプレーンとして lamux を使用できます。
lamux のバイナリを Lambda extensions として配置しておくと、lamux は Lambda ランタイム内で HTTP サーバーを起動します。そこに向かってリクエストを送ることで、他の Lambda 関数を実行します。
このように lamux を使うことで、Lambda 関数同士を HTTP で連携できます。呼び出し先のサービスがなんらかの理由で Lambda で実装されなくなったとしても、HTTP で連携していれば通信先を lamux から別の URL に変更すればよいだけです。直接 Lambda API を呼び出すよりも柔軟な運用が可能です。
lamux は Lambda に限らず、EC2 や ECS などの環境でも動作するため、ECS で実行されているアプリケーションから lamux を経由して Lambda 関数を呼び出すこともできます。このように、lamux はサービスメッシュのデータプレーンとしても使えるのです。
まとめ
lamux は HTTP リクエストを AWS Lambda にルーティングするためのツールです。
低コストでブランチ別環境を作るためのツールとしても使えますし、サービスメッシュのデータプレーンとしても使える、面白いプロダクトだと思います。
明日はこの fujiwara-ware アドベントカレンダー最終日です。お楽しみに!
参考資料
Discussion