Slide 1

Slide 1 text

Rust on AWS Lambda @ 2025/02/27 Osaki.rs by 110416

Slide 2

Slide 2 text

WHO AM I GitHub: https://github.com/i10416 SpeakersDeck: https://speakerdeck.com/i10416 Rust で gRPC サーバーを書いたり AWS Lambda を書いたりツールを 書いたり社内勉強会を開催したり...

Slide 3

Slide 3 text

Scala も書いてます 最近だと toml-scala のマクロの Scala 3 対応をやっていました https://github.com/indoorvivants/toml-scala/releases/tag/v0.3.0

Slide 4

Slide 4 text

Rust on AWS Lambda: Motivation Rust で Lambda を書きたい Lambda をシンプルにデプロイしたい Lambda のアプリケーションとインフラを疎結合にしたい

Slide 5

Slide 5 text

Solution lambda runtime Cargo Lambda Cargo Workspaces Lambda Extension

Slide 6

Slide 6 text

Rust で Lambda を書きたい: Why Rust on Lambda 画像変換処理などの CPU インテンシブで native の依存が入りがちな処理の開発体験を 改善したい e.g. 画像の avif への変換 複雑なデータの変換処理を型で安全にしたい 生データ -> 中間データ群 -> 完全なデータ Lambda が増えると処理が散らばるので型で整合性を保証したい アプリケーションをマイクロライブラリ群として設計したい Rust はそのツール・エコシステムが揃っている Cargo Workspace & feature flags git dependencies・AWS Code Artifact

Slide 7

Slide 7 text

Rust で Lambda を書きたい: Lambda Runtime lambda_runtime は Lambda のカスタムランタイムの実装 内部的には以下のループ処理を実行している 1. エンドポイント( runtime/invocation/next )にアクセスして次のイベント情報(JSON) を得る 2. イベントをパースする 3. イベント情報をアプリケーションの実装に引き渡す 4. アプリケーションの処理の結果をエンドポイント( runtime/invocation/{req id}/response )に渡す

Slide 8

Slide 8 text

アプリケーションを開発するには他に aws-config 認証情報や設定の読み込みなどをよしなにやってくれる crate GCP でいう Application Default Credentials aws-sdk-* Lambda や S3 などの SDK aws_lambda_events AWS Lambda 用の型がまとめられた crate AWS のリソース(s3, eventbridge, etc.)ごとに feature が切られている などの crate が必要

Slide 9

Slide 9 text

Lambda をシンプルにデプロイしたい: Cargo Lambda Cargo Lambda で何ができるか Lambda アプリケーションのローカルデバッグ Lambda アプリケーション・Extensionのビルド Arm <-> x86_64 のクロスビルド Lambda アプリケーション・Extensionのデプロイ

Slide 10

Slide 10 text

Example cargo lambda init でテンプレート を生成することもできるが、 Cargo Workspace を使いたいのでアウ トラインを用意した https://github.com/i10416/rust-on- lambda

Slide 11

Slide 11 text

├── Cargo.lock ├── Cargo.toml ├── README.md ├── flake.lock ├── flake.nix ├── modules │ ├── application: Lambda 関数の実装 │ ├── core: コアロジック │ └── extension: Lambda Extension ├── rust-toolchain

Slide 12

Slide 12 text

cargo lambda watch で Lambda の関数をホットリロードしながら開発できる 関数を呼び出すには cargo lambda invoke コマンドを呼ぶ cargo lambda invoke application --data-ascii '{}'

Slide 13

Slide 13 text

Extension を追加する cargo lambda watch でエミュレータを動かした上で extension を起動する cargo run -p extension

Slide 14

Slide 14 text

Extension とは Lambda 関数の起動時・シャットダウン時の共通処理の実装 ロギング・Tracing など、Lambda の横断的な関心ごとをアドオン的に追加できる仕組み

Slide 15

Slide 15 text

デプロイ cargo lambda build コマンドや cargo lambda build --extension コマンドで、 AWS Lambda で動作するアプリケーションがビルドできる cargo lambda deploy コマンドでアプリケーションや Extension をデプロイできる

Slide 16

Slide 16 text

Lambda の辛いポイント アプリケーションとインフラの境界が曖昧になりがち

Slide 17

Slide 17 text

Cargo Workspace を活用する cargo workspace を活用して AWS Lambda に依存する部分 アプリケーションのコア実装 I/O を伴わない変換処理 I/O を伴う処理 横断的関心ごと 初期化処理 を意識して sub-crate として分割します

Slide 18

Slide 18 text

Rust の辛いポイント ビルドが遅い

Slide 19

Slide 19 text

Lambda のよくあるユースケース 1. s3 のイベントを検知して 2. ファイルを読み出して 3. 何らかの加工を施して 4. DynamoDB や S3 に書き込んで 5. ...

Slide 20

Slide 20 text

インフラリソースのグルーコードとしてのLambda Lambda と他の AWS のサービスを組み合わせて使う構成では、Lambda はインフラリソース 間を繋ぐグルーコードの役割を果たすので、インフラ構成と同期させたい

Slide 21

Slide 21 text

ソースコードもterraform で管理し変更があったら Lambda を際デプロイ( terraform apply )するワークフローを組みたいが...

Slide 22

Slide 22 text

Rust のビルド速度改善(特に CI)で試していること crate の分割 Swatinem/rust-cache@v2 sccache + GCS GitHub Actions の Runner は US にいるので US region に配置 lld や mold linker を変えたら速くなると思いきやほとんど変わらないか遅くなることも... これをしたらビルドが爆速になったよ! というのがあれば懇親会で教えてください!