最近(2022中期〜)のAWS Lambda + Rust
以前のRust製lambdaがたいへん古いのに、世間にあまりアップデートされた例が見られないためここに記録する。
比較的最近のやりかたの例 github.com
以前の書き方の例 AWS LambdaでRustを使う - 旅とプログラミングを少々
- lambda向けコード
lambda_runtimeとaws_lambda_eventsが用いられる。Go用SDKからの変換でRustの型を作っているため稀に型がおかしかったが、両方ともに日進月歩で改良されておりおおむね実用可能。 https://github.com/naokiri/clean_house_public/blob/master/apiauth/src/main.rs の例のようにlambda_runtime::runでLambdaEvent<inputの型> -> Result<outputの型> の関数を書くだけでlambdaが起動した時にmainでのセットアップを、そして各コールでrunの内容を走らせてくれる。
- AWS ライブラリ
rusotoはdeprecatedとなり、awslabsのSDKを用いるようになった。AWS SDK for Rust | aws-sdk-rust 非公式の間牽引してきたrusotoの作者の方々には感謝である。
- ビルド+パッケージング
以前はまだAmazon公式にはRustをサポートしていなかったためmusl向けにビルドした後、さらにコンテナ化していた。最近は https://docs.aws.amazon.com/sdk-for-rust/ の通り公式に様々なRustライブラリをサポートしはじめており、それらのリポジトリから読む限りcargo-lambdaでビルドすることが一般的のようである。さらにAWSがGravitonコアを推奨しているのでそれに従うと
cargo lambda --arm64
とコマンドを打つだけでアップロードすべきbootstrapが作成される。muslライブラリやらlibcの互換性やらの問題はもう考えなくとも良い。