TUNAGで利用しているAWS LambdaでRuby 3.2 runtimeに爆速対応した

アーキテクチャ図(完了後)

こんにちは。当社がスポンサー参加したRubyKaigi 2023が終わって1ヶ月以上経ち、6月は海外カンファレンスも多く忙しい日々を過ごしています。

最近はまたTUNAG全般をいじっています。

TUNAGのメインアプリ(Ruby on Railsベース)は4月にRuby 3.0へのアップグレードしたのち、5月前半にはRuby 3.1へのアップグレードが完了していました(ブログ記事なし)。執筆時点では、Ruby 3.2へのアップグレードは進行中との噂です。

2019年6月開催の名古屋Ruby会議04でもご紹介した通り、コンテナ基盤で動くRubyベースサービスとは別に、AWS Lambda上で動かしているバックエンドサービスがあります。これらのサービスでは、AWS Lambda公式提供runtimeの都合上もあり、最新版であり、AWS独自のサポートによるruby2.7 (コミュニティから出ているRuby 2.7) を利用していました。(注:一部AWS Lambda ruby2.5 runtimeも動いていましたが、こちらも2023年5月までにAWS Lambda ruby2.7 runtimeへの移行が完了しています。)

当社のプロダクトでのAWS Lambdaの利用状況については以下をご覧ください。(記述は執筆当時のものであり、既にリアーキテクティングされたなどにより、他のアーキテクチャで置き換えられた可能性もあります)

tech.stmn.co.jp

我々のチームが技術検討した時点では、AWS Lambda ruby2.7 runtimeのサポート期日は、少なくとも2023年7月以降であると理解したため、急いでCustom runtimeを利用した基盤への移行を見送ることを決定していました。

アーキテクチャ図(当初)

(注: Ruby 3.2ベースのruntimeがGA公開されてから6ヶ月と定められていた、というのが当時記述されていたと思うのですが、現在の公式ドキュメントからは削除されているようで、また、履歴として、最近 deprecated 扱いとされてしまった awsdocs も調査しましたが、見つけられることができませんでした。完全に蛇足ですが、今回の調査の過程でも困った、 https://aws.amazon.com/blogs/aws/retiring-the-aws-documentation-on-github/ の公式の報告(Retiring the AWS Documentation on GitHub, on 17 MAY 2023, by Jeff Barr)にもある通り、AWS DocumentationがGitHub上で管理できなくなったのは残念な限りです。)

そんな中、Ruby 3.2 runtime now available in AWS Lambda by James Beswick | on 07 JUN 2023という朗報が先週入ってきました。

aws.amazon.com

それを眺めた時点では、追加のruntime移行タスクを2023年11月末(より詳細な日付としては12月7日ですが)までに積んでおけばいいかくらいの温度感で手元の仕事に戻っていました。

次の週になって、RubyKaigi 2023関連の文脈で1つのツイートが社内チャットに上記の記事をリツイートされてきたことにより、急遽ruby3.2 runtime移行を推進することになりました。AWS Serverless Application Model (SAM) を利用しているものの、包括的なDevOpsが不十分であったこともあり、一手間かけなくてはなりませんでしたが、2.xから3.xとメジャーバージョンアップであったにもかからず、半日とかからず、productionリリースに漕ぎ着けることができました。

Lambda(Management Console)

効果

Ruby 3.1, 3.2あたりの注目ポイントとしてはYet Another Ruby JITであるYJITが導入され、production-readyであることが挙げられます。しかし、デフォルトでは無効であるため、今回はYJITを有効にしない形で、アップデートリリースのみを優先しました。

移行したLambda Functionは外部APIとの接続が最も占める割合が多いのですが、それが含まれないInvocationのDuration(Lambdaプラットフォームで計測され提供される値)では10-20%の高速化が観測できました。これだけの高速化はコミュニティリリースのRuby 2.7 MRI→Ruby 3.2 MRI (YJITなし)のみで経験したことがない次元であり、Lambdaで活用しているCompute基盤で利用しているCPUアーキテクチャが最新版になったのかLambda内部の何らかの改善が寄与しているのではないかと感じました。ユーザー体験、コスト面的にはよくなっているのでそれでいいかという気持ちです。それ以上プラットフォーム内部に詳しくなってもしょうがないですし。

10-20%の高速化を実現したLambda Functionでは、正規表現が割と多用されており、Ruby 3.2での同機能の改善によるものかもしれません。

まとめ

Ruby 3.2.0がリリースされてから約半年した時点でAWS Lambda ruby3.2 runtimeがリリースされ、TUNAGプロダクトの一部で利用しているLambda functionで、ruby2.7→ruby3.2 runtimeの刷新を実施しました。特に問題が起きることなく、速度面、コスト面で若干の改善が見られました。

TUNAGへのYJITの本格導入や残りの半分ほどのruby2.7 runtimeのruby3.2 runtime完全移行、メインRailsアプリケーションのRuby 3.2移行、Ruby 3.3移行準備など、やりたいことがたくさんあるのですが、エンジニアが全く足りていません。

株式会社スタメンはRubyKaigi 2023ゴールドスポンサーです。Rubyを使う使わないに限らず、人と組織を強くする HR Tech SaaSプロダクトを作りながら技術でワクワクしたいソフトウェアエンジニアを全技術領域で募集しています。お得意の技術領域を問わずぜひカジュアルにお話ししましょう!

herp.careers

クレジット/おまけ

画像の一部にはAWS Architecture Icons (Release 16-2023.04.28)が利用されています。

aws.amazon.com

awsdocs/aws-lambda-developer-guide@192b0ef7doc_source/lambda-runtimes.md:

github.com

なお、今日の朝ご飯はシンガポールチキンライスでしたが、写真はありません。