AWSは、AWS Lambda最新バージョンのランタイムへのサポートを開始する。先日、同社はRuby 3.2ランタイムのサポートを発表した。
Ruby 3.2では、匿名引数渡しの進化、endless
メソッドの追加、正規表現の改良、新しいDataクラスの導入、TimeとMatchDataのパターンマッチ機能の強化、パターンマッチ内での「find pattern」サポートの搭載など、さまざまな機能強化とアップグレードが行われている。
AWSのシニアソリューションアーキテクトであるPraveen Koorse氏は、AWS Computeのブログ記事で、Ruby 3.2は無名引数の取り扱いを強化し、コードにおける引数の利用を単純化、効率化すると述べている。このアップデート以前、無名引数をメソッドに渡すには委譲パターンや Module#ruby2_keywords を使用し *argsや&block に委譲していた。しかし、この方法は直感的でなく、特に複数の引数を扱う場合には明確さに欠けるものであった。
現在、メソッド宣言に無名の位置引数やキーワード引数が含まれている場合、それらは引数として次のメソッドに渡すことができる。無名ブロック転送(anonymous block)の利点は、restやキーワードrestの引数転送にも同じように適用される。
def keywords(**) # キーワード引数を受け付ける
foo(**) # 次のメソッドに渡す
end
def positional(*) # 位置引数を受け付ける
bar(*) # 次のメソッドに渡す
end
def positional_keywords(*, **) # 同じく
foobar(*, **)
end
また、Ruby 3では「endlessメソッド」という新機能が導入され、def method() = statement という、たった1つの構文でだけでメソッドを定義できるようになった。この構文では、明示的なendキーワードが不要になり、簡潔なワンライナーとしてメソッドを定義することが可能。これにより、基本的なユーティリティ・メソッドの作成が容易になり、よりクリーンなコードの作成、コードの可読性の向上、保守性の向上に寄与する。
def dbg_args(a, b=1, c:, d: 6, &block) = puts("Args passed: #{[a, b, c, d, block.call]}")
dbg_args(0, c: 5) { 7 }
# 出力: Args passed: [0, 1, 5, 6, 7]
def square(x) = x**2
square(100)
# => 10000
Lambda関数のデプロイにRuby 3.2を利用する場合、開発者は次のステップを踏むことができる。また、AWS CLI、AWS Serverless Application Model(AWSSAM)、AWS CloudFormationを活用して、Ruby 3.2でコーディングされたサーバーレスアプリケーションのデプロイと管理ができる。さらに、開発者は、AWSが提供するRuby 3.2ベースイメージの、コンテナイメージを使用してRuby 3.2機能を構築およびデプロイすることも可能である。
BoltOps Cloud Infrastructure Consultancyの創設者であるTung Nguyen氏は、次のようにツイートしている。
AWS Lambda Ruby 3.2上でJets v4デモアプリをデプロイしました。成功です!もうCustom Runtime Lambda Layerを使う必要はありません。
また、Ruby 3.2対応のAWS Lambdaに関するRedditスレッドの回答者は、次のように述べている。
コンテナを使おう。そして、AWSが何をサポートしているか心配するのはやめよう。
さらに別の者はこう回答している。
そして、自分のランタイムを管理することもできますよ?
AWS Lambda以外の競合のFunction as a Service(FaaS)提供は、Azure Functionsのように、どのRubyランタイムバージョンもサポートしない。ユーザーは、Azure Functionsのワークアラウンドを通じてRuby(古いランタイム)を活用することができる。一方、Google Cloud FunctionsはRubyランタイムをサポートしており、その中には同社が使用を推奨している3.2も含まれる。
最後に、Ruby 3.2はRubyの最新の長期サポート(LTS)リリースである。AWSは、Ruby 3.2のマネージドランタイムとAWSが提供するRuby 3.2のベースイメージに対して、アップデートやセキュリティパッチが利用可能になると、自動的に反映される予定だ。
Ruby 3.2での関数の書き方について詳細は、デベロッパーガイドで参照できる。