[AWS CDK] AWS Lambda L2 Construct で Amazon Linux 2023 ランタイムが指定可能になりました

2023.11.12

こんにちは、CX 事業本部 Delivery 部の若槻です。

先日のアップデートで、 AWS Lambda で Amazon Linux 2023 がサポートされ、OS のみの環境を提供するカスタムランタイムとして利用できるようになりました。これにより今までサポートされていた Amazon Linux 2 に比べて、デプロイメント時間が短縮され、更新されたバージョンの GNU C ライブラリ(glibc)によりセットアップされた環境が利用可能となります。

そして早速 AWS CDK でも、AWS Lambda L2 Construct で Amazon Linux 2023 ランタイムが指定可能になりました。

lambda: new lambda runtime provided.al2023 (#27856) (2717c5a)

試してみた

実際に AWS CDK で Amazon Linux 2023 ランタイムを指定して Lambda 関数を作成してみました。

CDK モジュールのアップデート

AWS CDK のモジュールを v2.106.0 以上にアップグレードします。

npm i aws-cdk@latest aws-cdk-lib@latest

CDK コード

Lambda 関数を作成する CDK コードです。aws-cdk-lib/aws_lambda/Runtime で新しく選択可能になった PROVIDED_AL2023 をランタイムとして指定しています。

lib/cdk-sample-stack.ts

import { aws_lambda, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    new aws_lambda.Function(this, 'HelloHandler', {
      runtime: aws_lambda.Runtime.PROVIDED_AL2023,
      architecture: aws_lambda.Architecture.ARM_64,
      code: aws_lambda.Code.fromAsset('src/lambda'),
      handler: 'hello.handler',
    });
  }
}

ハンドラーコード

ハンドラーのコードです。200 レスポンスを返すだけのシンプルなコードです。

src/lambda/hello.sh

function handler () {
    EVENT_DATA=$1

    RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
    echo $RESPONSE
}

またカスタムランタイムでは、デプロイパッケージ内に bootstrap という名前の実行ファイルを配置する必要があるので、ハンドラーコードと同じパスに合わせて作成します。

src/lambda/bootstrap

#!/bin/sh
set -euo pipefail

# Handler format: <script_name>.<bash_function_name>
#
# The script file <script_name>.sh  must be located at the root of your
# function's deployment package, alongside this bootstrap executable.
source $(dirname "$0")/"$(echo $_HANDLER | cut -d. -f1).sh"

while true
do
    # Request the next event from the Lambda runtime
    HEADERS="$(mktemp)"
    EVENT_DATA=$(curl -v -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
    INVOCATION_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

    # Execute the handler function from the script
    RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")

    # Send the response to Lambda runtime
    curl -v -sS -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$INVOCATION_ID/response" -d "$RESPONSE"
done

ちなみにこれら 2 つのコードは、マネジメントコンソールからカスタムランタイムの関数を作成する際に既定で追加されるファイルと同じコードです。

デプロイ

前述のハンドラーコードをデプロイメントパッケージに含めた Lambda 関数を CDK デプロイして作成します。

cdk deploy

デプロイ後、マネジメントコンソールから作成された Lambda 関数を確認すると、「Amazon Linux 2023」ランタイムで作成されていることが確認できました。

動作確認

Lambda 関数を実行すると、期待したレスポンスを取得でき、ハンドラーのコードが実行されていることが確認できました。

おわりに

AWS CDK で Amazon Linux 2023 ランタイムを指定して Lambda 関数を作成してみました。

カスタムランタイムを使用することにより、Go や Rust などのネイティブコードにコンパイルされる言語や、マネージドランタイムで提供されていないバージョンの言語ランタイムを使用したコードを Lambda 上で実行可能となります。Amazon Linux 2 のサポート期限は 2025 年 6 月 30 日となっているため、もしそのようなコードを Amazon Linux 2 で実行している場合は、Amazon Linux 2023 ランタイムへの移行を早めにご検討ください。

ちなみに Amazon Linux 2023 ランタイムは将来的に導入される Node.js 20 や Python 3.12 などのマネージドランタイムのベース環境としての利用も予定されています。カスタムランタイムに留まらない AWS Lambda のこれからの改善が楽しみですね。

参考

以上