🔀

HTTP Lambdaをルーティングする lamux - fujiwara-ware 2024 day 24

2024/12/24に公開

この記事は fujiwara-ware advent calendar 2024 の24日目です。

lamux とは

https://github.com/fujiwara/lamux

lamux は、HTTP リクエストを AWS Lambda にルーティングするためのツールです。Lambda MultiPlexer の略です。

なぜ作ったのか

Lambda Function URLs を使うと、HTTP を処理するサーバーを Lambda で簡単に作ることができます。また Function URLs が生成する URL は Lambda 関数のエイリアスごとに異なるため、ステージング環境や本番環境などを分けて運用することができます。

この機能を使って、20日目に紹介した mirage-ecs のようなことができるなと思いつきました。

https://zenn.dev/fujiwara/articles/fujiwara-ware-2024-mirage-ecs

  • foo.example.com にリクエストが来たら foo というエイリアスの Lambda 関数を呼び出す
  • bar.example.com にリクエストが来たら bar というエイリアスの Lambda 関数を呼び出す

というようにリクエストのホスト名に応じて Lambda 関数を呼び出すことができれば、Lambda で簡単にブランチに応じた開発・プレビュー環境を作ることができそうです。

そこで lamux を作りました。

動作原理

lamux は HTTP サーバーとして動作します。10日目に紹介した ridge を使っているため、AWS Lambda で動かすことも、EC2 や ECS などで動かすこともできます。

https://zenn.dev/fujiwara/articles/fujiwara-ware-2024-ridge

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 アドベントカレンダー最終日です。お楽しみに!

参考資料

https://speakerdeck.com/fujiwara3/yapc-hakodate2024

Discussion