サーバーレスRust〜AWS LambdaとRustのマリアージュ〜

60b23f3de35058180807f35b623fcf83?s=47 コン
November 26, 2018

サーバーレスRust〜AWS LambdaとRustのマリアージュ〜

AWS Lambda。サーバを管理しなくても簡単にクラウドでコードを実行できる。そんな便利サービスでRustコードも実行したい。そもそも可能か?

従来なやり方を紹介した上で、新しいやり方の説明。Goバイナリのフリをして実行するという若干ハックっぽい仕組みだが、綺麗に動くのだ。

最後は現在開発中のLambdaで簡単に超並行処理ができるライブラリの予告編的な話。

60b23f3de35058180807f35b623fcf83?s=128

コン

November 26, 2018
Tweet

Transcript

  1. サーバーレスRUST AWS LAMBDAとRUSTのマリアージュ PYRY KONTIO ・ @GOLDDRANKS ・ GITHUB.COM/GOLDDRANKS

  2. 自己紹介 • Pyry Kontio コンティオ プル (あだ名として「コン」でいい) • フィンランド出身 •

    ソフトウェアエンジニア歴2年弱、Rust使用歴4年強 • Rustへの愛がとまらない
  3. AWS LAMBDAはご存知ですか? • サーバーレス = マネージドサービス → 楽 • 短いバッチ処理などに便利

    • (最近制限時間が15分に延長された) • 計算量で、使う部分だけ支払う • やすい
  4. 対応言語(LAMBDA関数を書ける言語) • Python • JavaScript • Java • C# •

    Go
  5. RUSTは使えない?!

  6. RUSTは使えない?! • 実は使える! • でもPythonなどでラッピングしないといけない • PythonからRustのバイナリーを呼び出す • 参考に •

    https://github.com/softprops/serverless-rust • https://github.com/ilianaw/rust-crowbar
  7. ちなみにAWS LAMBDAで走るバイナリを作るには? • MUSLを使いましょう! → バイナリはどこでも走る • Dockerを使いましょう! → ビルドはどこでもできる

    • https://github.com/golddranks/rust_musl_docker
  8. …っていうのは従来のやり方! • Rustのプログラムは必ずバイナリである! • Goも同じ • つまり、AWS Lambdaは生のバイナリを実行する機能はついてる! • なんとか、Goになりすませたら???

  9. 新しいやり方(王道) • https://github.com/srijs/rust-aws-lambda

  10. 仕組み ・ イベントのエンコーディング • Lambda環境はGoバイナリにイベントを送る • GOBという、Go特有のエンコーディング • GOBを読み取るライブラリを使えばイベントが読める •

    https://github.com/srijs/rust-gob
  11. 仕組み ・ イベントの型 • イベントの種類はたくさんある • それぞれに型(structやenum)を定義するのは大変 • Goのコードをベースにして、Rustの型を自動的に生成する

  12. 仕組み ・ ランタイム • Lambdaが呼び出されたらバイナリを起動させられる • 連続で呼び出すと、起動、停止時間がもったいない → すぐには停止せず、サーバーのようにイベントを待っている •

    本来はGoのRPCモジュールでコミュニケーション • この機能をRustにおいてTokioで再現
  13. 動いているよ!

  14. 動いているよ!

  15. 新しいやり方(王道) • https://github.com/srijs/rust-aws-lambda

  16. LAMBDAを効率的に利用するには?予告編! • 簡単な並行処理の事例: Rayon • イテレータ → 平行イテレータ • でも、大体4スレッドしか使えない?

    • Lambdaで400スレッド一気に使える! → Lambdaを呼び出す超平行イテレータ
  17. 簡単にLAMBDAで並行処理できるフレームワーク • 処理の分け方を定義すればスケーリングを自動的にやってくれる • 現在準備中(この発表に間に合わなかった…) • そのうち正式に発表します。

  18. ご清聴ありがとうございました!