Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust on AWS Lambda @Osaki.rs

110416
February 27, 2025
31

Rust on AWS Lambda @Osaki.rs

AWS Lambda における Rust の活用についてのプレゼンテーションの要約です:
主なトピック:
Rust で Lambda を使用する動機
技術的なソリューションと実装の詳細
デプロイメントとインフラストラクチャの考慮事項
説明された主要な技術コンポーネント:
カスタム Lambda ランタイムを実装するための lambda_runtime クレート
Lambda 関数のビルドとデプロイのための Cargo Lambda
コード整理のための Cargo Workspaces
横断的関心事に対応する Lambda Extensions

開発ツールと機能
開発中のホットリロード用 cargo lambda watch
デプロイメント用 cargo lambda build と cargo lambda deploy
AWS サービス(S3、DynamoDB など)との統合
対処された課題:
ビルド速度の最適化
アプリケーションとインフラの疎結合化
依存関係とクロスコンパイルの管理
ビルド最適化戦略(rust-cache、sccache、代替リンカーなど)
このプレゼンテーションは、AWS Lambda 関数での Rust の実践的な実装の詳細とベストプラクティスに焦点を当てている。

110416

February 27, 2025
Tweet

Transcript

  1. WHO AM I GitHub: https://github.com/i10416 SpeakersDeck: https://speakerdeck.com/i10416 Rust で gRPC

    サーバーを書いたり AWS Lambda を書いたりツールを 書いたり社内勉強会を開催したり...
  2. Rust on AWS Lambda: Motivation Rust で Lambda を書きたい Lambda

    をシンプルにデプロイしたい Lambda のアプリケーションとインフラを疎結合にしたい
  3. Rust で Lambda を書きたい: Why Rust on Lambda 画像変換処理などの CPU

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

    内部的には以下のループ処理を実行している 1. エンドポイント( runtime/invocation/next )にアクセスして次のイベント情報(JSON) を得る 2. イベントをパースする 3. イベント情報をアプリケーションの実装に引き渡す 4. アプリケーションの処理の結果をエンドポイント( runtime/invocation/{req id}/response )に渡す
  5. アプリケーションを開発するには他に aws-config 認証情報や設定の読み込みなどをよしなにやってくれる crate GCP でいう Application Default Credentials aws-sdk-*

    Lambda や S3 などの SDK aws_lambda_events AWS Lambda 用の型がまとめられた crate AWS のリソース(s3, eventbridge, etc.)ごとに feature が切られている などの crate が必要
  6. Lambda をシンプルにデプロイしたい: Cargo Lambda Cargo Lambda で何ができるか Lambda アプリケーションのローカルデバッグ Lambda

    アプリケーション・Extensionのビルド Arm <-> x86_64 のクロスビルド Lambda アプリケーション・Extensionのデプロイ
  7. ├── Cargo.lock ├── Cargo.toml ├── README.md ├── flake.lock ├── flake.nix

    ├── modules │ ├── application: Lambda 関数の実装 │ ├── core: コアロジック │ └── extension: Lambda Extension ├── rust-toolchain
  8. デプロイ cargo lambda build コマンドや cargo lambda build --extension コマンドで、

    AWS Lambda で動作するアプリケーションがビルドできる cargo lambda deploy コマンドでアプリケーションや Extension をデプロイできる
  9. Cargo Workspace を活用する cargo workspace を活用して AWS Lambda に依存する部分 アプリケーションのコア実装

    I/O を伴わない変換処理 I/O を伴う処理 横断的関心ごと 初期化処理 を意識して sub-crate として分割します
  10. Rust のビルド速度改善(特に CI)で試していること crate の分割 Swatinem/rust-cache@v2 sccache + GCS GitHub

    Actions の Runner は US にいるので US region に配置 lld や mold linker を変えたら速くなると思いきやほとんど変わらないか遅くなることも... これをしたらビルドが爆速になったよ! というのがあれば懇親会で教えてください!