自作 Web Framework が AWS Lambda で動くようになった (Experimental Support)
Ohkami v0.22 を出しました。
native な async runtime ( tokio
, async-std
, smol
, glommio
, nio
) と Cloudflare Workers ( worker
) に加えて、今回 AWS Lambda を試験的にサポートしたので紹介します。
できること
- Function URLs での動作
- API Gateway での動作
- 呼び出しモード
BUFFERED
でのレスポンス - 呼び出しモード
RESPONSE_STREAM
でのストリーミング
Lambda の仕様上、native runtime や Cloudflare Workers とは違い、ストリーミングするエンドポイントとそうでないエンドポイントと併置することはできません。
( 厳密にいうと、RESPONSE_STREAM
な Lambda ではストリーミングしないエンドポイントは
{"statusCode":200,"headers":{"Content-Type":"text/plain; charset=UTF-8","Content-Length":"18","Date":"Sat, 08 Feb 2025 06:26:09 GMT"},"body":"Hello, AWS Lambda!","isBase64Encoded":false}
みたいなチャンク1つだけを持つ Content-Type: application/octet-stream
なストリーミングレスポンスを返すので、これをクライアント側でパースする形でよければ使えます )
できないこと
- API Gateway の WebSocket API による WebSocket ハンドリング
これはちょっと特殊すぎるのでインターフェースに悩み、今のところ何も提供しないことにしました ( そもそも Lambda で WebSocket やる需要ってどれくらいあるんですかね? ) 。
つかいかた
README に書いてある通り、lambda_runtime
というクレートに乗っかります。
そして cargo lambda
という CLI を使うのがおすすめで、用意してある プロジェクトテンプレート もそれを前提にしています。
cargo lambda new <project dir> --template https://github.com/ohkami-rs/ohkami-templates
でプロジェクトを作成できます。main.rs は
use ohkami::prelude::*;
#[tokio::main]
async fn main() -> Result<(), lambda_runtime::Error> {
let o = Ohkami::new((
"/".GET(|| async {"Hello, AWS Lambda!"}),
));
lambda_runtime::run(o).await
}
となっていて、普通の Ohkami
インスタンスを lambda_runtime::run
に渡すだけです。
これを
cargo lambda build <flags>
cargo lambda deploy <flags>
するとデプロイできます。詳細はプロジェクトテンプレートの README を見てください。
サンプル
2月8日現在 https://ddhryperz4xvp6hji4bhxcinhu0qesbi.lambda-url.ap-northeast-1.on.aws
で動かしてます。
2月8日現在 https://75p6fhc2rwn3yefkmvhiyerely0xhhqx.lambda-url.ap-northeast-1.on.aws
で動かしてます ( curl
で叩く場合 --no-buffer
をつけるとよいです ) 。
Discussion