AWS Lambdaのランタイムバージョン更新動作について

## はじめに

ランタイムバージョンの更新動作について、公式の開発ガイド見てたら面白そうだったので、調べてみました。

## 前提

### ランタイムとは？

Lambdaがサポートするプログラミング言語ごとの実行環境です。

![スクリーンショット 2025-01-08 5.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/20ea2f87-d561-4b6a-d7bd-8c94bf7a0f09.png)

> Lambda は、ランタイムの使用により複数の言語をサポートします。ランタイムは、Lambda と関数の間の呼び出しイベント、コンテキスト情報、レスポンスを中継する言語固有の環境を提供します。Lambda が提供するランタイムを使用することも、独自に構築することもできます。
 プログラミング言語のメジャーリリースにはそれぞれ別個のランタイムがあり、固有のランタイム識別子 (nodejs22.x または python3.13 など) を持っています。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

### メジャーリリースは自動更新されない。

メジャーリリースの自動更新はされません。

> プログラミング言語のメジャーリリースにはそれぞれ別個のランタイムがあり、固有のランタイム識別子 (nodejs22.x または python3.13 など) を持っています。新しいメジャー言語バージョンを使用するように関数を設定するには、ランタイム識別子を変更する必要があります。AWS Lambda はメジャーバージョン間の下位互換性を保証できないため、これは顧客が主導権を持つ操作です。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

つまり、ランタイム設定で選べる項目を跨ぐ更新（Python3.11→3.12）のような更新は私たちユーザの責任で行う必要があります。

### マイナーバージョンリリースが自動更新対象。

Lambdaが自動更新するは、マイナーバージョンリリースです。

> Lambda は、セキュリティ更新、バグ修正、新機能、パフォーマンス強化、およびマイナーバージョンリリースのサポートを使用して、各マネージドランタイムを最新の状態に保ちます。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-update.html

## 更新方法

更新方法は３種類あります。

![スクリーンショット 2025-01-08 4.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/36fd926a-eb85-700f-5745-9d84b2e2fafe.png)

基本は`自動`を推奨とのことですが、稀に関数の動作に影響が出るらしく、残りの２つのオプションが用意されているとのこと。

### 現在のランタイムバージョンはどれだっけ？

`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`みたいですね。

https://docs.python.org/release/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`みたいですね。

https://github.com/nodejs/node/releases/tag/v18.20.5

## CloudWatch Contributor Insightでランタイム監視

どのランタイムが使われているかはログを見ればわかるのですが、長期間にわたってどのように更新されていくかを確認する方法として、CloudWatch Contributor Insightを使った方法が提案されていました。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtime-management-identify.html

以下のルール定義を利用すると、`"/aws/lambda/*"`に該当するロググループの`INIT_START`ログから、`runtimeVersion`および、`runtimeVersionArn`の遷移を時系列に見ることができます。

```json
{
  "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"
  }
}
```

![スクリーンショット 2025-01-08 5.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/44f0061e-2c3c-9df8-f61e-305119250bd5.png)

グラフを見て気づきましたが、`INIT_START`は実行環境を作るときに出るログなので、実行環境を使い回ししている場合（短期間の複数回リクエスト、SnapStart）は検出しません。

## まとめ

基本、自動更新は後方互換があるものを対象としているはずです。

あまりランタイムバージョンの更新について、詳しく理解しておく必要はないかもですが、いざ不可解な問題が起きたときに役に立ちそうだなと思い、紹介してみました！