[アップデート] AWS Lambdaで新しい「ランタイム管理設定」が追加されました

2023.01.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

本日よりAWS Lambdaにおいてランタイム内部の更新(セキュリティ更新やAWS SDKの更新など)を制御するための「ランタイム管理設定」が新たに追加されました。

AWSからはブログの形で詳細が紹介されています。

本記事ではこの設定について簡単に解説します。

ランタイム管理設定

Lambdaはサーバーレスなサービスではありますが、その実体としてはMicro VM上で関数を実行しています。
Micro VMのOSはAmazon Linux 2(一部ランタイムはまだAmazon Linux)であり、OSおよび内部にある各種コンポーネント類はAWSにより自動で更新されています。

今回新たに「ランタイム管理設定」という設定が増え、このランタイム内部の更新タイミングをユーザーが制御できる様になりました。

注意 : ランタイムそのもののバージョン制御ではない

ランタイムという表現がちょっと誤解を招きやすいのですが、プログラミング言語のバージョンと対になるランタイム(Python 3.8Python 3.9など)そのものに対する制御では無いのでご注意ください。

たとえばPython 3.8というランタイムにおける Python 3.8-内部バージョンv1Python 3.8-内部バージョンv2 といった形の更新を制御するものです。
Python 3.8Python 3.9 への更新は従来通り手動で行う必要があります。 *1

設定の種類

ランタイム管理設定では以下の3種の設定が可能です。

1. Auto (自動)

デフォルト設定でありAWS推奨の設定となります。
これまで通りAWSが自動でランタイムの自動更新を行う形です。

ただ、手順としては従来のものとは異なる2フェーズのロールアウトとなるとのことです。
従来は新しいバージョンが各リージョンのすべての関数に順次適用されいく形でしたが、現在は

  1. 第一フェーズ : 新規に作成された関数や明示的に更新した(UpdateFunctionCodeUpdateFunctionConfigurationAPIを呼んだ)関数だけ新しいバージョンのランタイムを使う

  2. 第二フェーズ : その後、ランタイム管理設定をAutoにしている関数で順次新しいバージョンのランタイムを使う様になる

といった二段階の更新となります。
ざっくり言ってしまえば「新規関数でしばらく様子見してから自動更新する」様に変わった感じですね。  

2. FunctionUpdate (関数の更新)

こちらは新しい設定で、ユーザーが関数を更新した時だけランタイムを更新する設定となります。

Autoとの違いとしては、第二フェーズになってもランタイムが自動更新されない点となります。
ユーザー自身で関数を更新してはじめて新しいバージョンが使用されます。

この設定は定期的に関数を更新する環境での利用を想定しています。
例を挙げると、CI/CDにより定期的に関数を更新する環境でリリース時のランタイムバージョンを厳密に扱いたい場合に使います。

逆に定期的に関数を更新しない環境では使ってはいけません。デフォルトのAutoのままにしてください。

3. Manual (手動)

最後はランタイムの更新を行わず利用バージョンを明示的に固定する設定となります。

これは通常使うものでは無く、たとえば「ランタイム内部の更新が起因となって発生してしまった問題に対処するために以前のバージョンを明示して使う」といった用途で使います。
あくまでも「一時的なロールバック」のためのものです。

ランタイム管理設定と責任共有モデル

ランタイム管理設定はLambda基盤の更新に関するものであるため責任共有モデルとも関連します。

細かい話は以下のドキュメントで確認していただきたいですが、設定によりユーザーの責任範囲が変わるので十分理解したうえで変更する必要があります。

ドキュメントにある表から引用するとざっくり以下の通りです。

設定内容 Lambdaの責任範囲 ユーザーの責任範囲
Autoに設定 最新のパッチが適用されたバージョンを公開し、既存の関数に最新のパッチを適用する。 新しいバージョンに起因する問題が起きた場合は以前のバージョンにロールバックする。
FunctionUpdateに設定 最新のパッチが適用されたバージョンを公開する。 定期的に関数を更新し最新のバージョンにする。
定期的に関数を更新出来ない場合はAutoに設定を変える。
新しいバージョンに起因する問題が起きた場合は以前のバージョンにロールバックする。
Manualに設定 最新のパッチが適用されたバージョンを公開する。 この設定は新しいバージョンに起因する問題が起きた場合だけ使用する。
できるだけ早めにAutoまたはFunctionUpdateに設定を変える。
コンテナイメージを使う場合 最新のパッチが適用されたコンテナイメージを公開する。 定期的に最新のイメージで再デプロイする。

確認してみた

今回はざっくり設定画面まわりだけ確認します。

Lambda関数の「コード」タブにある「ランタイム設定」欄に新たに「ランタイム管理設定」が増えています。

設定画面を開くとこんな感じです。
画面の説明を見ると設定の意図が明瞭に伝わりますね。

関数の更新を選ぶと警告が表示されます。

手動を選ぶとテキストボックスが表示され、固定したいバージョンのARNを入力する形になります。

ランタイムバージョンARNの確認

ランタイムバージョンARNは前掲の設定画面から確認するか、関数の実行ログ(CloudWatch Logs)から確認できます。
今回の更新でコールドスタート時に新しいINIT_STARTで始まるログが出力される様になっています。

# コールドスタート時の最初に出力されるログ
INIT_START Runtime Version: python:3.9.v16	Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:07a48df201798d627f2b950f03bb227aab4a655a1d019c3296406f95937e2525

ログを見るとランタイムバージョンARNだけでなく、python:3.9.v16といった内部バージョン(v16)を含めたランタイムバージョンも表示されます。

なお、ウォームスタート時はこのログは出ないのでご注意ください。

最後に

以上となります。

新しい設定が増えましたが、基本的にデフォルト設定のままにしておくべきものです。
Lambdaランタイム内部の更新に起因する問題が起きた時だけ緊急避難的に使うものだと考えておくと良いでしょう。

脚注

  1. 将来的にどうなるかまではわかりませんが、今のところランタイム自体のバージョンが更新されると明記されたドキュメントはありません。