はじめに
ランタイムバージョンの更新動作について、公式の開発ガイド見てたら面白そうだったので、調べてみました。
前提
ランタイムとは?
Lambdaがサポートするプログラミング言語ごとの実行環境です。
Lambda は、ランタイムの使用により複数の言語をサポートします。ランタイムは、Lambda と関数の間の呼び出しイベント、コンテキスト情報、レスポンスを中継する言語固有の環境を提供します。Lambda が提供するランタイムを使用することも、独自に構築することもできます。
プログラミング言語のメジャーリリースにはそれぞれ別個のランタイムがあり、固有のランタイム識別子 (nodejs22.x または python3.13 など) を持っています。
メジャーリリースは自動更新されない。
メジャーリリースの自動更新はされません。
プログラミング言語のメジャーリリースにはそれぞれ別個のランタイムがあり、固有のランタイム識別子 (nodejs22.x または python3.13 など) を持っています。新しいメジャー言語バージョンを使用するように関数を設定するには、ランタイム識別子を変更する必要があります。AWS Lambda はメジャーバージョン間の下位互換性を保証できないため、これは顧客が主導権を持つ操作です。
つまり、ランタイム設定で選べる項目を跨ぐ更新(Python3.11→3.12)のような更新は私たちユーザの責任で行う必要があります。
マイナーバージョンリリースが自動更新対象。
Lambdaが自動更新するは、マイナーバージョンリリースです。
Lambda は、セキュリティ更新、バグ修正、新機能、パフォーマンス強化、およびマイナーバージョンリリースのサポートを使用して、各マネージドランタイムを最新の状態に保ちます。
更新方法
更新方法は3種類あります。
基本は自動
を推奨とのことですが、稀に関数の動作に影響が出るらしく、残りの2つのオプションが用意されているとのこと。
現在のランタイムバージョンはどれだっけ?
INIT_START
のログを見ればわかります。
Python 3.11
2024/1時点で、3.11.v44
でした。
INIT_START Runtime Version: python:3.11.v44 Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:b1c790bce6ec3c3a14a715f557a25d2daffc580e2fa1439a9ee32ac12f1dd582
print(sys.version)
で、現在のバージョンを表示させたところ、3.11.10 (main, Sep 24 2024, 11:02:55) [GCC 7.3.1 20180712 (Red Hat 7.3.1-17)]
となっています。
Pythonのサイト覗いてみると、最新は3.11.11
みたいですね。
v44
というのは、Python公式のものではなく、AWSが管理するランタイムのマイナーバージョンです。
3.11.v44
のラインタイムのPythonは3.11.10
みたいな対応表を探してみましたが、見つけることができませんでした。
Node.js 18.x
2024/1時点で、nodejs:18.v57
でした。
INIT_START Runtime Version: nodejs:18.v57 Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:8865cfc6a1d3f2dfabf5c509eaa9fbd70aa12fa4bbe614047030158c21978bcc
console.log(process.version);
で現在のバージョンを表示させたところ、v18.20.4
となっています。
Nodejsのサイト覗いてみると、最新はv18.20.5
みたいですね。
CloudWatch Contributor Insightでランタイム監視
どのランタイムが使われているかはログを見ればわかるのですが、長期間にわたってどのように更新されていくかを確認する方法として、CloudWatch Contributor Insightを使った方法が提案されていました。
以下のルール定義を利用すると、"/aws/lambda/*"
に該当するロググループのINIT_START
ログから、runtimeVersion
および、runtimeVersionArn
の遷移を時系列に見ることができます。
{
"Schema": {
"Name": "CloudWatchLogRule",
"Version": 1
},
"AggregateOn": "Count",
"Contribution": {
"Filters": [
{
"Match": "eventType",
"In": [
"INIT_START"
]
}
],
"Keys": [
"runtimeVersion",
"runtimeVersionArn"
]
},
"LogFormat": "CLF",
"LogGroupNames": [
"/aws/lambda/*"
],
"Fields": {
"1": "eventType",
"4": "runtimeVersion",
"8": "runtimeVersionArn"
}
}
グラフを見て気づきましたが、INIT_START
は実行環境を作るときに出るログなので、実行環境を使い回ししている場合(短期間の複数回リクエスト、SnapStart)は検出しません。
まとめ
基本、自動更新は後方互換があるものを対象としているはずです。
あまりランタイムバージョンの更新について、詳しく理解しておく必要はないかもですが、いざ不可解な問題が起きたときに役に立ちそうだなと思い、紹介してみました!