Lambda のランタイムを変更する方法を教えてください

2022.08.18

困っていた内容

AWS から 現在使用している Lambda のランタイムを更新するよう通知が来ました。
Lambda のランタイムを更新するために、新しいランタイムに変更したいのですが、どのように変更すればよいのか教えてください。

どう対応すればいいの?

Lambda のマネジメントコンソールおよび Lambda の UpdateFunctionConfiguration API を使用して変更できます。

AWS 公式ドキュメントより

ランタイムまたはランタイムバージョンを変更するには
1.Lambda コンソールの [Functions] (関数) ページを開きます。
2.更新する関数を選択し、[Code] (コード) タブを選択します。
3.コードエディタの下にある [Runtime settings] (ランタイム設定) セクションまで下にスクロールします。
4.[Edit] を選択します。
5.[Runtime] (ランタイム) で、ランタイムのバージョンを選択します。
6.[Handler] (ハンドラ) で、関数のファイル名とハンドラを指定します。
7.アーキテクチャで、関数に使用する命令セットアーキテクチャを選択します。
8.[Save] を選択します。

やってみた

せっかくなので、以下の 5 つのパターンでランタイムを変更してみます。

1.Lambda のマネジメントコンソール
2.AWS CLI
3.CloudFormation
4.AWS SDK for JavaScript
5.AWS SDK for Python (Boto3)

1.Lambda のマネジメントコンソール

まずは、AWS 公式ドキュメントにも記載のある、Lambda のマネジメントコンソールでの変更をやってみます。

サンプルの関数として、ランタイムは Node.js 12.x で作成しました。

この関数のランタイムを、Node.js 16.x に変更してみます。
「ランタイム設定」右上の「編集」をクリックします。

ランタイムの一覧から「Node.js 16.x」を選択します。

その他の設定は変更せず、「保存」をクリックします。

画面上部に「関数 {関数名} が更新されました。」と表示され、ランタイムも Node.js 16.x に変更されました。

以上が Lambda のマネジメントコンソールでの変更手順です。

2.AWS CLI

AWS CLI での変更には、update-function-configuration コマンドを使用します。
ランタイムを変更する場合は、--runtime オプションを使用します。

今回は CloudShell から以下のコマンドで、再度サンプル関数のランタイムを Node.js 12.x から Node.js 16.x に変更してみます。

aws lambda update-function-configuration \
--function-name Test \
--runtime nodejs16.x

コマンドの実行に成功し、レスポンスからもランタイムが Node.js 16.x に変更されていることがわかります。

以上が AWS CLI での変更手順です。

3.CloudFormation

CloudFormation で Lambda を構築している場合もあると思うので、CloudFormation からもランタイムを変更してみます。
CloudFormation の場合は、AWS::Lambda::FunctionRuntime を変更します。

まずは変更前の Node.js 12.x のサンプル関数を、以下のテンプレートで作成します。

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  LambdaFunction:
    Type: "AWS::Lambda::Function"
    Properties:
      FunctionName: "Test"
      Handler: "index.handler"
      Architectures:
        - "x86_64"
      Code:
        ZipFile: |
          exports.handler = async (event) => {
              // TODO implement
              const response = {
                  statusCode: 200,
                  body: JSON.stringify('Hello from Lambda!'),
              };
              return response;
          };
      MemorySize: 128
      Role: !Sub "arn:aws:iam::${AWS::AccountId}:role/makoto-LambdaBasicExecutionRole"
      Runtime: "nodejs12.x"
      Timeout: 3
      TracingConfig:
        Mode: "PassThrough"
      EphemeralStorage:
        Size: 512

CloudFormation での関数作成後、Runtime を nodejs16.x に変更し、スタックを更新します。

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  LambdaFunction:
    Type: "AWS::Lambda::Function"
    Properties:
      FunctionName: "Test"
      Handler: "index.handler"
      Architectures:
        - "x86_64"
      Code:
        ZipFile: |
          exports.handler = async (event) => {
              // TODO implement
              const response = {
                  statusCode: 200,
                  body: JSON.stringify('Hello from Lambda!'),
              };
              return response;
          };
      MemorySize: 128
      Role: !Sub "arn:aws:iam::${AWS::AccountId}:role/makoto-LambdaBasicExecutionRole"
      Runtime: "nodejs16.x" ←ここだけ変更
      Timeout: 3
      TracingConfig:
        Mode: "PassThrough"
      EphemeralStorage:
        Size: 512

既存のテンプレートを置き換えて更新します。

スタックの更新が完了し、ランタイムが変更されていることを Lambda コンソールなどで確認してください。

以上が CloudFormation での変更手順です。

4.AWS SDK for JavaScript

コードでランタイムの変更をすることは少ないかと思いますが、やろうと思えばできるので、参考程度に紹介しておきます。
AWS SDK for JavaScript では、updateFunctionConfiguration を使用します。

今回は別の Lambda から以下のコードで、サンプル関数のランタイムを更新します。

const AWS = require("aws-sdk");
AWS.config.update({ region: "ap-northeast-1" });
AWS.config.apiVersions = {
    lambda: "2015-03-31",
};
const lambda = new AWS.Lambda();

exports.handler = async (event) => {

    const params = {
        FunctionName: "Test",
        Runtime: "nodejs16.x",
    };

    const result = await lambda.updateFunctionConfiguration(params).promise();
    console.log(JSON.stringify(result, null, 2));
    
    return;
};

実行ログは以下の通りです。

{
  "FunctionName": "Test",
  "FunctionArn": "arn:aws:lambda:ap-northeast-1:{account-id}:function:Test",
  "Runtime": "nodejs16.x",
  "Role": "arn:aws:iam::{account-id}:role/makoto-LambdaBasicExecutionRole",
  "Handler": "index.handler",
  "CodeSize": 304,
  "Description": "",
  "Timeout": 3,
  "MemorySize": 128,
  "LastModified": "2022-08-17T07:51:47.000+0000",
  "CodeSha256": "1LbkWTlxbeGxWCDcSB1hyIcv/HzJ6W3w6sibCRvjfAU=",
  "Version": "$LATEST",
  "KMSKeyArn": null,
  "TracingConfig": {
    "Mode": "PassThrough"
  },
  "MasterArn": null,
  "RevisionId": "66f28a04-eeee-4541-9c1c-3e64e6030791",
  "State": "Active",
  "StateReason": null,
  "StateReasonCode": null,
  "LastUpdateStatus": "InProgress",
  "LastUpdateStatusReason": "The function is being created.",
  "LastUpdateStatusReasonCode": "Creating",
  "PackageType": "Zip",
  "SigningProfileVersionArn": null,
  "SigningJobArn": null,
  "Architectures": ["x86_64"]
}

以上が AWS SDK for JavaScript での変更手順です。

5.AWS SDK for Python (Boto3)

AWS SDK for Python (Boto3) では、update_function_configuration を使用します。
AWS SDK for JavaScript のパターン同様、別の Lambda から以下のコードで、サンプル関数のランタイムを更新します。

import json
import boto3

client = boto3.client('lambda')

def lambda_handler(event, context):
   
    response = client.update_function_configuration(
        FunctionName='Test',
        Runtime='nodejs16.x'
    )
    
    print(json.dumps(response))

    return;

実行ログは以下の通りです。

{
  "ResponseMetadata": {
    "RequestId": "89372622-db1a-4238-a629-9bd4a93eb3fd",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Thu, 18 Aug 2022 00:23:44 GMT",
      "content-type": "application/json",
      "content-length": "976",
      "connection": "keep-alive",
      "x-amzn-requestid": "89372622-db1a-4238-a629-9bd4a93eb3fd"
    },
    "RetryAttempts": 0
  },
  "FunctionName": "Test",
  "FunctionArn": "arn:aws:lambda:ap-northeast-1:{account-id}:function:Test",
  "Runtime": "nodejs16.x",
  "Role": "arn:aws:iam::{account-id}:role/makoto-LambdaBasicExecutionRole",
  "Handler": "index.handler",
  "CodeSize": 304,
  "Description": "",
  "Timeout": 3,
  "MemorySize": 128,
  "LastModified": "2022-08-18T00:23:44.000+0000",
  "CodeSha256": "1LbkWTlxbeGxWCDcSB1hyIcv/HzJ6W3w6sibCRvjfAU=",
  "Version": "$LATEST",
  "TracingConfig": {
    "Mode": "PassThrough"
  },
  "RevisionId": "41693e84-63d5-4820-8943-0050f1d75ed7",
  "State": "Active",
  "LastUpdateStatus": "InProgress",
  "LastUpdateStatusReason": "The function is being created.",
  "LastUpdateStatusReasonCode": "Creating",
  "PackageType": "Zip",
  "Architectures": ["x86_64"]
}

以上が AWS SDK for Python (Boto3) での変更手順です。

注意点

Lambda のランタイムを変更する場合には、変更後のランタイムとソースコードの互換性があるか、開発環境などで十分検証してから変更することをお勧めします。

参考資料