Slide 1

Slide 1 text

© 2024 Finatext Ltd. RustでAWS Lambda functionを いい感じに書く 1 Finatext @taiki45

Slide 2

Slide 2 text

© 2024 Finatext Ltd. ● Taiki Ono ● ソフトウェアエンジニア ○ Platform engineering and developer productivity ● 登壇系だと2018-2019にサービスメッシュ関連 ○ Envoy proxy ● 2022 8月~ Finatext 2 taiki45

Slide 3

Slide 3 text

© 2024 Finatext Ltd. 3

Slide 4

Slide 4 text

© 2024 Finatext Ltd. ● AWSのコンピューティング方面のサーバーレスなやつ ● FaaS的な 4 AWS Lambda

Slide 5

Slide 5 text

© 2024 Finatext Ltd. ● 手元での動作確認を手軽にできるようにしたい ● テストを手軽に書けるようにしたい ● 既存の便利ライブラリの恩恵を受けたい ● あわよくばLambda以外でも動かしたい 5 Lambda functionを実装する時の課題

Slide 6

Slide 6 text

© 2024 Finatext Ltd. ● github.com/awslabs/aws-lambda-rust-runtime のREADMEはそっ閉じする ● HTTP requests受ける系 ○ axumを使う ○ towerの上に載せれるweb frameworkならなんでもOK ● その他: EventBridge、SQSなどのイベント駆動 ○ lambda_runtime::service_fn直じゃなく抽象レイヤー1枚入れる ○ Handlerみたいな構造体にいろいろ持たせると便利 6 いい感じに実装する

Slide 7

Slide 7 text

© 2024 Finatext Ltd. ● tower::Serviceとは ○ Composable Service ● lambda_http::runはServiceを受け取る ○ lambda_runtime::runも同様 ● axum::RouterとかはServiceを実装している ○ Composableだしlambda_http::runにも渡せる 7 HTTP受け取る系: tower::Service Service ::poll_ready ::call Service ::poll_ready ::call Service ::poll_ready ::call Service ::poll_ready ::call Service ::poll_ready ::call Request Response

Slide 8

Slide 8 text

© 2024 Finatext Ltd. ● tower::httpの各種ミドルウェア ○ ServiceBuilder, Stack, impl Fn(&Request) -> Span>, Stack, Stack>>>>>> ○ NormalizePath ■ ミドルウェアスタックの型はRouterで吸収テク ■ apply_middleware(Router) -> Router ● tower::ServiceExt::oneshotでテスト実行できる ● lambda_http::runに渡さず別の実行関数に渡せばLambdaの外でも動かせる ○ axumの場合axum::serve ● axumみたいなライブラリのルーティング機能を使える ○ shared stateみたいなのも自分で実装しなくて便利 ○ extractorみたいなのも便利 ○ (これ以外はlambda_http::service_fnを使ってもできるはできるはず) 8 towerの上に乗るメリット

Slide 9

Slide 9 text

© 2024 Finatext Ltd. ● lambda_runtime::service_fn直じゃなく抽象レイヤー1枚入れる ○ Handlerみたいな構造体にいろいろ持たせると便利 ● 手元で一発実行するだけのoneshotコマンドをclapとかで作ると動作確認に便利 ● イベントソースからイベント受け取るようなHTTPサーバーを作ってその中で処理を動かす と、手元の動作確認やインテグレーションテスト用に便利 ○ Lambda外で動かす道筋にもなる 9 その他: EventBridge、SQSなどのイベント駆動

Slide 10

Slide 10 text

© 2024 Finatext Ltd. 10 その他: Lambdaで動かす時

Slide 11

Slide 11 text

© 2024 Finatext Ltd. 11 その他: 手元でOneshotに動かす時

Slide 12

Slide 12 text

© 2024 Finatext Ltd. 12 その他: HTTP serverの裏で動かす時

Slide 13

Slide 13 text

© 2024 Finatext Ltd. 13 その他: Handler

Slide 14

Slide 14 text

© 2024 Finatext Ltd. 14 なぜそのような仕組みが動くのだろう?🤔 →→→

Slide 15

Slide 15 text

© 2024 Finatext Ltd. 15 完全理解: Rust with AWS Lambda

Slide 16

Slide 16 text

© 2024 Finatext Ltd. 16 AWS Lambda https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html

Slide 17

Slide 17 text

© 2024 Finatext Ltd. Container Process 17 AWS Lambda and Rust Lambda service Lambda runtime event loop Runtime ::run_with_incoming trait Service ::call service_fn(|event: LambdaEvent ...) 色々 /runtime/invocation/next /runtime/invocation/ /response polling 色々 Runtime event loopはmultiplexingしない😳

Slide 18

Slide 18 text

© 2024 Finatext Ltd. Container Process 18 AWS Lambda and Rust Lambda service Lambda SDK event loop Runtime ::run_with_incoming trait Service ::call service_fn(|event: LambdaEvent ...) 色々 /runtime/invocation/next /runtime/invocation/ /response polling 色々

Slide 19

Slide 19 text

© 2024 Finatext Ltd. 19 AWS Lambda and Rust Lambda SDK event loop Runtime ::run_with_incoming trait Service ::call service_fn(|event: LambdaEvent ...) Runtime::new(handler: F) wrap_handler(handler, ... CatchPanicService::new(handler) RuntimeApiResponseService::new(safe_service) RuntimeApiClientService::new(response_service, ... RuntimeApiResponseService::call内部でLambdaInvocation (Lambda serviceからのレスポンスで実際のevent payloadが入っている)のbody をdeserializeしてevent struct Tに変換している

Slide 20

Slide 20 text

© 2024 Finatext Ltd. 20 AWS Lambda and Rust: HTTP lambda_http::run(handler: Service<...>) Service::call Adapter::call(..., req: LambdaEvent) LambdaRequest -> Request (http::Request) lambda_runtime::run(Adapter::from(handler)) Adapterに変換を任せてあとは lambda_runtime::runの上で動かす

Slide 21

Slide 21 text

© 2024 Finatext Ltd. ● AWS Lambda functionを実装する時のデザインパターンについて紹介しました ● AWS Lambdaとaws-lambda-rust-runtimeの仕組みについてはブログ記事として投稿しま す! ○ aws-lambda-goも扱っています ● このデザインパターンを使って開発したorguというGitHub org-wide workflowsを実現する ソフトウェアをOSSとしてリリース予定なのでお楽しみに ○ 7/9にあるPlatform Engineering Kaigiでもトーク内で扱う予定です! ● 「実用Rustアプリケーション開発」というZenn本を最近書きました! ○ https://zenn.dev/taiki45/books/pragmatic-rust-application-development ● これからもおもしろいと思う情報発信をしていくのでXのフォローをよければお願いします! ○ https://twitter.com/taiki45 Finatextはとてもいい会社かつ絶賛採用中なので興味のある方はぜひ見てみてください! https://speakerdeck.com/finatext/finatext-are-hiring-engineers 21 おわりに

Slide 22

Slide 22 text

© 2024 Finatext Ltd. 22